• 标 题:教师节了,祝所有教师快乐! 献上中华拼读王v3.22注册分析 (5千字)
  • 作 者:lzqgj
  • 时 间:2003-09-10 21:23:06
  • 链 接:http://bbs.pediy.com

一个语文教师的好帮手,可以在word中快速输入拼音。
程序语言:VB6
破解工具:OLLYDBG
适合于初学者

程序注册与重启判断采用同一代码。
00420493  MOV DWORD PTR DS:[EDX+4],ECX
00420496  PUSH zhpdw.0040DF0C       UNICODE "regnumber"
0042049B  MOV DWORD PTR DS:[EDX+8],EAX
0042049E  MOV DWORD PTR SS:[EBP-1B0],EAX
004204A4  MOV EAX,DWORD PTR SS:[EBP-1AC]
004204AA  PUSH zhpdw.0040DEF8       UNICODE "regist"
004204AF  PUSH zhpdw.0040CEBC       UNICODE "pyzh"
004204B4  MOV DWORD PTR DS:[EDX+C],EAX
004204B7  CALL msvbvm60.rtcGetSetting   --->输入码
004204BD  MOV EDX,EAX
004204BF  LEA ECX,DWORD PTR SS:[EBP-2C]
004204C2  CALL msvbvm60.__vbaStrMove
004204C8  MOV EDX,EAX
004204CA  MOV ECX,ESI
004204CC  CALL msvbvm60.__vbaStrCopy
004204D2  LEA ECX,DWORD PTR SS:[EBP-2C]
004204D5  CALL msvbvm60.__vbaFreeStr
004204DB  MOV ECX,DWORD PTR DS:[ESI]
004204DD  PUSH 1
004204DF  PUSH -1
004204E1  PUSH 1
004204E3  PUSH zhpdw.0040C90C         --->替换后的字符,空值
004204E8  PUSH zhpdw.0040DF90         --->需替换的字符,"-"
004204ED  PUSH ECX                    --->输入码
004204EE  CALL msvbvm60.rtcReplace    --->替换字符,将"-"替换为空值,即去掉"-"
004204F4  MOV EDX,EAX
004204F6  LEA ECX,DWORD PTR SS:[EBP-28]   --->替换后输入码
004204F9  CALL msvbvm60.__vbaStrMove
004204FF  MOV EDX,DWORD PTR SS:[EBP-28]
00420502  MOV EAX,DWORD PTR DS:[ESI]
00420504  PUSH EDX                    --->替换后的输入码
00420505  PUSH EAX                    --->替换前的输入码
00420506  CALL EBX                    --->__vbstrcomp,比较是否相等,即是否含"-"
00420508  MOV ECX,DWORD PTR SS:[EBP-28]  
0042050B  MOV ESI,msvbvm60.__vbaLenBstr
00420511  MOV EBX,EAX                 --->比较结果
00420513  NEG EBX                     --->取反,相等则错误,故必须含"-"
00420515  SBB EBX,EBX
00420517  PUSH ECX                    
00420518  INC EBX
00420519  CALL msvbvm60.__vbaLenBstr  --->读替换后输入码长度
0042051B  XOR EDX,EDX
0042051D  CMP EAX,8                   --->与8比较
00420520  SETLE DL                    --->大于等于8则置DL为0
00420523  OR EBX,EDX                  --->EBX与EDX是否等于0
00420525  JNZ zhpdw.004206F6          --->任意一个不等于0则错,故必须含"-",且去掉"-"后长度大于等于8
0042052B  MOV EAX,DWORD PTR SS:[EBP-28]
0042052E  PUSH EAX
0042052F  CALL ESI
00420531  MOV ECX,DWORD PTR SS:[EBP+8]
00420534  MOV EBX,msvbvm60.__vbaVarTstEq
0042053A  MOV DWORD PTR SS:[EBP-268],EAX
00420540  MOV DWORD PTR DS:[ECX+44],1
00420547  MOV EDX,DWORD PTR SS:[EBP+8]        --->以下为循环判断注册码
0042054A  MOV EAX,DWORD PTR DS:[EDX+44]
0042054D  CMP EAX,DWORD PTR SS:[EBP-268]
00420553  JG zhpdw.004206F6
00420559  LEA EDX,DWORD PTR SS:[EBP-58]
0042055C  PUSH EDX
0042055D  PUSH EAX
0042055E  LEA ECX,DWORD PTR SS:[EBP-28]
00420561  LEA EAX,DWORD PTR SS:[EBP-1B8]
00420567  MOV DWORD PTR SS:[EBP-1B0],ECX
0042056D  PUSH EAX
0042056E  LEA ECX,DWORD PTR SS:[EBP-68]
00420571  PUSH ECX
00420572  MOV DWORD PTR SS:[EBP-50],8
00420579  MOV DWORD PTR SS:[EBP-58],2
00420580  MOV DWORD PTR SS:[EBP-1B8],4008
0042058A  CALL msvbvm60.rtcMidCharVar       --->取中间字符,每次8位
00420590  LEA EDX,DWORD PTR SS:[EBP-68]
00420593  PUSH EDX
00420594  LEA EAX,DWORD PTR SS:[EBP-2C]
00420597  PUSH EAX
00420598  CALL msvbvm60.__vbaStrVarVal      --->取出字符转为串
0042059E  PUSH EAX                          --->取出的字符串
0042059F  CALL msvbvm60.rtcR8ValFromBstr    --->转为浮点值
004205A5  FSUB QWORD PTR DS:[4016C0]        --->减[4016C0]的值,我这里是8074191
004205AB  LEA ECX,DWORD PTR SS:[EBP-78]
004205AE  PUSH ECX
004205AF  FSTP QWORD PTR SS:[EBP-70]        --->保存结果
004205B2  FSTSW AX
004205B4  TEST AL,0D
004205B6  JNZ zhpdw.00420DD3
004205BC  LEA EDX,DWORD PTR SS:[EBP-88]
004205C2  PUSH EDX
004205C3  MOV DWORD PTR SS:[EBP-78],5
004205CA  CALL msvbvm60.rtcHexVarFromVar    --->结果转为十六进制
004205D0  SUB ESP,10
004205D3  MOV EDX,ESP
004205D5  MOV ECX,0A
004205DA  MOV DWORD PTR DS:[EDX],ECX
004205DC  MOV DWORD PTR SS:[EBP-1E8],ECX
004205E2  MOV ECX,DWORD PTR SS:[EBP-1E4]
004205E8  MOV EAX,80020004
004205ED  MOV DWORD PTR DS:[EDX+4],ECX
004205F0  PUSH zhpdw.0040CFA8          UNICODE "fontcolor"
004205F5  MOV DWORD PTR DS:[EDX+8],EAX
004205F8  MOV DWORD PTR SS:[EBP-1E0],EAX
004205FE  MOV EAX,DWORD PTR SS:[EBP-1DC]
00420604  PUSH zhpdw.0040CECC          UNICODE "setting"
00420609  PUSH zhpdw.0040CEBC          UNICODE "pyzh"
0042060E  MOV DWORD PTR DS:[EDX+C],EAX
00420611  CALL msvbvm60.rtcGetSetting     --->读注册表信息,本机码,
                                             我这里是131A5C3,即20030915,感觉是时间限制
