基础脱壳教程 1 : 手脱UPX壳

手脱 UPX 壳

调试工具是 ExeinfoPE 和 OD

注意, 这里使用了吾爱破解论坛的虚拟机, 后面的 ximo 脱壳教程我都会用虚拟机来实现, 用 win10 会出现一些问题, 原因是程序太老了.

等把 ximo 的教程看完我会再看看 win10 64 位系统下的脱壳方式.

不过我查壳是在 win10 下用 Exeinfo PE 工具, 因为这个工具查壳相对比较准.

方法1:单步跟踪

不能让它实现向上的跳转, 向下的跳转就让它实现.

遇到向上的跳转, 在这个跳转的下一条指令处右键找到 断点运行到所选位置F4, 或者在下一条指令处打个断点, 然后再运行程序, 程序就停在断点, 这时我们再取消这个断点, 这样就跳过了这个向上的跳转.

OD 会在汇编代码的左边用箭头的形式来告诉你是向上还是向下跳转,

红线代表跳转已经实现. 绿线代表跳转没有实现.

如果那个向上跳转的下一条指令还是跳转, call 也算跳转, 那么我们一般是隔一行调试.

一般来说, 一个很大跨度的跳转就直接跳到 OEP 了.

脱壳方法见下方.

1. OD 插件 OllyDump

  • 方式一
  • 方式二

2. LordPE

先修正一下镜像大小, 然后 "完整转存" 发现报错, 然后查壳发现没有脱干净, 这时候我们用到 ImportREC 工具

首先在上面找到那个程序, 因为在 OD 载入之后, 那个程序已经自动载入到进程里面了

然后在下面把程序如果地址改成真正的 OEP, 也就是之前让大家记住的 7738C (OllyDump中看到的)

自动查找 获取输入表 显示一下无效的函数 然后我们修复转存文件, 选中刚才转存的文件

方法2:ESP定律法

https://www.cnblogs.com/Fightingbirds/p/3172897.html 

ESP 是一个寄存器

只有 ESP 突变变红, 或者关键句的下一个

然后我们在 ESP 的这个值, 右键点 "在数据窗口跟随"

或者可以这么操作 : dd XXXXX hr XXXXX

接着我们在数值上, 左键, 然后右键找到 "断点", 然后 "设置硬件访问断点", 然后选择 "word", 其实 "word" 和 "dword" 都一样

然后运行, 记得把硬件断点删除, 免得出现一些问题

方法3:2次内存镜像法

https://blog.csdn.net/nhgxxyy198990/article/details/79885798 https://ctf-wiki.github.io/ctf-wiki/reverse/windows/unpack/memory/ 

所谓内存镜像法, 我们当然得先去找这个内存, 怎么找内存, 我们点 OD 上面的 "查看", 然后点这个 "内存", 或者点上面字母里面的 "M", 当然你也可以直接用快捷键 ALT+M

我们找什么呢, 我们找程序段的第一个 .rsrc, 系统的领空我们不用管它, 然后我们下一个断点 F2, 然后运行

接着再找一次内存, 找这个 00401000, 然后下断点运行, 最后单步跟到 OEP

方法4:一步直达法

一般大部分的 UPX 和 Aspack 壳才能用

一开头就是一个 pushad, 把所有寄存器数据都压入栈中

有进必有出

右键最开始的 pushad, 然后 "查找", 然后 "命令", 输入 popad 

下面的那个 "整个段块" 一般不勾选, 因为程序有很多段, 每个段都是入栈出栈很多, 勾了之后我们就不知道哪个是哪个了

然后查找, 我们可以先下断点然后运行再断点, 或者直接 F4 运行到所选位置, 然后接着单步, 就直接到达 OEP 了.