本来一直对upx3.0以后加密壳挺畏惧的,其逻辑看起来挺简单的,有想逆一把的想法,但是都没实施,今天又遇到了,没法,太急,去google了一下,找到几篇资料
但是年代都挺久远的,看到[1]中直接esp定律就脱了,有点不信,就试了试,靠,居然可以,只能表示,实践是检验真理的唯一标准。
#1. 查壳
[!] UPX 3.05 compressed !
查出来是3.05,也不知道是不是误报,比[1]中版本高了点,所以也就是尝试尝试esp定律拖一下
#2. 脱壳
OD加载(是个dll,通过load.exe加载),在DllMain断下,看到熟悉的pushad,感觉方法可能靠谱了
1 | 103432E0 > 807C24 08 01 cmp byte ptr ss:[esp+0x8],0x1 |
f8到103432EC ,在数据窗口显示esp值,然后右键下了个硬件访问断点(其实以前尝试过,但是下的是内存访问断点,失败了,也不知道是不是这个原因,待会儿试试)。接着F9,断在了下面的代码中,看不出啥,就有个 jmp xxx.100C3C71,地址离当前地址还算较远,可能是另一个节
1 | 10343E7B 8D4424 80 lea eax,dword ptr ss:[esp-0x80] //这个就是先前pushad压入的吗?? |
1 | 100C3C71 /E9 CA371100 jmp xxx.101D7440 |
单步到jmp,F8跟到其代码中,看到了熟悉的一段入口代码:
1 | 101D7440 8BFF mov edi,edi |
通过堆栈参数,进一步确认了下,这是DllMain函数
1 | 0006F880 7C92118A 返回到 ntdll.7C92118A |
然后在101D7440地址,尝试dump,成功之后在检测壳信息
[CompilerDetect] -> Visual C++ 9.0 (Visual Studio 2008)
应该是脱壳成功了,但是iat没有修复,先ida看看是否需要修复
#3. 修复
如果需要修复,使用importRec工具
找到进程,选择目标dll,然后填入OEP,修复即可
#4. 参考
[1]: http://bbs.pediy.com/showthread.php?t=44125 【原创】手脱 UPX3.0
[2]: http://bbs.pediy.com/showthread.php?t=140312 【原创】UPX3.03脱壳机-学习版[代码更新]