首页 > 系统服务 > 详细

ACProtect Professional 1.3C 主程序脱壳(1)(图)

时间:2016-01-22 09:50:31      阅读:294      评论:0      收藏:0      [点我收藏+]
脱壳过程感觉与Unpacking Saga的那个UnpackMe没有太大的不同。最明显的一点是,其中的异常多了很多。大部分是固定模式的int 3解码。因为一开始打算全程跟,所以一边跟一边修改去除junk code的IDC script,写OllyScript脚本,并用WinHex把解出的代码贴到ACProtect_Fixed.exe,在IDA中用Load File|Reload the input file加载后对照。

如果在OllyDbg110C下忽略所有异常,运行时报:
技术分享


1. 关于int 3解码

壳中有大量的int 3解码,一边执行一边解。具有相同的调用模式:

技术分享

在int 3的SHE中(下面的div 0异常也是同一个SEH),当exception code为0x80000003时,在Dr0-Dr3中设置了新的值,即设置了4个硬件执行断点,就在紧临int 3下面的位置。这样执行到这4句,会触发4次异常。如果在这里F7过,SHE不会执行。

技术分享

当由上面的4个断点引发异常时:
技术分享
每次异常,会设置某个寄存器。4次异常处理必须执行,否则寄存器中没有正确值,下面的解码会失败。这样又顺便清除cracker的断点,是个不错的主意J。

技术分享

结束异常处理后,开始解码。格式是一样的,用的register不同。这里可以得到起始地址(。

技术分享

在jnz下面的地址F4,然后查看前面用于寻址的寄存器的值,减1就是解码结束地址。

技术分享
解完后跟着一个div 0异常。只有anti-debug作用,直接跳过即可。


2. 避开IAT加密

在第16个int 3的解码过程中,隐藏了IAT加密。其实在OllyDbg的状态栏可以看到这附近有不少dll被加载了。
技术分享
有4处检查,决定是否特殊处理。在用GetProcAddress得到API的地址后,开始检查。是否为特殊的API?
技术分享

是否为MessageBoxA或RegisterHotKey(这个比较少见J)? 是则替换api地址。
技术分享

下面检查dll的映射地址是否为kernel32.dll或user32.dll。
技术分享

这里通不过检查,就不做处理,直接把API的地址保存到IAT了。否则:
技术分享
写IAT:
技术分享

用脚本执行到这一段,patch掉4处的跳转,在处理完全部dll的地方下断,用ImportRec得到完整的IAT,全部有效。

技术分享
技术分享

size = 6E3828 – 6E3140 = 6E8

技术分享
注意此时OEP不对。但IAT已经拿到了。先把tree保存起来。


3. 寻找OEP

得到IAT后,试试忽略所有异常,到这里已经可以在OllyDbg下执行了。试了一下,关闭其它异常,只留下int 3,还要shift-F9 60次才能运行L。这样一步步跟不把人累死。算了,先换省力的办法吧。

干脆,在执行目前的script停下后,忽略所有异常。对Code section下内存访问断点。

技术分享

1) 406EDC,返回到壳
技术分享

返回到壳代码,所以这是stolen code发出的call。

技术分享

2) 46261C,返回到壳

技术分享

3) 读操作断下

技术分享

4) 462634,返回到壳

技术分享
这里的代码也会引发异常。先remove内存访问断点,到73CEDD设断。断下后恢复内存访问断点。
5) 读操作断下

技术分享

6) 又在462634,是循环吗?按第4步的办法处理
技术分享

技术分享

7)到站了J

技术分享

这里是false OEP。下面的空间有限。可以看到,stolen codes中含有的call:
406EDC,46261C,462634(执行2次)。

在dump窗口中看:
技术分享

OEP应该在4D9DE4。

ACProtect Professional 1.3C 主程序脱壳(1)(图)

原文:http://www.jb51.net/hack/4994.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!