• 标 题:轻松提取资源1.45破解心得 (7千字)
  • 作 者:simonyan
  • 时 间:2002-5-29 20:58:43
  • 链 接:http://bbs.pediy.com

轻松提取资源1.45破解教程
Cracked by simonyan

这个软件有几个陷阱, 其实算法都是一致, 但在跟的时候, 可能会误入陷阱, 花费多一点时间.
在下写得不对之处, 欢迎大家指正.

一: 首先打开软件, 先填入注册码 (19191919), 注册名(simonyan). 点选OK后, 会出现要求重启动软件.
    在这里你也可以跟一下, 看他怎样处理的注册码, 注册名.
    我跟踪了以后, 发现他运算出四个值, 分别为REGCODE, (=假码每位加2). SEARCHID1(=假码每位加1再反转)
SEARCHID2=(假码每位加3再反转) , SEARCHID3=(假码每位加5再反转)
  再将注册名, 及以上值存入注册表.

二: 关闭软件后, 加载SOFTICE, 下断点bpx regqueryvalueexa do “d *(esp+8)”
  因我们已知道注册码存入注册表, 就先用注册表断点吧!!
  启动程序后, 断下, 按F12到45B019停. 这时显示的值并不是与我们要的值有关, 继续按F5, 这时在数据窗口出现
regusername字样, 再按F12到程序领空.
    这时停在40b03c, 按F10走到40b045时, D ECX可看见注册名 “simonyan”, ECX的值为11c7ac8.
  这时我们可下断点bpm 11c7ac8.

三: 这时按F5走, 可看见SEARCHID1, 再按F5两次可看见下面一段算法. 再将算出的值, 与SEARCHID1比较.
相等则将一个全局变量给值1.
    如一直按F5则可看现SEARCHID2, SEARCHID3, REGCODE与算法结果比较。但最后又将全局变量值改为0
  表明这些都是陷阱。

四: 我们可一直跟到出现程序菜单后, 到以下位置:
  出现最后一次比较:
* Possible StringData Ref from Data Obj ->"EZ Extract Resource 1.45"
                                  |
:0040CD9E 68C4FC4700              push 0047FCC4
:0040CDA3 E860680300              call 00443608
:0040CDA8 51                      push ecx
:0040CDA9 8D542418                lea edx, dword ptr [esp+18]
:0040CDAD 8BCC                    mov ecx, esp
:0040CDAF 8964242C                mov dword ptr [esp+2C], esp
:0040CDB3 52                      push edx
:0040CDB4 E8D66A0300              call 0044388F
:0040CDB9 51                      push ecx
:0040CDBA C68424CC01000010        mov byte ptr [esp+000001CC], 10
:0040CDC2 8BCC                    mov ecx, esp
:0040CDC4 89642418                mov dword ptr [esp+18], esp
:0040CDC8 57                      push edi
:0040CDC9 E8C16A0300              call 0044388F
:0040CDCE 8BCE                    mov ecx, esi
:0040CDD0 C68424CC0100000F        mov byte ptr [esp+000001CC], 0F
:0040CDD8 E893070000              call 0040D570      (关键CALL)

* Possible StringData Ref from Data Obj ->"help.chm"
                                  |
:0040CDDD 68B8FC4700              push 0047FCB8
:0040CDE2 8986D0000000            mov dword ptr [esi+000000D0], eax  (赋全局变量值)
:0040CDE8 E82C080200              call 0042D619
:0040CDED 83C404                  add esp, 00000004
:0040CDF0 8BCE                    mov ecx, esi
:0040CDF2 89868C000000            mov dword ptr [esi+0000008C], eax
:0040CDF8 E863030000              call 0040D160
:0040CDFD 8BB654020000            mov esi, dword ptr [esi+00000254]


  五: 现在我们可以跟入CALL中分析算法: (如下)
算法部分:

