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. 单步跟踪

  1. 打开程序按F8单步向下, 尽量实现向下的jmp跳转
  2. 会经常遇到大的循环, 这时要多用 F4 来跳过循环
  3. 如果函数载入时不远处就是一个call(近call), 那么我们尽量不要直接跳过, 而是进入这个call
  4. 一般跳转幅度大的jmp指令, 都极有可能是跳转到了原程序入口点(OEP)

如果执行到某一个call程序运行起来了,在call下断点,重新载入F7步入call继续单步

3. 内存镜像法

大致步骤

  1. 选择菜单的选项->调试选项->异常,勾选所有的忽略异常
  2. 按下ALT+M, 打开内存镜像, 找到程序的第一个.rsrc, 按F2下断点, 然后按SHIFT+F9运行到断点
  3. 再按ALT+M, 打开内存镜像, 找到程序的第一个.rsrc上面的.text(在示例中是00401000处), 按F2下断点. 然后按SHIFT+F9(或者是在没异常情况下按F9)

1.OD设置

  1. OD菜单栏→选项→调试设置
    在这里插入图片描述
  2. 打开【异常】标签,将所有的框都勾选上,也就是忽略所有异常
    在这里插入图片描述

2. 内存镜像下.rsrc断点

  1. 打开内存镜像窗口(快捷键Alt+M)或点击下图按钮
    在这里插入图片描述
  2. 找到当前被调试程序的rsrc段
    在这里插入图片描述
  3. F2下断点
    在这里插入图片描述
  4. F9运行
    在这里插入图片描述

3.内存镜像下.text断点

  1. 下断点
    在这里插入图片描述
  2. 运行
    **加粗样式**

4.单步跟踪

单步到这里的时候有两个向上的jmp跳转,选择jmp的下一行代码,然后F4运行到选定位置
在这里插入图片描述
继续单步
在这里插入图片描述

来到OEP
在这里插入图片描述

4. 最后一次异常

  1. 点击选项->调试选项—>异常, 把里面的√全部去掉! 按下CTRL+F2重载下程序
  2. 按SHIFT+F9, 直到程序运行, 记下从开始按SHIFT+F9到程序运行的次数m
  3. CTRL+F2重载程序, 按SHIFT+F9(这次按的次数为程序运行的次数m-1次
  4. 在OD的右下角我们看见有一个"SE 句柄", 这时我们按CTRL+G, 输入SE 句柄前的地址
  5. 按F2下断点,然后按SHIFT+F9来到断点处, F8单步跟踪

1. OD设置

  1. OD菜单栏→选项→调试设置
    在这里插入图片描述
  2. 不忽略所有异常,取消全部的勾
    在这里插入图片描述
    重载程序

2.记下从开始按SHIFT+F9到程序运行的次数m

第一次
在这里插入图片描述
第二次打开,摁了两次,则m=2

3. 重载,摁m-1次shift+F9

4. 下断点

在这里插入图片描述

  1. 在【SE处理程序】或【SE句柄】右键→反汇编窗口跟随
    在这里插入图片描述
  2. F2下断点
  3. shift+F9运行

5.单步跟踪

单步跟踪来到OEP

5. SFX

  1. 设置OD, 忽略所有异常, 也就是说异常选项卡里面都打上勾
  2. 切换到SFX选项卡, 选择"字节模式跟踪实际入口(速度非常慢)", 确定
  3. 重载程序(如果跳出是否"压缩代码?“选择"否”, OD直接到达OEP)

1.OD设置

在这里插入图片描述

2. 切换至SFX选项卡

选择 字节方式跟踪真正入口出(速度非常慢)
在这里插入图片描述
点击【确定】

3. 重载程序

重载后会自动跟踪
在这里插入图片描述
只需等待即可

4.来到OEP

等待其跟踪完之后,来到OEP
在这里插入图片描述

5.使用完毕将OD设置还原

6. 出口标志

1.寻找压栈命令

这里最开始的压栈命令为pushad,则对应的出栈命令则为popad
在这里插入图片描述

2.查找popad命令

  1. 右键→查找→命令(或者使用快捷键ctrl+F)
    在这里插入图片描述

  2. 输入popad,并取消【整个块】前面的框勾选
    在这里插入图片描述

  3. 点击【查找】

  4. 先在popad那条命令,F4,执行到选定位置。
    如果程序运行,则寻找下一个popad,(快捷键ctrl+l)直到F4后程序不运行,则找到对应pushad的那个popad

第一次在这里插入图片描述
第二次

第三次
在这里插入图片描述
第四次
在这里插入图片描述
疑似,找到OEP,F4运行到此处的popad,发现程序没有运行
在这里插入图片描述
然后F8单步跟踪找到OEP
在这里插入图片描述
在这里插入图片描述

7. 模拟跟踪

1.使用内存镜像法

2.在内存镜像中寻找.nPack段

在命令框中输入tc eip < xxx其中xxx为.nPack段的地址
在这里插入图片描述
然后OD会自动跟踪,等结果就好

posted @ 2019-12-26 21:26  Palmer0801  阅读(336)  评论(0编辑  收藏  举报