1. 单步执行法
- OD加载程序,F8单步步入程序,向上返回的要按键F4跳转到向上返回的下一句语句
- 特征代码是 popad , 执行下一句语句,会有一个很大的跳转,执行次跳转语句,即会进入压缩程序的真正入口
- 右键点击 用OD脱壳调试进程,下面有方式一和方式二,任选一种,点击脱壳,保存到文件夹
2. 使用工具 - LoadPE
- 打开目标程序的进程
- 右键修正镜像大小
- 右键完整转存
3. 命令查找法(upx,aspack)
- 查找命令popad
- 参考单步执行法
4. esp定律法
- 单步执行一步
- 选择ESP的数值,右键数据窗口中跟随
- 数据窗口中选中ESP的数值,设置硬件访问断点
- 直接运行,断点处就是要跳转到程序真正入口的jmp语句
- 单步执行,进入真正的入口
5. 两次内存镜像法
- 打开查看内存窗口,或点击快捷键M进入内存查看
- 在 .rsrc 处(一般是第一个)设置访问断点,并运行至断点处
- 在 .text 处(一般是第一个)设置访问断点,并运行至断点处
- 接着线下就能进入真正的入口
6. 模拟跟踪(aspack压缩壳可用)
- 打开内存查看窗口,找到第一个 .aspack 区段, 记录最前面的地址为addr(区段可以是对应壳的名字)
- tc eip<addr,此方法很慢
7. SFX
- 打开 选项 - 调试设置
- 点击SFX,选中块方式跟踪真正入口处
- 点击重新运行程序
- 注意:此方法不一定准确
8. 手动修复IAT
- 通过OD找到脱壳后的程序入口
- 随便找一个call的地址addr,OD使用命令 d addr,向上滚动,一直到上面的地数值都是0000 0000,记录当前 addr1
- 然后向下滚动, 一直到下面都是0000,记录当前地址 addr2
- 打开 Import Reconstructor软件,在IAT的RVA填入addr1-基址,size填入addr2-addr1(或者直接填1000)
- 点击无效函数,右键剪切
- 转存到文件
OD的数值窗口打开方法,数据窗口中,右键 - 长型 - 地址
9. 最后一次异常法;
- 打开OD选项,选择异常,取消勾选所有异常。
- 记录跑飞次数 n
- 找SE句柄,即第 n-1 处
- 转到SE xxxx处下断点,sheft+F9后单步调试
10. BP VirtualFree
- BP VirtualFree,下断点
- SHIFT+F9,取消断点SHIFT+F9,取消断点
- ALT+F9
- 查找 push 8000(特征码),并运行到这
- 单步跟
11. bp VirtualAlloc
- bp VirtualAlloc 下断点
- SHIFT+F9运行SHIFT+F9运行
- 取消断点
- ALT+F9
- 向下拉,看到JMP。运行到这
12. at GetVersion
- at GetVersion 下断点
- 单步调
13. 条件断点脱壳(WinUpack)
在大跳转的代码处,程序不一定会直接跳转到入口处(比如FSG壳),会有很多次循环才会跳转到入口处,因为程序要建立输入表,此时可以看大跳转上面的一句判断语句
- 单步执行,然后,有一个大跳转,不会跳转
- 该跳转上面有一句test eax, eax
- 到跳转到真正入口处下条件断点 eax==0,也可能是地址([eax]==0)
- 下面很多循环都是在重建输入表
14. 附加数据处理
工具为 HexWorkshop
- 使用HexWorkshop,在原 exe 程序中寻找要附加的数据(从最后往前找,一直到全部为0的地方)
- 从找到的第一个不为0的地方开始,按住sheft键,一直复制到最后
- 使用HexWorkshop打开脱壳后的 exe 程序
- 在数据的最后粘贴复制的数据
- 另存为exe文件到文件夹