• 标 题:再贴一篇cd-chcek破解译文 (4千字)
  • 作 者:1212
  • 时 间:2000-8-27 22:41:36
  • 链 接:http://bbs.pediy.com

再贴一篇cd-chcek破解译文,我自己译的,文章来源不详,若觉得还可以,给点鼓励,我会继续努力。

这次的目标是:
Warlords 3 - Darklords Rising
工具: SICE, W32Dasm

保护:CD-checks 加filesize check(文件长度检测)

   

破解参考:
* Reference To: KERNEL32.GetDriveTypeA, Ord:00CEh
                                  |
:00445853 FF1540F85900            Call dword ptr [0059F840]
:00445859 83F805                  cmp eax, 00000005 <-- 你在这里,这是一个检测光盘类型的指令
:0044585C 757A                    jne 004458D8     
:0044585E 8D45E4                  lea eax, dword ptr [ebp-1C]
:00445861 8D4D94                  lea ecx, dword ptr [ebp-6C]
:00445864 50                      push eax

* Possible StringData Ref from Data Obj ->"%sW3.DAT" <--在光盘上看是否有这个文件
|
                                  |
:00445865 68603E4F00              push 004F3E60 <-- 压入文件指针
:0044586A 51                      push ecx
:0044586B FFD7                    call edi      <-- call getdrivetypea
:0044586D 83C40C                  add esp, 0000000C
:00445870 8D4D94                  lea ecx, dword ptr [ebp-6C]
:00445873 6A00                    push 00000000

* Possible Reference to String Resource ID=00001: "Error!"
                                  |
:00445875 6A01                    push 00000001
:00445877 51                      push ecx
:00445878 8D8D84FEFFFF            lea ecx, dword ptr [ebp+FFFFFE84]
:0044587E E8FD330900              call 004D8C80 <-- 检查文件 (如果eax == 1 ->检测通过)
:00445883 85C0                    test eax, eax <-- 看是否检测到文件
:00445885 7451                    je 004458D8  <-- 如果没有就跳转
:00445887 8D8D84FEFFFF            lea ecx, dword ptr [ebp+FFFFFE84]
:0044588D E8DE350900              call 004D8E70
:00445892 8D45E4                  lea eax, dword ptr [ebp-1C]
:00445895 8D4D94                  lea ecx, dword ptr [ebp-6C]
:00445898 50                      push eax

* Possible StringData Ref from Data Obj ->"%sDRAKDUM\DRAKDUM0.SMK" <-- 也要检查是否有这文件
                                  |
:00445899 68483E4F00              push 004F3E48 <-- 压入文件指针
:0044589E 51                      push ecx
:0044589F FFD7                    call edi <-- call getdrivetypea
:004458A1 83C40C                  add esp, 0000000C
:004458A4 8D4D94                  lea ecx, dword ptr [ebp-6C]
:004458A7 6A00                    push 00000000

* Possible Reference to String Resource ID=00001: "Error!"
                                  |
:004458A9 6A01                    push 00000001
:004458AB 51                      push ecx
:004458AC 8D8D84FEFFFF            lea ecx, dword ptr [ebp+FFFFFE84]
:004458B2 E8C9330900              call 004D8C80 <-- 检测 (若eax == 1 ->检测通过)
:004458B7 85C0                    test eax, eax
:004458B9 741D                    je 004458D8
:004458BB 8D8D84FEFFFF            lea ecx, dword ptr [ebp+FFFFFE84]
:004458C1 E89A360900              call 004D8F60 <-- 跟入!!

Ok.. 这就是那两个检测.. 让我们看最后一个检测, 跟入那个 call

:004D8F60 56                      push esi
:004D8F61 57                      push edi
:004D8F62 8BF9                    mov edi, ecx
:004D8F64 33F6                    xor esi, esi
:004D8F66 39B708010000            cmp dword ptr [edi+00000108], esi
:004D8F6C 7415                    je 004D8F83
:004D8F6E 56                      push esi
:004D8F6F 8B870C010000            mov eax, dword ptr [edi+0000010C]
:004D8F75 50                      push eax

* Reference To: KERNEL32.GetFileSize, Ord:00DAh <-- 获取 DRAKDUM0.SMK文件的长度



GetFileSize是最后的检查了,它决定了DRAKDUM0.SMK的长度而且如果没有发现文件,eax将被赋值0,文件如果找到,EAX就是2B465C(文件长度的十六进制)!你自己看一看吧,2836060 = 2B465C。
唉..我们经历了艰难而漫长的道路..现在我们知道做那些修补了.
:0044587E E8FD330900 - call 004D8C80 改成 -> B801000000 - mov eax, 00000001
:004458B2 E8C9330900 - call 004D8C80 改成 -> B801000000 - mov eax, 00000001
:004458C1 E89A360900 - call 004D8F60 改成 -> B85C462B00 - mov eax, 002B465C
ok,任务完成,收工。

Static Vengeance