Re-脱壳技术 脱壳学习(2): 脱壳七法
1. ESP定律
使用条件:OD载入之后F8单步一下,寄存器ESP中存放的值被改变(开始第一条语句为pushad
)
1. 用OD载入
2. 先F8单步运行一步
发现ESP寄存器被改变,可以使用ESP定律
3.设置硬件断点
右键数据窗口跟随,|| 或者直接点HW break[ESP],此插件会自动帮忙下好硬件断点
数据窗口设置
从最开始的数据开始选,(别选太少就行)然后右键→断点→硬件访问→这里的三个随便选一个都可以,我一般选word
此时菜单栏→调试→硬件断点 已经有了我们下的断点
4.触发断点
然后F9运行程序,来到这里,此时可以删除硬件断点了
然后F8单步往下
如果遇到向上图这样的,向上的代码,则在下一行代码(上图中的为地址0x004052E8)右键→断点→运行到选定位置(快捷键F4)
删除图中的灰色代码(db 00)可以选择右键→分析→从模块中删除分析
分析完的模样
然后继续F8,此时出现了一个jmp大跳转(说明离OEP很近了)我们继续F8向下。
此时我们来到了OEP
2. 单步跟踪
- 打开程序按F8单步向下, 尽量实现向下的jmp跳转
- 会经常遇到大的循环, 这时要多用 F4 来跳过循环
- 如果函数载入时不远处就是一个call(近call), 那么我们尽量不要直接跳过, 而是进入这个call
- 一般跳转幅度大的jmp指令, 都极有可能是跳转到了原程序入口点(OEP)
如果执行到某一个call程序运行起来了,在call下断点,重新载入F7步入call继续单步
3. 内存镜像法
大致步骤
- 选择菜单的选项->调试选项->异常,勾选所有的忽略异常
- 按下ALT+M, 打开内存镜像, 找到程序的第一个.rsrc, 按F2下断点, 然后按SHIFT+F9运行到断点
- 再按ALT+M, 打开内存镜像, 找到程序的第一个.rsrc上面的.text(在示例中是00401000处), 按F2下断点. 然后按SHIFT+F9(或者是在没异常情况下按F9)
1.OD设置
- OD菜单栏→选项→调试设置
- 打开【异常】标签,将所有的框都勾选上,也就是忽略所有异常
2. 内存镜像下.rsrc断点
- 打开内存镜像窗口(快捷键Alt+M)或点击下图按钮
- 找到当前被调试程序的rsrc段
- F2下断点
- F9运行
3.内存镜像下.text断点
- 下断点
- 运行
4.单步跟踪
单步到这里的时候有两个向上的jmp跳转,选择jmp的下一行代码,然后F4运行到选定位置
继续单步
来到OEP
4. 最后一次异常
- 点击选项->调试选项—>异常, 把里面的√全部去掉! 按下CTRL+F2重载下程序
- 按SHIFT+F9, 直到程序运行, 记下从开始按SHIFT+F9到程序运行的次数m
- CTRL+F2重载程序, 按SHIFT+F9(这次按的次数为程序运行的次数m-1次
- 在OD的右下角我们看见有一个"SE 句柄", 这时我们按CTRL+G, 输入SE 句柄前的地址
- 按F2下断点,然后按SHIFT+F9来到断点处, F8单步跟踪
1. OD设置
- OD菜单栏→选项→调试设置
- 不忽略所有异常,取消全部的勾
重载程序
2.记下从开始按SHIFT+F9到程序运行的次数m
第一次
第二次打开,摁了两次,则m=2
3. 重载,摁m-1次shift+F9
4. 下断点
- 在【SE处理程序】或【SE句柄】右键→反汇编窗口跟随
- F2下断点
- shift+F9运行
5.单步跟踪
单步跟踪来到OEP
5. SFX
- 设置OD, 忽略所有异常, 也就是说异常选项卡里面都打上勾
- 切换到SFX选项卡, 选择"字节模式跟踪实际入口(速度非常慢)", 确定
- 重载程序(如果跳出是否"压缩代码?“选择"否”, OD直接到达OEP)
1.OD设置
2. 切换至SFX选项卡
选择 字节方式跟踪真正入口出(速度非常慢)
点击【确定】
3. 重载程序
重载后会自动跟踪
只需等待即可
4.来到OEP
等待其跟踪完之后,来到OEP
5.使用完毕将OD设置还原
6. 出口标志
1.寻找压栈命令
这里最开始的压栈命令为pushad
,则对应的出栈命令则为popad
2.查找popad
命令
-
右键→查找→命令(或者使用快捷键ctrl+F)
-
输入
popad
,并取消【整个块】前面的框勾选
-
点击【查找】
-
先在
popad
那条命令,F4,执行到选定位置。
如果程序运行,则寻找下一个popad,(快捷键ctrl+l)直到F4后程序不运行,则找到对应pushad的那个popad
第一次
第二次
第三次
第四次
疑似,找到OEP,F4运行到此处的popad
,发现程序没有运行
然后F8单步跟踪找到OEP
7. 模拟跟踪
1.使用内存镜像法
2.在内存镜像中寻找.nPack段
在命令框中输入tc eip < xxx
其中xxx为.nPack段的地址
然后OD会自动跟踪,等结果就好