- 献词
- 致谢
- 前言
- 第一部分 IDA 简介
- 第 1 章 反汇编简介
- 第 2 章 逆向与反汇编工具
- 第 3 章 IDA Pro 背景知识
- 第二部分 IDA 基本用法
- 第 4 章 IDA 入门
- 第 5 章 IDA 数据显示窗口
- 第 6 章 反汇编导航
- 第 7 章 反汇编操作
- 第 8 章 数据类型与数据结构
- 第 9 章 交叉引用与绘图功能
- 第 10 章 IDA 的多种面孔
- 第三部分 IDA 高级应用
- 第 11 章 定制 IDA
- 第 12 章 使用 FLIRT 签名来识别库
- 第 13 章 扩展 IDA 的知识
- 第 14 章 修补二进制文件及其他 IDA 限制
- 第四部分 扩展 IDA 的功能
- 第 15 章 编写 IDA 脚本
- 第 16 章 IDA 软件开发工具包
- 第 17 章 IDA 插件体系结构
- 第 18 章 二进制文件与 IDA 加载器模块
- 第 19 章 IDA 处理器模块
- 第五部分 实际应用
- 第 20 章 编译器变体
- 第 21 章 模糊代码分析
- 第 22 章 漏洞分析
- 第 23 章 实用 IDA 插件
- 第六部分 IDA 调试器
- 第 24 章 IDA 调试器
- 第 25 章 反汇编器/ 调试器集成
- 第 26 章 其他调试功能
- 附录 A 使用 IDA 免费版本 5.0
- 附录 B IDC/SDK 交叉引用
25.1 背景知识
首先,我们有必要了解一些有关调试器辅助去模糊的背景知识。众所周知,在发挥作用之前,一个模糊程序必须先对自身去模糊。下面的步骤提供一个简单的基本指南,说明如何对二进制文件进行动态去模糊。
使用调试器打开一个模糊程序。
在去模糊例程的结束部分搜索并设置一个断点。
从调试器中启动程序,等待断点被触发。
利用调试器的内存转储功能捕获进程的当前状态,并将其保存到一个文件中。
在进程实施任何恶意行为之前终止进程。
对捕获到的进程映像执行静态分析。
大多数现代调试器都足以执行上述任务。OllyDbg1 是 Windows 平台上的一款非常流行的调试器,常用于完成这些任务。步骤 2 并不总是像看起来那样简单。在这个步骤中,你可能需要使用许多工具,包括长时间使用 IDA 之类的反汇编器,或者进行许多单步操作,才能正确识别去模糊算法。许多时候,去模糊过程以一个行为(而不是一条特定指令)作为结束标记。这样的行为可能是指令指针值的明显变化,用以标明一个指向远离去模糊代码位置的跳转。例如,在 UPX
打包的二进制文件中,你所需要做的是观察指令指针保存的值。如果这个值小于程序的入口点地址,则说明去模糊已经完成,程序已经跳转到新的、去模糊后的代码部分。通常,这个过程叫做 初始入口点(OEP )识别 ,这里的 OEP 是程序在经过模糊处理之前开始执行的地址。
1. 参见 http://www.ollydbg.de/ 。
使事情更复杂的是,一些现代模糊器能够将输入的可执行文件转换为等效的字节码程序,然后在由该模糊器2 生成的自定义虚拟机上运行。在分析这类受虚拟化模糊器保护的可执行文件时,你不能像执行传统的分析那样期待发现原始二进制文件或定位原始入口点。这是因为原始的 x86(或其他处理器)指令并未嵌入到经过模糊处理的二进制文件中,因此你根本找不到这类指令。
2. 有关此类模糊器 VMProtect 的讨论,参阅 Rolf Rooles 的“ Unpacking Virtualization Obfuscators”,地址为: http://www.usenix.org/event/woot09/tech/full_papers/rolles.pdf 。
如果你不够小心,步骤 3 可能会带来危险。任何时候,在允许一个恶意软件不受阻碍地运行之前,你都应该三思,保证你已经正确设置了断点或断点条件。如果恶意程序设法避开你的断点,它可能会悄悄地执行恶意代码。因此,如果你要在调试器的控制下对恶意软件去模糊,你应该始终在一个沙盒环境中执行这项操作,这样,即使出现错误,你也不用担心因此导致的不良后果。
步骤 4 可能需要你付出一定的努力,这是因为虽然调试器通常支持内存转储,但它并不支持整个进程的内存映像转储。Gigapede 开发的 OllyDump3 插件为 OllyDbg 提供了进程转储功能。需要注意的是,从内存中转储的映像包含一个正在运行的进程的内容,并不一定能够反映位于磁盘文件中的静态二进制文件的初始状态。但是,在恶意软件分析中,我们的目的并不是创建一个经过去模糊处理的可执行文件,而是创建一个结构正确的映像文件,以便将它加载到反汇编器中进行深入分析。
3. 参见 http://www.woodmann.com/collaborative/tools/index.php/OllyDump 。
由模糊进程重建一个二进制映像,最困难的是如何恢复该程序的导入函数表。在模糊过程中,程序的导入表也往往被模糊处理。因此,去模糊过程还必须考虑将新近经过去模糊处理的进程链接到它正常运行所需的所有共享库和函数。通常,这个进程的唯一线索是该进程内存映像中的一个导入函数地址表。一般来说,在将一个经过去模糊处理的进程映像转储到一个文件中时,你需要采取步骤,设法在转储的进程映像中重建一个有效的导入表。为此,你需要修改转储映像的头部,使它指向一个新的导入表结构,这个导入表必须正确反映经过去模糊处理的原始程序的共享库依赖关系。MackT 开发的 ImpREC4 (Import REConstruction )实用工具是一款广受欢迎的工具,可用于自动完成这个任务。和进程转储一样,请记住,提取独立的可执行文件可能并不是你分析恶意程序的主要目的。相比于重建有效的头部和工作导入表,了解哪些函数已被解析以及这些函数的地址的存储位置要更为重要。
4. 参见 http://www.woodmann.com/collaborative/tools/index.php/ImpREC 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论