标签:应该 工具 ctrl ctr containe 原因 手工 补充 对比
模拟追踪 重点是模拟两字, 含义就是程序代替人手工的F7(步进) 或者 F8(步过)
回想我们手工脱壳的时候,最笨的方法就是遇到Call跳过(F8) 如果跑飞就遇到Call F7
但是往往最笨的方法就是最好用的方法. 原理也说过.单步跟踪法是 壳代码在执行之后总会跳转到OEP
执行的,其中到达OEP的方式很多中,但是原理就是修改EIP (push + ret jmp)
单步跟踪方法就是模拟人手工这样操作了, 你下一个条件断点. 那么我们主要学习的就是这个条件断点.这个思路.
网络上有很多种,我们只知其一不知其二,这里原理也说一下,做一下补充.
其中原理懂了,就不在乎我们使用什么调试器了.
网络上有内存镜像法 + 模拟追踪法
我们学习模拟追踪法,学习的其实就是条件断点的设置,让程序自动单步或者步过,那么条件该怎么设置?
不知道大家有想过这么一个问题吗. 壳代码执行之后总会跳转到OEP,而且是一个大跳
紧接着因为跳转了,所以EIP会进行修改了 那么我们条件断点着重就在于这个EIP上.
我们随便打开一个程序观看其内存镜像
首先我列一个表格如下
镜像基址 | 大小 | 节(镜像)名称 |
---|---|---|
0x0040000 | 0x1000 | dxpack.exe |
0x00401000 | 0x4000 | .text |
0x00405000 | 0x1000 | .data |
0x00406000 | 0x5000 | .idata |
0x0040C000 | 0x1000 | .reloc |
0x40D000 | 0x1000 | .dxpack |
请注意最后一个节,是壳代码的自身节. 其基地址为0x40D000
那么我们条件断点怎么设置.
可以设置为 当 EIP < 0x40D000 则进行中断 为什么是 <
1.首先,脱壳的时候OEP会有一个大跳,直接从0x40D000跳转到 .text节中的OEP位置. 而.text节的基址 + 大小,明显小于0x40D000的.
2.为什么要跟.text节对比.原因是OEP是在代码区,熟悉PE的应该知道.text节中,会有我们OEP,也就是代码会从OEP开始执行, 壳不管怎么来说.都是最后要跳转到OEP.所以要 < 壳自身
首先说一下为什么使用网络镜像法,在使用模拟追踪, 原因就是模拟追踪只不过是调试器自动跟你你设置的条件来进行单步或者步入的,以我们自己来说,如果我们知道哪里是壳代码,我们还会去追踪吗. 根本不会. 你只是寻找OEP而已.所以会不断的(F7 F8) 而内存镜像法其实就是给追踪设置一个起点.
让其在这个起点位置进行追踪.进而更快的到达你的断点处. 也就是你的条件断点.
当然你如果不想设置起点,直接在入口点就设置条件断点也是可以的,只不过就是时间问题.时间的快慢而已.
如下图
随便点击一个
让其自动跟踪即可.
OllyDbg 以及 X64都可以使用命令进行快速设置的.以及其调试界面也集成了追踪可以自由选择
ollydbg中首先要设置条件 (CTRL + T) 而后才能使用 跟踪步过(CTRL + F12) 或者跟踪步入(CTRL + F11)
总结来说就是
模拟追踪是调试器模拟 F7 F8 重要的是条件断点的设置,条件断点原理就是OEP会在.text节中.
而EIP始终会跳转到.text节中.而.text节小于壳代码,所以设置的就是 EIP < 壳代码基址
标签:应该 工具 ctrl ctr containe 原因 手工 补充 对比
原文地址:https://www.cnblogs.com/iBinary/p/12683394.html