- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
19.6 处理器模块体系结构
在着手设计处理器模块时,你需要考虑的一件事情是该处理器是否会与某个特定的加载器紧密耦合,或者是否能够与所有加载器解耦。以 x86 处理器模块为例,这个模块不对被反汇编的文件的类型做任何假设。因此,它可以与一系列加载器结合使用,如 PE、ELF 和 Mach-O 加载器。
同样,如果加载器能够独立于文件所使用的处理器而处理一种文件格式,则说明该加载器能够用于多种用途。例如,无论是包含 x86 代码或是 ARM 代码,PE 加载器都能正常运行;无论是包含 x86、MIPS 或 SPARC 代码,ELF 加载器都能正常运行;无论是包含 PPC 或 x86 代码,Mach-O 加载器都能正常运行。
实际中的 CPU 适用于创建不依赖于特定的输入文件格式的处理器模块。另一方面,虚拟机语言却造成更大的挑战。虽然有大量加载器(如 ELF 、a.out 和 PE 加载器)可用于加载在本地硬件上运行的代码,但虚拟机通常同时充当加载器和 CPU 。结果,对虚拟机来说,文件格式和基本的字节码密切相关,缺乏其中一方,另一方将不可能存在。在开发 Python 处理器模块的过程中,我们曾多次遇到这种限制。许多时候,如果对正被反汇编的文件的布局缺乏更加深入的了解,我们将很难生成更具可读性的输出。
为了使 Python 处理器能够访问它所需要的其他信息,我们可以构建一个 Python 加载器,以特定 Python 处理器的方式配置数据库,以便 Python 处理器知道到底在什么地方找到它需要的信息。在这种情况下,加载器需要向处理器传递大量加载器状态数据。其中一种方法是将这些数据存储在数据库网络节点中,随后,处理器模块可以获取这些数据。
另外,也可以构建一个只可以识别.pyc 文件的加载器,然后把所有加载任务交给处理器模块来完成,这样,处理器肯定知道如何定位反汇编.pyc 文件所需的全部信息。
通过允许加载器将所有加载操作“委派”给相关的处理器模块,IDA 帮助我们创建紧密耦合的加载器和处理器模块。SDK 中的 Java 加载器和 Java 处理器模块就是以这种方式创建的。要想使加载器能够将加载任务委派给处理器模块,加载器必须首先通过返回 f_LOADER
的文件类型(在 ida.hpp 中定义)接受一个文件。如果加载器由用户选择,则加载器的 load_file
函数应确保在必要时通过调用 set_processor_type
(见 idp.hpp)指定正确的处理器类型,然后向该处理器发送一条加载器通知消息。为构建一个紧密耦合的 Python 加载器/ 处理器组合,我们应使用下面的 load_file
函数构建加载器:
void idaapi load_file(linput_t *li, ushort neflag, const char *) { if (ph.id != PLFM_PYTHON) { //shared processor ID set_processor_type("python", SETPROC_ALL|SETPROC_FATAL); } //tell the python processor module to do the loading for us //by sending the processor_t::loader notification message if (ph.notify(processor_t::loader, li, neflag)) { error("Python processor/loader failed"); } }
处理器模块收到 loader
通知时,它将负责将输入文件映射到数据库中,并确保它能够访问它在 ana、emu
和 out
阶段所需的任何信息。读者可以在本书的配套网站上找到一个以这种方式运行的 Python 加载器和处理器组合。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论