- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
18.5 其他加载器策略
如果花一些时间浏览 SDK 中的示例加载器,你将发现各种不同风格的加载器。Java 加载器(<SDKDIR>/ldr/javaldr)值得注意。对于某些文件格式来说,加载器与处理器模板之间的耦合非常松散。一旦加载器发现进入代码的入口点,处理器模块不需要其他信息,就能够正确反汇编这些代码。一些处理器模块可能需要大量与最初的源文件有关的信息,并且必须执行之前已经由加载器完成的许多解析任务。为了避免这种重复工作,加载器和处理器可能会以一种更加紧密耦合的方式配对。实际上,Java 加载器所采取的方法就是使用以下代码,将所有加载任务(那些通常由加载器的 load_file
函数完成的任务)交给处理器模块:
static void load_file(linput_t *li, ushort neflag, const char *) { if (ph.id != PLFM_JAVA) { set_processor_type("java", SETPROC_ALL | SETPROC_FATAL); } if (ph.notify(ph.loader, li, (bool)(neflag & NEF_LOPT))) { error("Internal error in loader<->module link"); } }
Java 加载器所做的唯一一件工作是确定处理器类型已被设置为 Java 处理器,之后,加载器将向处理器模块发送一条 ph.loader
(在 idp.hpp 中定义)通知消息,告诉处理器加载阶段已经启动。收到通知后,Java 处理器将接管加载任务,并在这个过程中获得大量内部状态信息。在执行反汇编任务时,处理器将重用这些信息。
这种策略是否对你有用,完全取决于你是否正开发加载器及相关的处理器模块,以及你是否认为处理器能够得益于访问传统上由加载器获取的信息(分段、文件头字段、调试信息等)。
由加载器向处理器模块传递状态信息的另一种方法是使用数据库网络节点。在加载阶段,加载器可能会在特定的网络节点中填入一些信息,供处理器模块在随后的反汇编阶段检索使用。需要注意的是,频繁访问数据库,以检索以这种方式存储的信息,其速度要比利用可用的 C++ 数据类型慢一些。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论