目录 Table of Contents
手脱 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 了.