VB的简单算法——图章制作专家 V4.89的注册算法分析
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 图章制作专家 V4.89
【软件地址】 http://sxhsoft.nease.net/
【编写语言】 VB
说明:上次在网上查找图章制作系统时,看到了它,以为是图章制作系统的升级版本,不同,
功能上比图章制作系统好多了,更细化。
VB程序,用常用断点:__vbaVarTstEq,来到关键点:
………………………………………………………………………………………………
005CA690    > >push ebp
005CA691    . >mov ebp,esp
005CA693    . >sub esp,0C
005CA696    . >push <jmp.&MSVBVM60.__vbaExceptHandler>         ;  入口地址; SE 句柄安装
005CA69B    . >mov eax,dword ptr fs:[0]
005CA6A1    . >push eax
005CA6A2    . >mov dword ptr fs:[0],esp
005CA6A9    . >sub esp,0C0
005CA6AF    . >push ebx
005CA6B0    . >push esi
005CA6B1    . >push edi
005CA6B2    . >mov dword ptr ss:[ebp-C],esp
005CA6B5    . >mov dword ptr ss:[ebp-8],图章制作.00408550
005CA6BC    . >xor ebx,ebx
005CA6BE    . >mov dword ptr ss:[ebp-4],ebx
005CA6C1    . >mov edi,dword ptr ss:[ebp+8]
005CA6C4    . >push edi
005CA6C5    . >mov eax,dword ptr ds:[edi]
005CA6C7    . >call dword ptr ds:[eax+4]
005CA6CA    . >mov ecx,dword ptr ds:[edi]
005CA6CC    . >push edi
005CA6CD    . >mov dword ptr ss:[ebp-18],ebx
005CA6D0    . >mov dword ptr ss:[ebp-1C],ebx
005CA6D3    . >mov dword ptr ss:[ebp-20],ebx
005CA6D6    . >mov dword ptr ss:[ebp-24],ebx
005CA6D9    . >mov dword ptr ss:[ebp-28],ebx
005CA6DC    . >mov dword ptr ss:[ebp-2C],ebx
005CA6DF    . >mov dword ptr ss:[ebp-30],ebx
005CA6E2    . >mov dword ptr ss:[ebp-34],ebx
005CA6E5    . >mov dword ptr ss:[ebp-44],ebx
005CA6E8    . >mov dword ptr ss:[ebp-54],ebx
005CA6EB    . >mov dword ptr ss:[ebp-64],ebx
005CA6EE    . >mov dword ptr ss:[ebp-74],ebx
005CA6F1    . >mov dword ptr ss:[ebp-84],ebx
005CA6F7    . >mov dword ptr ss:[ebp-94],ebx
005CA6FD    . >mov dword ptr ss:[ebp-A4],ebx
005CA703    . >mov dword ptr ss:[ebp-B4],ebx
005CA709    . >call dword ptr ds:[ecx+B9C]
005CA70F    . >mov eax,dword ptr ds:[98B1CC]
005CA714    . >cmp eax,ebx
005CA716    . >jnz short 图章制作.005CA72D
005CA718    . >push 图章制作.0098B1CC
005CA71D    . >push 图章制作.0042CBA0
005CA722    . >call dword ptr ds:[<&MSVBVM60.__vbaNew2>]       ;  MSVBVM60.__vbaNew2
005CA728    . >mov eax,dword ptr ds:[98B1CC]
005CA72D    > >mov edx,dword ptr ds:[eax]
005CA72F    . >push eax
005CA730    . >call dword ptr ds:[edx+338]
005CA736    . >push eax
005CA737    . >lea eax,dword ptr ss:[ebp-30]
005CA73A    . >push eax
005CA73B    . >call dword ptr ds:[<&MSVBVM60.__vbaObjSet>]     ;  MSVBVM60.__vbaObjSet
005CA741    . >mov esi,eax
005CA743    . >lea edx,dword ptr ss:[ebp-24]
005CA746    . >push edx
005CA747    . >push esi
005CA748    . >mov ecx,dword ptr ds:[esi]
005CA74A    . >call dword ptr ds:[ecx+A0]
005CA750    . >cmp eax,ebx
005CA752    . >fclex
005CA754    . >jge short 图章制作.005CA768
005CA756    . >push 0A0
005CA75B    . >push 图章制作.0044BF90
005CA760    . >push esi
005CA761    . >push eax
005CA762    . >call dword ptr ds:[<&MSVBVM60.__vbaHresultCheck>;  MSVBVM60.__vbaHresultCheckObj
005CA768    > >mov eax,dword ptr ss:[ebp-24]                   ;  得到输入码
005CA76B    . >push eax
005CA76C    . >call dword ptr ds:[<&MSVBVM60.#521>]            ;  MSVBVM60.rtcLeftTrimBstr
005CA772    . >mov esi,dword ptr ds:[<&MSVBVM60.__vbaStrMove>] ;  MSVBVM60.__vbaStrMove
005CA778    . >mov edx,eax
005CA77A    . >lea ecx,dword ptr ss:[ebp-28]
005CA77D    . >call esi                                        ;  <&MSVBVM60.__vbaStrMove>
005CA77F    . >push eax
005CA780    . >call dword ptr ds:[<&MSVBVM60.#523>]            ;  MSVBVM60.rtcRightTrimBstr
005CA786    . >mov edx,eax
005CA788    . >lea ecx,dword ptr ss:[ebp-2C]
005CA78B    . >call esi                                        ;  <&MSVBVM60.__vbaStrMove>
005CA78D    . >push eax
005CA78E    . >call dword ptr ds:[<&MSVBVM60.#581>]            ;  把输入码变成实数!
005CA794    . >fstp qword ptr ss:[ebp-AC]                      ;  储存用于后面比较
005CA79A    . >mov dword ptr ss:[ebp-B4],8005
005CA7A4    . >call 图章制作.00521CF0                          ;  只是得到机器吗的前5位变成实数形式,并转化为16进制数据
…………………………………………………………………………………………………………………………
进入005CA7A4    . >call 图章制作.00521CF0
…………………………………………………………………………………………………………………………
00522253    . >call dword ptr ds:[<&MSVBVM60.__vba>;  得到部分机器码-前5位机器码
00522259    . >push eax
0052225A    . >call dword ptr ds:[<&MSVBVM60.#581>>;  把得到的机器码转化为实数
00522260    . >call dword ptr ds:[<&MSVBVM60.__vba>;  并把实数转化为16进制数据放在EAX中
00522266    . >mov dword ptr ss:[ebp-24],eax       ;  把机器吗的前5位的16进制数
00522269    . >lea ecx,dword ptr ss:[ebp-38]
0052226C    . >call dword ptr ds:[<&MSVBVM60.__vba>;  MSVBVM60.__vbaFreeStr
00522272    . >lea edx,dword ptr ss:[ebp-68]
00522275    . >push edx
00522276    . >lea eax,dword ptr ss:[ebp-58]
00522279    . >push eax
0052227A    . >push 2
………………………………………………………………………………………………………………………
005CA7A9    . >mov ebx,3
005CA7AE    . >mov dword ptr ss:[ebp-7C],eax                   ;  得到的结果储存
005CA7B1    . >mov dword ptr ss:[ebp-84],ebx
005CA7B7    . >call 图章制作.00823300                          ;  又得到机器吗的第6,7两位以16进制出现
………………………………………………………………………………………………………………
进入005CA7B7    . >call 图章制作.00823300:
……………………………………………………………………………………
008233F9    . >jnz short 图章制作.0082340D
008233FB    . >mov edi,dword ptr ds:[<&MSVBVM60.__>;  MSVBVM60.__vbaStrCopy
00823401    . >mov edx,图章制作.0044F248
00823406    . >lea ecx,dword ptr ss:[ebp-18]
00823409    . >call edi                            ;  <&MSVBVM60.__vbaStrCopy>
0082340B    . >jmp short 图章制作.00823413
0082340D    > >mov edi,dword ptr ds:[<&MSVBVM60.__>;  MSVBVM60.__vbaStrCopy
00823413    > >call 图章制作.00827BB0
00823418    . >mov eax,dword ptr ss:[ebp-14]
0082341B    . >mov ecx,dword ptr ss:[ebp-18]
0082341E    . >push eax
0082341F    . >push ecx
00823420    . >call dword ptr ds:[<&MSVBVM60.__vba>;  组合了成为机器码的第6,7位字符形式
00823426    . >mov edx,eax
00823428    . >lea ecx,dword ptr ss:[ebp-20]
0082342B    . >call esi
0082342D    . >push eax
0082342E    . >call dword ptr ds:[<&MSVBVM60.#581>>;  将机器码的字符形式转化为实数形式
00823434    . >call dword ptr ds:[<&MSVBVM60.__vba>;  再将实数转化为十六进制的2B
0082343A    . >lea ecx,dword ptr ss:[ebp-20]
0082343D    . >mov dword ptr ss:[ebp-1C],eax
00823440    . >call dword ptr ds:[<&MSVBVM60.__vba>;  MSVBVM60.__vbaFreeStr
00823446    . >mov edx,图章制作.0044BA00
0082344B    . >lea ecx,dword ptr ss:[ebp-14]
0082344E    . >call edi
……………………………………………………………………………………………………………………
005CA7BC    . >mov dword ptr ss:[ebp-8C],eax                   ;  得到的结果储存
005CA7C2    . >mov dword ptr ss:[ebp-94],ebx
005CA7C8    . >call 图章制作.00820170                         ;  又得到机器吗的前6,7,8,9,10位加上固定制200518198
………………………………………………………………………………………………………………
进入005CA7C8    . >call 图章制作.00820170
………………………………………………………………………………


00820176    . >push <jmp.&MSVBVM60.__vbaExceptHand>;  入口地址; SE 句柄安装
0082017B    . >mov eax,dword ptr fs:[0]
00820181    . >push eax
00820182    . >mov dword ptr fs:[0],esp
00820189    . >sub esp,48
0082018C    . >push ebx
0082018D    . >push esi
0082018E    . >push edi
0082018F    . >mov dword ptr ss:[ebp-8],esp
00820192    . >mov dword ptr ss:[ebp-4],图章制作.0041B>
00820199    . >xor eax,eax
0082019B    . >mov dword ptr ss:[ebp-18],eax
0082019E    . >mov dword ptr ss:[ebp-28],eax
008201A1    . >mov dword ptr ss:[ebp-38],eax
008201A4    . >call 图章制作.00827BB0
008201A9    . >call 图章制作.00821C40                  ;  用于得到固定值200518198的16进制数
008201AE    . >mov dword ptr ss:[ebp-4C],eax
008201B1    . >lea eax,dword ptr ss:[ebp-28]
008201B4    . >push eax
008201B5    . >push 6
008201B7    . >lea ecx,dword ptr ss:[ebp-38]
008201BA    . >push 图章制作.0098B200
008201BF    . >push ecx
008201C0    . >mov dword ptr ss:[ebp-20],5
008201C7    . >mov dword ptr ss:[ebp-28],2
008201CE    . >call dword ptr ds:[<&MSVBVM60.#632>>;  MSVBVM60.rtcMidCharVar
008201D4    . >lea edx,dword ptr ss:[ebp-38]
008201D7    . >lea eax,dword ptr ss:[ebp-18]
008201DA    . >push edx
008201DB    . >push eax
008201DC    . >call dword ptr ds:[<&MSVBVM60.__vba>;  又得到机器吗的前6,7,8,9,10位,字符形式
008201E2    . >push eax
008201E3    . >call dword ptr ds:[<&MSVBVM60.#581>>;  将得到的6-10位机器吗的字符形式转化位实数
008201E9    . >fild dword ptr ss:[ebp-4C]          ;  装入固定值200518198(16进制)
008201EC    . >fstp qword ptr ss:[ebp-58]          ;  储存
008201EF    . >fadd qword ptr ss:[ebp-58]          ;  用机器吗的前6,7,8,9,10位加上200518198
008201F2    . >fstsw ax
008201F4    . >test al,0D
008201F6    . >jnz short 图章制作.00820257
008201F8    . >call dword ptr ds:[<&MSVBVM60.__vba>;  转化为16进制放于EAX中
008201FE    . >lea ecx,dword ptr ss:[ebp-18]
00820201    . >mov dword ptr ss:[ebp-14],eax
00820204    . >call dword ptr ds:[<&MSVBVM60.__vba>;  MSVBVM60.__vbaFreeStr
0082020A    . >lea ecx,dword ptr ss:[ebp-38]
0082020D    . >lea edx,dword ptr ss:[ebp-28]
00820210    . >push ecx
00820211    . >push edx
………………………………………………………………………………………………………………

005CA7CD    . >lea ecx,dword ptr ss:[ebp-B4]
005CA7D3    . >mov dword ptr ss:[ebp-9C],eax                   ;  得到的结果储存(16进制)
005CA7D9    . >push ecx
005CA7DA    . >lea edx,dword ptr ss:[ebp-84]
005CA7E0    . >push 图章制作.0098B200
005CA7E5    . >lea eax,dword ptr ss:[ebp-44]
005CA7E8    . >mov dword ptr ss:[ebp-A4],ebx
005CA7EE    . >mov ebx,dword ptr ds:[<&MSVBVM60.__vbaVarAdd>]  ;  MSVBVM60.__vbaVarAdd
005CA7F4    . >push edx
005CA7F5    . >push eax
005CA7F6    . >call ebx                                        ;  装入机器吗的前5位 以实数形式 加上 机器吗的前10位实数形式3333077192; <&MSVBVM60.__vbaVarAdd>
…………………………………………………………………………
进入005CA7F6    . >call ebx:
770F23AA     D>fild dword ptr ds:[esi+8]                       ; 装入前5位(16进制)
770F23AD     D>fstp qword ptr ss:[esp+28]                      ; 储存
770F23B1     E>jmp short OLEAUT32.770F2419
77165FEC     D>fld qword ptr ss:[ebp-28]                       ; 装入前10位
77165FEF     D>fadd qword ptr ss:[ebp-40]                      ; 加上前5位
77165FF2     D>fstp qword ptr ss:[ebp-60]
77165FF5     E>jmp OLEAUT32.7716616F
………………………………………………………………………………

005CA7F8    . >lea ecx,dword ptr ss:[ebp-94]
005CA7FE    . >push eax
005CA7FF    . >lea edx,dword ptr ss:[ebp-54]
005CA802    . >push ecx
005CA803    . >push edx
005CA804    . >call dword ptr ds:[<&MSVBVM60.__vbaVarMul>]     ;  第6,7位实数的16进制乘以前面相加的结果
……………………………………………………………………………………
进入005CA804    . >call dword ptr ds:[<&MSVBVM60.__vbaVarMul>]
77167B28   |. >fild dword ptr ds:[edx+8]
77167B2B   |. >mov eax,dword ptr ss:[ebp+8]
77167B2E   |. >fmul qword ptr ds:[eax+8]                       ;  相乘,
77167B31   |. >fstp qword ptr ss:[ebp-50]                      ;  结果储存

………………………………………………………………………………………………………………
005CA80A    . >push eax
005CA80B    . >lea eax,dword ptr ss:[ebp-A4]
005CA811    . >lea ecx,dword ptr ss:[ebp-64]
005CA814    . >push eax
005CA815    . >push ecx
005CA816    . >call ebx                                        ;  上面由固定制200518198计算出来的200562060加上刚才相乘得到的值是最后的注册吗; <&MSVBVM60.__vbaVarAdd>
………………………………………………………………………………
进入:
771660BA   |. >fild dword ptr ds:[ecx+8]                       ;  装入由固定值,加上机器码6-10位而转化来的值
771660BD   |. >mov edx,dword ptr ss:[ebp+8]
771660C0   |. >fadd qword ptr ds:[edx+8]                       ;  上面的值加上刚才相乘的结果这个就是最终的注册码
……………………………………………………………………………………………………………………

005CA818    . >push eax
005CA819    . >call dword ptr ds:[<&MSVBVM60.__vbaVarTstEq>]   ;  最后得到的值与输入码比较
…………………………………………………………………………………………………………
进入005CA819    . >call dword ptr ds:[<&MSVBVM60.__vbaVarTstEq>]

7716B4E1   |. >fld qword ptr ds:[edx+8]                        ;  装入我的输入码
7716B4E4   |. >mov eax,dword ptr ss:[ebp+C]
7716B4E7   |. >fld qword ptr ds:[eax+8]                        ;  装入计算出来的注册码
7716B4EA   |. >fcompp                                          ;  比较了!
7716B4EC   |. >fstsw ax
7716B4EE   |. >test ah,41
…………………………………………………………………………………………………………………………
005CA81F    . >mov ebx,eax
005CA821    . >lea edx,dword ptr ss:[ebp-2C]
005CA824    . >lea eax,dword ptr ss:[ebp-28]
005CA827    . >push edx
005CA828    . >lea ecx,dword ptr ss:[ebp-24]
005CA82B    . >push eax
005CA82C    . >push ecx

……………………………………………………………………………………………………………………

算法总结:
机器码都以实数形式计算,先:机器码的前6,7,8,9,10位加上固定制200518198作为结果A,
前5位  加上 机器吗的前10位实数形式结果为B
结果B再乘以机器码的第6,7位结果为C
结果C再加上上面的结果A,即为注册码。

简单算法,计算器,即可完成。

…………………………………………………………………………………………………………………………