zaas 发表于 2009-8-29 20:54:25

也说最新半仙现代汉语词典追码

看了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文件下一样可以使用。

kcr 发表于 2009-8-30 12:00:25

这篇颇文很详细。

老万 发表于 2009-9-2 06:58:42

写的黑好,学习了。

李原 发表于 2009-9-5 10:42:27

下来学习一下

sounpeng 发表于 2009-10-6 01:42:13

学习ing/:011

chn-2000 发表于 2009-10-6 06:51:45

详细的破文不错!/:014

spacer 发表于 2009-10-8 21:22:50

很详细,拿来学习用,谢谢楼主

yuchan 发表于 2009-10-12 17:36:06

菜鸟要慢慢理解了,呵呵
页: [1]
查看完整版本: 也说最新半仙现代汉语词典追码