手脱UPX壳不求人教程
手脱UPX壳不求人教程
小白:“为什么要手脱UPX壳呀?upx -d 不香吗?”
高手:“香个蛋,出题人各个心里阴暗,能给你upx -d的机会不多了。”
ESP定律
个人认为这个方法是最方便,最快捷的,掌握这个方法基本的UPX壳闭眼脱
原理
ESP 定律的原理在于利用程序中堆栈平衡来快速找到 OEP.
由于在程序自解密或者自解压过程中, 不少壳会先将当前寄存器状态压栈, 如使用pushad
, 在解压结束后, 会将之前的寄存器值出栈, 如使用popad
. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发. 然后在程序当前位置, 只需要少许单步操作, 就很容易到达正确的 OEP 位置.
- 程序刚载入开始 pushad/pushfd
- 将第一个寄存器压入栈后就设对 ESP 寄存器设硬件断点
- 运行程序, 触发断点,这是upx程序几乎结束
例题讲解
ida反编译一个加upx壳的发现函数很少,但是可以发现,start函数开始有很多push操作
打开x64dbg进行调试,指向到第二个push停止
然后再右下栈窗口给esp下硬件访问断点,64位8字节,32位4字节
接下来直接运行,就会断在upx壳快结束的位置
接着一直往下运行,直到一个大的跳转,就是到达OEP
到达OEP后就用x64dbg自带的插件进行dump和IAT的修复
在第四步的时候,如果出现红色×就删除掉
上边步骤已经完成了dump和IAT的修复,但是可能程序仍然不能运行
这时候我们就要去除重定位
我们需要修改其PE结构中的两个字段值:
- File Header 的 Charateristics
- Optional Header的 DllCharateristics
下面用小辣椒(CFF Explorer VII)进行修复
第三步勾选上
第三步取消勾选
这样一个完整的脱壳流程就完成了
可能需要自己找到main函数😭
其他脱壳方法待补充。。。。