UPX手脱壳
UPX手脱壳
寻找OEP
ESP 定律法是脱壳的利器, 是应用频率最高的脱壳方法之一,它的原理在于利用程序中堆栈平衡来快速找到 OEP。
由于在程序自解密或者自解压过程中,不少壳会先将当前寄存器状态压栈,如使用 pushad,在解压结束后会将之前的寄存器值出栈,如使用 popad。因此在寄存器出栈时,往往程序代码被恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步操作,就很容易到达正确的 OEP 位置。
- 程序刚载入开始 pushad/pushfd
- 将寄存器压栈后就在 ESP/RSP 寄存器所在地址处设硬件访问断点
- 运行程序,触发断点
找到 pushad 。pushad = 一次性保存所有通用寄存器到栈。有的时候不是pushad,而是一连串的 push 将通用寄存器入栈也是一样的。

然后在这个地址处设硬件断点,硬件断点,访问 -> 4字节

然后直接运行,看到程序跳到 popad,显而易见的程序进行弹栈操作后又进行了jmp 跳转,跳到了比较远的位置,进行大跳转的jump地址就是OEP的所在地址。在这里打上断点直接跟进去,里面就是程序的OEP。

Dump 及 IAT 修复
找到 OEP 后,通过 x64dbg 自带的 Scylla 插件即可完成 Dump 及 IAT 修复。在弹出的窗口中点击 Dump,并设置保存路径。

dump 的默认文件名为 原文件名_dump.exe,之后点击 IAT Autosearch,会弹出一个警告:

选择 是 后,会显示找到的 IAT 地址及大小:

此时再点击 Get Imports,插件会列出找到的所有导入信息,如果有红叉需要手动删除:

接着点击 Fix Dump,选择刚才 dump 的 exe,插件会在同级目录下生成一个新程序 原文件名_dump_SCY.exe。

去重定位
但此时该 exe 可能仍旧不能运行,我们需要修改其 PE 结构中的两个字段值:
File Header 的 Charateristics
Optional Header 的 DllCharateristics
我们可以使用 CFFExplorerVII (小辣椒) 等工具来进行编辑。
首先修改 File Header 的 Charateristics,勾选 Relocation info stripped from file。

然后修改 Optional Header 的 DllCharateristics,取消勾选 DLL can move。

最后保存就好了,这样UPX壳就去除成功了,使用IDA打开,也能找到main函数




