快速去掉自校验的思路:
用od 将壳脱掉后,没有什么其他的问题,然而程序仍然不能运行,可能就是程序中
存在自校验了。。。
当然,你可以用双 OD 的方法,慢慢的比较他们的不同,现在,我们来用一种更快的方法去掉它。。
将程序载入后,查找--当前模块的标签--》找到 ExitProcess...
因为程序的退出都是由它来完成的。。
怎么样来退出程序呢?? 肯定是通过一个 CALL 的调用。。那么,我们就来找到这个 CALL ,在它那,下断点。。。
那么,我们就在 =kernel32.ExitProcess 处,在每个查考那下断点。。
重新载入程序。。 运行。。。。当然就会中断下来了。。。。
004044F0 /$ 53 push ebx
004044F1 |. 56 push esi
004044F2 |. 57 push edi
004044F3 |. 55 push ebp
004044F4 |. BB 38F64C00 mov ebx, 004CF638
004044F9 |. BE 00C04C00 mov esi, 004CC000
004044FE |. BF 48F04C00 mov edi, 004CF048
00404503 |. 807B 28 00 cmp byte ptr [ebx+28], 0
00404507 |. 75 16 jnz short 0040451F
来到这个段的段首。。。本地调用来自 004045CD, 004C4B36, 004C4BA2, 004CB104
看到这个。。。 查找参考-----选择命令------,,在每一个CALL 处,下段点。
重新载入,运行,断下后。。
004C4B36 |. E8 B5F9F3FF call 004044F0 //断点1
004C4B3B |> A1 5CE64C00 mov eax, dword ptr [4CE65C]
004C4B40 |. C600 00 mov byte ptr [eax], 0
004C4B43 |. 8D95 E0FDFFFF lea edx, dword ptr [ebp-220]
004C4B49 |. A1 8CE54C00 mov eax, dword ptr [4CE58C]
004C4B4E |. 8B00 mov eax, dword ptr [eax]
004C4B50 |. E8 6B84FBFF call 0047CFC0
004C4B55 |. 8B95 E0FDFFFF mov edx, dword ptr [ebp-220]
004C4B5B |. 8D85 ACFEFFFF lea eax, dword ptr [ebp-154]
004C4B61 |. E8 BAE2F3FF call 00402E20
004C4B66 |. BA 01000000 mov edx, 1
004C4B6B |. 8D85 ACFEFFFF lea eax, dword ptr [ebp-154]
004C4B71 |. E8 9AE6F3FF call 00403210
004C4B76 |. E8 89DDF3FF call 00402904
004C4B7B |. 8D85 ACFEFFFF lea eax, dword ptr [ebp-154]
004C4B81 |. E8 FAE4F3FF call 00403080
004C4B86 |. E8 79DDF3FF call 00402904
004C4B8B |. 3D 20A10700 cmp eax, 7A120 //这是跳转的关键
004C4B90 |. 7E 15 jle short 004C4BA7
004C4B92 |. 8D85 ACFEFFFF lea eax, dword ptr [ebp-154]
004C4B98 |. E8 3FE3F3FF call 00402EDC
004C4B9D |. E8 62DDF3FF call 00402904
004C4BA2 |. E8 49F9F3FF call 004044F0 //断点2
//这是跳转的关键: 当脱壳后的程序大小 只有 小于或等于 7A120 H 时,才不会
退出程序。。
当然可以改下面的 跳。。也可以改与 CMP 比较的值。。。都是可以的。。