我使用加壳软件是:SoftDefender1.12, 还有一个最简单的delphi7程序, 只有一个窗口那种.SoftDefender1.12还是比较恶心的, 很多anti, 一不小心就中招了, 不过总体来说这款壳只能定位成新手练手用的壳.经过不少的曲折终于将这款壳给脱掉.

首先上来发现有Anti.. 这个可不好玩, 然后换OD.. 最后换了个OD才把这个问题给解决了. 说到这个Ollydbg. 我想多说几句, OD本身功能不算很强大, 经过这么些年的发展, 现在逐渐的成为了全世界使用最多的破解调试器. 插件很暴力, 很强大.但是也带来一个很大的问题, 就是各个OD之间的差别不小, 有的时候调试这个软件遇到Anti, 或者莫名其妙的错误, 换一个OD就行了. 所以这边一般人估计都收集着好几个OD吧, 我手头就好几个OD. 调试程序遇到麻烦就换一换..

好了, 不多说了. 首先载入程序, 我这里使用的是一个delphi的实例, 首先要剥离进程, 因为这个程序是双进程的.. 这边使用kerberos来探测下这个程序调用了一些什么API.. 或者使用APIMonitor也可以, 后者更强大,更牛. 不仅仅是寻找调用了什么API那么简单. 是一个很暴力的程序.

完了之后, 生成一个.rep的文件, 用记事本打开, 寻找程序调用CreateProcess的地方.然后定位到004A7DBF显然我们这里要往上定位, 都调用创建进程了, 事情都做完了.. 所以我们定位到这里, 004AE6C3. 这是调用GetCommandLine的地方.然后往上翻一翻, 看看有没有可以跳过的的的地方, 果然前面有一个je跳转, 那么我们就直接将这个je改jmp..当然后来我发现这样不行, 有检测, 我们下硬件断点, 改下标记位就可以.. 然后双进程剥离就搞定了.

接下来就是跑oep. 使用退出法, 直接定位到oep处, 0044CA98 OK 用importRec dump.. 这oep, 太简单了, 完全没有动呢.完了之后, 重新运行程序.这次准备搞IAT..

首先我们在一个IAT表的项目中下个写入硬件写入断点, 然后跑起来, 最后跟几次发现

1
2
3
4
004AEFC3 50 push eax
004AEFC4 E8 17F8FFFF call delphi7.004AE7E0
004AEFC9 8906 mov dword ptr ds:[esi],eax ; 这里填写的是正确的函数地址
004AEFCB EB 29 jmp short delphi7.004AEFF6

恩, 找到了填写IAT地址的地方, 但是发现填写进去的地址不是我们想要的, 原来已经给处理过了.跑两次发现, 就是上面那个call处理的, call elphi7.004AE7E0, 那么直接将其nop.. 清净了..很快kernel32.dll的函数就定位完了. 但是打开IAT看一看发现有很多函数还是被加密起来了..那么在被加密的IAT里面下断点, 最后定位到一系列加密函数的地方.. 他们是这些. 全部改成jmp..

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
004AEE2F 75 11 jnz short delphi7.004AEE42
004AEE55 75 11 jnz short delphi7.004AEE68
004AEE7B 75 11 jnz short delphi7.004AEE8E
004AEEA1 75 11 jnz short delphi7.004AEEB4
004AEEC7 75 11 jnz short delphi7.004AEEDA
004AEEED 75 11 jnz short delphi7.004AEF00
004AEF13 75 11 jnz short delphi7.004AEF26
004AEF39 75 11 jnz short delphi7.004AEF4C
004AEF5F 75 11 jnz short delphi7.004AEF72
004AEF85 75 0E jnz short delphi7.004AEF95
004AEFA8 75 0E jnz short delphi7.004AEFB8

这些IAT判断都是判断一些API函数然后是否需要加密一类的, 全部改成jmp.. OK, 就这样IAT就全部搞定了.其实没有, 还需要做一步, 因为中间还有检测.

1
2
3
004AF028 ^\E9 BAFCFFFF jmp delphi7.004AECE7
004AF02D E8 35E4FFFF call 004AD467
004AF032 8B57 04 mov edx,dword ptr ds:[edi+4]

这个CALL 004AD467比较奇怪了. 严重BS.. 里面就是检测我们是否修改了内存的, 前面我们将jnz全部改成jmp. 当然修改了所以这里我们将所有在填写IAT的循环中,调用到004AD467的地方全部nop.. 这下真的是清净了.. 非常安静..完了之后在函数的末尾, 填写完IAT之后, 我们再将那些所有我们修改过的地方改回来, 神不知鬼不觉啊.跑到OEP.然后直接打开Import Rec, 修复IAT一个错误也没有. OK.. 脱壳完成.