- 献词
- 致谢
- 前言
- 第一部分 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.1 SDK 简介
SDK 的发布方式与我们之前讨论的 IDA 几乎完全相同。你可以在最初的 IDA 光盘中找到包含 SDK 的 Zip 文件,被授权用户也可以从 Hex-Rays 网站下载 SDK 。SDK 的每一个版本都以与其兼容的 IDA 版本命名(例如,idasdk61.zip 适用于 IDA 6.1 版)。与 IDA 的其他工具一样,IDA 最大限度地简化了与 SDK 有关的文档资料。与 SDK 有关的文档资料包括一个顶级 readme.txt 文件,以及其他针对插件、处理器模块和加载器的 README 文件。
SDK 定义模块用于与 IDA 交互的各种已发布编程接口。在 SDK 4.9 版之前,由于这些接口发生变化,一个能够在 SDK 4.8 中成功编译的模块,如果不加以修改,将无法在新版 SDK (如 4.9 版)中编译,这种情况并不少见。随着 SDK 4.9 版的引入,Hex-Rays 决定对现有的 API 进行标准化,这表示,要使用新版 SDK 成功编译,模块不仅不需要经过修改,而且,模块还能与新版 IDA 二进制兼容。这意味着,每次 IDA 发布新版本时,模块用户不再需要等待模块开发者更新他们的源代码,或为他们的模块提供更新的二进制版本。但是,这并不表示现有的 API 接口被完全“冻结”。Hex-Rays 会继续通过新版的 SDK 推出新功能。(也就是说,每个新版的 SDK 都是其之前所有版本的集合)通常,这些最新功能的模块无法与旧版的 IDA 或 SDK 兼容。(也就是说,有时候一些函数可能因为各种原因被重命名或被标记为废弃。SDK 提供各种宏以允许或禁止使用废弃的函数,因此如果某个函数被废弃,你很容易就会注意到这种情况。)
16.1.1 安装 SDK
在 5.4 版本之前,包含 SDK 的 Zip 文件并不提供顶级目录。因为 SDK 的几个子目录的名称与 IDA 的子目录的名称相同,因此,强烈建议你创建一个专用的 SDK 目录(比如 idasdk53 ),并将 SDK 文件提取到这个目录中。这使得你更容易将 SDK 组件与 IDA 组件区分开来。在 5.4 版本之前,IDASDK 在顶级 SDK 目录(比如 idasdk61 )中打包,因此不再需要这一步。你没有必要将 SDK 安装到<IDADIR> 中的指定位置。无论在哪安装 SDK ,在本书的剩余部分,我们将统一把<SDKDIR> 作为 SDK 的安装目录。
16.1.2 SDK 的布局
基本了解 SDK 目录的结构,不仅有助于你找到 SDK 文档,而且可帮助你找到构建的模块的位置。下面逐个介绍 SDK 目录。
bin 目录 。这个目录是示例构建脚本在成功构建后保存其编译模块的位置。要安装一个模块,你需要将该模块由 bin 下的相应子目录复制到<IDADIR> 下的相应子目录中。模块安装将在第 17 章~第 19 章详细讨论。这个目录还包含一个创建处理器模块所需的后续处理工具(post-processing tool)。
etc 目录 。这个目录包含构建一些 SDK 模块所需的两个实用工具的源代码。SDK 还提供这些实用工具的编译版本。
include 目录 。这个目录包含定义 IDA API 接口的头文件。简而言之,可以使用的每一种 API 数据结构和可以调用的每一个 API 函数都在这个目录中的头文件中声明。SDK 的顶级 readme.txt 文件简要介绍了这个目录中的一些较为常用的头文件。这个目录中的文件大部分属于 SDK 的文档。
ldr 目录 。这个目录包含几个加载器模块的源代码和构建脚本。加载器的 README 文件不过是这个目录的内容纲要。
lib 目录 。这个目录中包含许多子目录,其中分别包含构建各种 IDA 模块所需的链接库。这些子目录根据它们所针对的编译器进行命名。例如,x86_win_vc_32(6.1 及更高版本)或 vc.w32 (6.0 及较低版本)子目录包含用于 Visual Studio 和 Windows 上的 32 位 IDA 的库,而 x64_mac_gcc_64(6.1 及更高版本)或 gcc64.mac64(6.0 及较低版本)子目录包含用于 OS X 上的 64 位 IDA 的库。
module 目录 。这个目录包含几个示例处理器模块的源代码和构建脚本。处理器模块的 README 文件不过是这个目录的内容纲要。
plug-ins 目录 。这个目录包含几个示例插件模块的源代码和构建脚本。插件的 README 文件提供了插件体系结构的总体概述。
顶级目录 。SDK 的顶级目录包含几个用于构建模块的生成文件,以及 SDK 的主要 readme.txt 文件。其他几个 install_xxx.txt 文件包含与安装和配置各种编译器有关的信息(例如,install_visual.txt 讨论了 Visual Studio 配置)。
记住,有关如何使用 SDK 的文档非常稀少。多数开发者主要通过反复试验、发现错误和深入探索 SDK 的内容来获得有关 SDK 的知识。你也可以将问题张贴到 Hex-Rays 支持论坛的 Research & Resources (研究与资源)论坛中,如果幸运的话,其他熟悉 SDK 的 IDA 用户可能会回答你的问题。Steve Micallef 所著的 IDA Plug-in Writing in C/C++1 是介绍 SDK 和插件编写的优秀第三方资源。
1. 参见 http://www.binarypool.com/idapluginwriting/ 。
16.1.3 配置构建环境
使用 SDK 的一个令人沮丧的经历与编程根本无关。但你会发现,编写一个问题的解决方案代码相对较为容易,但要成功构建你的模块,却几乎不可能做到。事实确实如此,因为仅仅使用一个代码库,你很难为大量编译器提供支持。使情况更加复杂的是,Windows 编译器认可的库文件格式往往彼此并不兼容。
创建 SDK 中的所有示例的目的是为了使用 Borland 工具构建它们。在 install_make.txt 中,我们发现以下引自 Ilfak 的话:
WIN32 只能由 Borland C++ CBuilder v4.0 创建。可能使用旧版的 BCC v5.2 也行,但我没有验证。
也就是说,其他 install_xxx 文件提供了如何使用其他编译器成功构建模块的信息。一些示例模块包含使用 Visual Studio 构建的文件(例如,<SDKDIR>/plugins/vcsample),而 install_visual.txt 提供了一系列步骤,可以使用 Visual C++ Express 2005 正确配置 SDK 项目。
为了使用 Unix 风格的工具、在一种 Unix 风格的系统(如 Linux)上或使用 MinGW 之类的环境构建模块,SDK 提供了一个名为 idamake.pl 的脚本,它可在开始构建过程之前,将 Borland 风格的生成文件转换成 Unix 风格的生成文件。这个过程由 install_linux.txt 文件描述。
说明 SDK 自带的命令行构建脚本要求一个名为 IDA 的环境变量指向<SDKDIR> 。你可以通过编辑<SDKDIR>/allmake.mak 和<SDKDIR>/allmake.unx 文件设置这个变量,或在你的全局环境中添加一个 IDA 环境变量,为所有脚本设置这个变量。
Steve Micallef 的指南还提供了有关配置构建环境的详细说明,以使用各种编译器构建插件。在为 Windows 版本的 IDA 构建 SDK 模块时,我们偏好于使用 MinGW 工具 gcc 和 make。第 17 章~第 19 章所举的例子中包括一些并不依赖 SDK 自带的任何构建脚本的生成文件和 Visual Studio 项目文件,你可以轻松对它们进行修改,以满足自己的项目要求。特定于模块的构建配置将分别在这 3 章中讨论。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论