* Referenced by a CALL at Addresses:
|:0040CAF7  , :0040CB6E  , :0040CBE5  , :0040CC63  , :0040CDD8 
|
:0040D570 6AFF                    push FFFFFFFF
:0040D572 6840394600              push 00463940
:0040D577 64A100000000            mov eax, dword ptr fs:[00000000]
:0040D57D 50                      push eax
:0040D57E 64892500000000          mov dword ptr fs:[00000000], esp
:0040D585 81ECD0000000            sub esp, 000000D0
:0040D58B C78424D800000000000000  mov dword ptr [esp+000000D8], 00000000
:0040D596 8B8424E0000000          mov eax, dword ptr [esp+000000E0]
:0040D59D 68D4404800              push 004840D4
:0040D5A2 50                      push eax
:0040D5A3 C781C400000001000000    mov dword ptr [ebx+000000C4], 00000001
:0040D5AD E8A7FC0100              call 0042D259
:0040D5B2 83C408                  add esp, 00000008
:0040D5B5 85C0                    test eax, eax
:0040D5B7 0F8432010000            je 0040D6EF
:0040D5BD 8B8C24E4000000          mov ecx, dword ptr [esp+000000E4]
:0040D5C4 68D4404800              push 004840D4        (此处用 D ECX可看见实际输入的假码19191919)
:0040D5C9 51                      push ecx
:0040D5CA E88AFC0100              call 0042D259
:0040D5CF 83C408                  add esp, 00000008
:0040D5D2 85C0                    test eax, eax
:0040D5D4 0F8415010000            je 0040D6EF
:0040D5DA 8B9424E0000000          mov edx, dword ptr [esp+000000E0]
:0040D5E1 53                      push ebx
:0040D5E2 56                      push esi
:0040D5E3 33C9                    xor ecx, ecx
:0040D5E5 8B72F8                  mov esi, dword ptr [edx-08]
:0040D5E8 C644240868              mov [esp+08], 68
:0040D5ED 85F6                    test esi, esi
:0040D5EF C644240975              mov [esp+09], 75
:0040D5F4 C644240A79              mov [esp+0A], 79
:0040D5F9 C644240B64              mov [esp+0B], 64
:0040D5FE C644240C6F              mov [esp+0C], 6F
:0040D603 C644240D6E              mov [esp+0D], 6E
:0040D608 C644240E67              mov [esp+0E], 67
:0040D60D C644240F00              mov [esp+0F], 00
:0040D612 7E3F                    jle 0040D653
:0040D614 55                      push ebp
:0040D615 57                      push edi
:0040D616 8D7C3417                lea edi, dword ptr [esp+esi+17]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D64F(C)
|
:0040D61A 8B8424F0000000          mov eax, dword ptr [esp+000000F0]      (EAX 中的值为注册名)
:0040D621 BD07000000              mov ebp, 00000007        (这几句作用是注册名超过7位后,又得第一个开始)
:0040D626 8A1C01                  mov bl, byte ptr [ecx+eax]
:0040D629 8BC1                    mov eax, ecx
:0040D62B 99                      cdq
:0040D62C F7FD                    idiv ebp
:0040D62E 0FBEC3                  movsx eax, bl              (EAX值为注册名第N个字符值)=a
:0040D631 8BD9                    mov ebx, ecx
:0040D633 0FBE541410              movsx edx, byte ptr [esp+edx+10]        (ESP+10)的值为字符 “huydong”
:0040D638 03DA                    add ebx, edx                (取第N个固定字符值+N-1)=b
:0040D63A 03C3                    add eax, ebx                (a+b)=c
:0040D63C BB09000000              mov ebx, 00000009
:0040D641 03C6                    add eax, esi                (esi为注册名长度)+c=d
:0040D643 99                      cdq
:0040D644 F7FB                    idiv ebx                   
:0040D646 80C230                  add dl, 30
:0040D649 41                      inc ecx                      (ECX+1)
:0040D64A 8817                    mov byte ptr [edi], dl          (除9余数+30)=(注册名长度-N+1)位注册码
:0040D64C 4F                      dec edi
:0040D64D 3BCE                    cmp ecx, esi             
:0040D64F 7CC9                    jl 0040D61A                (小于注册名长度跳回运算)
:0040D651 5F                      pop edi
:0040D652 5D                      pop ebp

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D612(C)
|
:0040D653 8D464D                  lea eax, dword ptr [esi+4D]      (注册名长度+4D)
:0040D656 B909000000              mov ecx, 00000009
:0040D65B 99                      cdq
:0040D65C F7F9                    idiv ecx
:0040D65E 8B8424EC000000          mov eax, dword ptr [esp+000000EC]
:0040D665 80C230                  add dl, 30              (最后一位注册码)
:0040D668 88543410                mov byte ptr [esp+esi+10], dl


后面有一个与假码比对过程, 就不写了.

六: 整理算法如下: 
算法分析如下:
J=len(注册名)
I<=J
S(I)=注册名第I位字符
D(I)=”huydong”第I位字符, 如注册名大于7, 则又从第一位开始
经过J次循环
则SN(J-I+1)= CHR(((S(I)+D(I)+J+I-1) MOD 9)+30h)
最后一位注册码为 SN(J+1)=ASC(((J+4Dh) mod 9)+30h)

可能很凌乱, 请大家谅解!!!!