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,即为注册码。
简单算法,计算器,即可完成。
…………………………………………………………………………………………………………………………
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!