- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
第 16 章 IDA 软件开发工具包
在本书中,我们经常使用“IDA 这样做”和“IDA 那样做”之类的短语。虽然 IDA 确实能够帮助我们做大量工作,但是,确切地说,它的智能要归功于它依赖的各种模块。例如处理器模块,它负责做出分析阶段的各种决策。因此,你可以说,IDA 不过和它所依赖的处理器模块一样聪明。当然,Hex-Rays 付出了巨大的努力,以确保它的处理器模块始终具有强大的功能。对于一般用户而言,IDA 的模块体系结构完全隐藏在它的用户界面之下。
有时候,你可能需要比 IDC 脚本语言更加强大的功能,不管是为了提高性能,还是为了完成 IDC 无法完成的任务。这时,你需要使用 IDA 的 SDK (软件开发工具包)构建你自己的编译模块,以供 IDA 使用。
说明 IDC 脚本引擎以 IDA 的 SDK 为基础。所有 IDC 函数最终都需要调用一个或几个 SDK 函数;由后者完成具体的工作。有时你可以用 IDC 完成一项任务,也可以使用 SDK 完成相同的任务,但这句话倒过来说却不一定正确。与 IDC 相比,SDK 的功能更加强大;而且许多 SDK 操作都没有对应的 IDC 操作。
SDK 以 C++ 库和连接这些库所需的头文件的形式呈现 IDA 的内部编程接口。使用 SDK ,你可以创建加载器模块以处理新的文件格式,创建处理器模块以反汇编新的 CPU 指令集,或者创建用于替代脚本的已编译的、更加强大的插件模块。
附加说明
在使用 C++ 时,你当然会访问大量 C++ 库,包括操作系统的本地 API。利用这些库,你可以将大量复杂的功能合并到你构建的模块中。但是,在选择以这种方式合并的功能时,你需要特别小心,因为这样做可能会使 IDA 变得不够稳定。最典型的例子是,IDA 是一款单线程应用程序,它没有做出任何努力来同步对低级数据库结构的访问,SDK 也不提供完成这类任务的工具。对于 IDA 5.5 之前的版本,你绝不能创建其他同时访问数据库的线程。对于版本 5.5 及更高版本,你可以创建其他线程,但对 SDK 函数的任何调用都应使用在 kernwin.hpp 中介绍的
exec_request_t
和execute_sync
函数进行排队。你应该认识到,你执行的任何阻塞操作1 都会使 IDA 停止响应,直到该操作完成。
1. 阻塞操作是使程序在等待一项操作完成时停止运行的操作。
在本章中,我们将介绍 SDK 的一些核心功能。你会发现,在创建插件、加载器模块或处理器模块时,这些功能很有用。因为我们将在后面 3 章中分别介绍这些模块,因此,在本章的例子中,我们将不介绍它们的应用。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论