00420617  LEA ECX,DWORD PTR SS:[EBP-88]
0042061D  PUSH ECX
0042061E  LEA EDX,DWORD PTR SS:[EBP-98]
00420624  PUSH EDX
00420625  MOV DWORD PTR SS:[EBP-90],EAX
0042062B  MOV DWORD PTR SS:[EBP-98],8008
00420635  CALL EBX         --->__vbavartsteq,比较本机码与计算后的输入码是否相等。
00420637  LEA ECX,DWORD PTR SS:[EBP-2C]
0042063A  MOV SI,AX
0042063D  CALL msvbvm60.__vbaFreeStr
00420643  LEA EAX,DWORD PTR SS:[EBP-98]
00420649  PUSH EAX
0042064A  LEA ECX,DWORD PTR SS:[EBP-88]
00420650  PUSH ECX
00420651  LEA EDX,DWORD PTR SS:[EBP-78]
00420654  PUSH EDX
00420655  LEA EAX,DWORD PTR SS:[EBP-68]
00420658  PUSH EAX
00420659  LEA ECX,DWORD PTR SS:[EBP-58]
0042065C  PUSH ECX
0042065D  PUSH 5
0042065F  CALL msvbvm60.__vbaFreeVarList
00420665  ADD ESP,18
00420668  CMP SI,DI
0042066B  JE SHORT zhpdw.004206DB      --->相等则成功

以下略,从第一位开始,每次取8位字符进行计算并比较,经过数次循环结束。

小结:注册码形式为任意XXXX-XXXXXXXX,长度没有限制,"-"前为注册姓名,"-"后为要比较的注册码,正确结果为8074191+20030915=281051060
我用QGJ-281051060

前段时间跟了几个程序都未果,虽然可以显示为注册成功,但功能依然有限制,又找不到地方,感觉破解越来越难了。突然看到这么简单的程序,简直不敢相信自己的眼睛。希望程序没有其它的限制吧。
希望论坛能多出些详细的破文,让我等菜鸟多学习学习。