忆杰的博客

忆杰的博客

手脱SoftDefender1.12版本壳

我使用加壳软件是: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表的项目中下个写入硬件写入断点, 然后跑起来, 最后跟几次发现

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..

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就全部搞定了.其实没有, 还需要做一步, 因为中间还有检测.

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.. 脱壳完成.

 

发表评论


Warning: Undefined variable $user_ID in /www/wwwroot/joenchen.com/wp-content/themes/agan/comments.php on line 66

您必须登录 才能进行评论。