也说最新半仙现代汉语词典追码
看了jinbiao911写的【最新半仙 现代汉语词典 破解过程】https://www.chinapyg.com/viewthread.php?tid=49631&extra=page%3D1一文,对这个软件有点兴趣,装上看看。
高手行文天马行空,来龙去脉没怎么交代,初学者看来还是摸不着头脑。
试了jinbiao911给出的注册码,注册失败,只好自己跟跟看。
Peid一查,ASPack 2.12 -> Alexey Solodovnikov
第一步自然是脱壳了。
OD载入直接停在
00628001 hy>60 pushad
根据ESP定律,
下断点在0013FFC0
F9进去,停在
006283B0 /75 08 jnz short hycd.006283BA
006283B2 |B8 01000000 mov eax,1
006283B7 |C2 0C00 retn 0C
006283BA \68 20BC5200 push hycd.0052BC20
006283BF C3 retn
OEP在
0052BC20 55 push ebp
右键Dump下来,修复一下就搞定了。
OP载入脱了壳的文件dump_.exe。搜索字符串
有:“注册失败,请重试,重试失败请直接与作者联系”
双击进去到了
00527228 B8 24735200 mov eax,dump_.00527324
-----------------------------------------------------------------------
00527156 E8 8DDAEDFF call dump_.00404BE8
0052715B 0F85 C7000000 jnz dump_.00527228
00527161 A1 BCFA5200 mov eax,dword ptr ds:
00527166 8B00 mov eax,dword ptr ds:
00527168 8B80 A0030000 mov eax,dword ptr ds:
0052716E 33D2 xor edx,edx
00527170 E8 0FECF1FF call dump_.00445D84
00527175 A1 BCFA5200 mov eax,dword ptr ds:
0052717A 8B00 mov eax,dword ptr ds:
0052717C 8B80 9C030000 mov eax,dword ptr ds:
00527182 B2 01 mov dl,1
00527184 E8 FBEBF1FF call dump_.00445D84
00527189 8D55 DC lea edx,dword ptr ss:
0052718C 8B83 04030000 mov eax,dword ptr ds:
00527192 E8 CDECF1FF call dump_.00445E64
00527197 8B4D DC mov ecx,dword ptr ss:
0052719A BA F4725200 mov edx,dump_.005272F4 ; ASCII "yhdsger"
0052719F 8BC6 mov eax,esi
005271A1 E8 6279F4FF call dump_.0046EB08
005271A6 8D55 D4 lea edx,dword ptr ss:
005271A9 A1 0CF95200 mov eax,dword ptr ds:
005271AE 8B00 mov eax,dword ptr ds:
005271B0 E8 1304F4FF call dump_.004675C8
005271B5 8B45 D4 mov eax,dword ptr ss:
005271B8 8D55 D8 lea edx,dword ptr ss:
005271BB E8 6024EEFF call dump_.00409620
005271C0 8D45 D8 lea eax,dword ptr ss:
005271C3 BA 04735200 mov edx,dump_.00527304 ; ASCII "cf.dll"
005271C8 E8 DFD8EDFF call dump_.00404AAC
005271CD 8B45 D8 mov eax,dword ptr ss:
005271D0 E8 A323EEFF call dump_.00409578
005271D5 3C 01 cmp al,1
005271D7 75 2F jnz short dump_.00527208
005271D9 8D55 CC lea edx,dword ptr ss:
005271DC A1 0CF95200 mov eax,dword ptr ds:
005271E1 8B00 mov eax,dword ptr ds:
005271E3 E8 E003F4FF call dump_.004675C8
005271E8 8B45 CC mov eax,dword ptr ss:
005271EB 8D55 D0 lea edx,dword ptr ss:
005271EE E8 2D24EEFF call dump_.00409620
005271F3 8D45 D0 lea eax,dword ptr ss:
005271F6 BA 04735200 mov edx,dump_.00527304 ; ASCII "cf.dll"
005271FB E8 ACD8EDFF call dump_.00404AAC
00527200 8B45 D0 mov eax,dword ptr ss:
00527203 E8 8023EEFF call dump_.00409588
00527208 A1 BCFA5200 mov eax,dword ptr ds:
0052720D 8B00 mov eax,dword ptr ds:
0052720F 8B80 34030000 mov eax,dword ptr ds:
00527215 BA 14735200 mov edx,dump_.00527314
0052721A E8 75ECF1FF call dump_.00445E94
0052721F 8BC3 mov eax,ebx
00527221 E8 8EC6F3FF call dump_.004638B4
00527226 EB 24 jmp short dump_.0052724C
00527228 B8 24735200 mov eax,dump_.00527324
0052722D E8 DA7AF1FF call dump_.0043ED0C;注册失败call
-----------------------------------------------------------------------------------
向上分析马上就知道关键跳在:
0052715B 0F85 C7000000 jnz dump_.00527228
在它上面的call下断,重新载入dump_.exe。
寄存器窗口的EDX写着一串字符串。经验证,这就是注册码。
随后试了试跟注册码算法。发现上边几个call 全部是用来变换注册码的,非常繁琐。
比如:
。。。。。。
004031AD 46 inc esi
004031AE 80FB 20 cmp bl,20 ; 判断前边是不是输入空格了,如果有空格接着读下一个字符
004031B1 ^ 74 F8 je short dump_.004031AB
004031B3 B5 00 mov ch,0
004031B5 80FB 2D cmp bl,2D ; 是“-”吗?
004031B8 74 62 je short dump_.0040321C
004031BA 80FB 2B cmp bl,2B ; 是“+”吗?
004031BD 74 5F je short dump_.0040321E
004031BF 80FB 24 cmp bl,24 ; 是“$”吗?
004031C2 74 5F je short dump_.00403223
004031C4 80FB 78 cmp bl,78 ; 是“x”吗
004031C7 74 5A je short dump_.00403223
004031C9 80FB 58 cmp bl,58 ; 是“X”吗
004031CC 74 55 je short dump_.00403223
004031CE 80FB 30 cmp bl,30 ; 是“0”吗?
004031D1 75 13 jnz short dump_.004031E6 ; 不是0则跳
004031D3 8A1E mov bl,byte ptr ds: ; 是0则读下一个数字
004031D5 46 inc esi
004031D6 80FB 78 cmp bl,78 ; 又比较一番
004031D9 74 48 je short dump_.00403223
004031DB 80FB 58 cmp bl,58
004031DE 74 43 je short dump_.00403223
004031E0 84DB test bl,bl
004031E2 74 20 je short dump_.00403204
004031E4 EB 04 jmp short dump_.004031EA
004031E6 84DB test bl,bl
004031E8 74 2D je short dump_.00403217
004031EA 80EB 30 sub bl,30 ; 减去30
004031ED 80FB 09 cmp bl,9 ; 跟9比较
004031F0 77 25 ja short dump_.00403217 ; 判断大于39吗?也就是判断是不是数字
004031F2 39F8 cmp eax,edi
004031F4 77 21 ja short dump_.00403217
004031F6 8D0480 lea eax,dword ptr ds: ; EAX是关键
004031F9 01C0 add eax,eax
004031FB 01D8 add eax,ebx ; ebx:(31 到39)-30
004031FD 8A1E mov bl,byte ptr ds: ; 下一个字符
004031FF 46 inc esi
00403200 84DB test bl,bl ; 读完跳出,没读完退回
。。。。。
输入序列号的时候除了数字其他的都不能输入,也不能copy&paste,这会儿却还要比来比去的校验数字,而Eax的变换才是计算注册码的第一步。软件编写的太不简练,可读性也比较差。不胜其烦不跟了。直接做了内存注册机了事。
试了下,本注册机在未脱壳的原版exe文件下一样可以使用。 这篇颇文很详细。 写的黑好,学习了。 下来学习一下 学习ing/:011 详细的破文不错!/:014 很详细,拿来学习用,谢谢楼主 菜鸟要慢慢理解了,呵呵
页:
[1]