脱壳和反调试

Posted by volcanohatred on March 26, 2019

很久之前学过的内容,今天拿过来复习下。😘

脱壳

1.单步跟踪

F8单步向下, 跟踪向下的jmp跳转,向上的jmp或者循环直接用F4来跳过,看到popad基本断定到达OEP。
对于跑飞的情况,要F7步入。

2.ESP定律

基本用od载入程序断下来的时候,看到pushad指令一般都可以使用ESP定律来脱。
F8->寄存器窗口->ESP->数据窗口跟随->选中任意字符,右键->断点->硬件访问->运行->分析->从代码中删除分析
F8->寄存器窗口->ESP->HW break(ESP)

3.两次断点(内存镜像)

先打开od的选项菜单,进入调试设置,在异常选项中将所有选项打勾(忽略所有异常)。
然后下两次断点:
1.打开内存镜像窗口(ALT+M),在加载的二进制文件.rsrc处下F2断点,然后运行到断点(SHIFT+F9)
2.第二次在加载的二进制文件的代码段头地址(.text)(一般是401000)处下F2断点,然后运行到断点(SHIFT+F9)
然后运行,就会到达OEP。

4.最后一次异常

先打开od的选项菜单,进入调试设置,在异常选项中将所有选项取消打勾(不忽略所有异常)。 按SHIFT+F9直到程序开始运行,统计按下的次数,按下次数-1就是异常的次数。
然后重新载入,按SHIFT+F9,按下的次数等于异常的次数。
查看堆栈窗口,在SE处理程序处反汇编窗口跟随,在跟随的汇编指令处下F2断点,然后按SHIFT+F9运行到此断点。
取消刚下的F2断点,进行单步跟踪,到达OEP。

5.SFX

先打开od的选项菜单,进入调试设置,在SFX选项处,将“停在自解压器的入口处”改为“字节方式跟踪真正入口”即可。

6.模拟跟踪

和两次断点有点类似,打开内存镜像窗口(ALT+M),查看加载的二进制文件包含项为“SFX,输入表”的地址。
在命令窗口输入:tc eip<地址>进行模拟跟踪。

7.出口标志

pushad对应popad
右键->查找->命令->输入popad(取消整个块)查找。
进行单步跟踪到达OEP。
如果遇到跑飞的情况,则依次查找下一个,直到程序正常断下。

8.秒到OEP

用od加载后直接运行程序,然后将堆栈窗口拉到最下面,从下往上依次查找加载的程序名称,找到类似:程序名称.地址 的位置。
进行反汇编窗口跟随,然后在反汇编窗口处从模块中删除分析。
再次查看堆栈窗口,此时会出现堆栈的段首,类似:返回到 程序名.地址 来自 程序名.地址。再次反汇编窗口跟随。
在汇编窗口向上查找,可以找到OEP,然后进行数据窗口跟随,下硬件访问断点。
重新载入。

反调试

注意:到达OEP后,右键,用OllyDump脱壳调试进程,有时重建输入表反而无法打开,所以可以进行测试。


>