- 献词
- 致谢
- 前言
- 第一部分 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 交叉引用
17.2 构建插件
在 Windows 系统上,插件是有效的 DLL 文件(使用.plw 或.p64 扩展名);而在 Linux 和 Mac 系统上,插件是有效的共享对象文件(分别使用.plx/.plx64 、.pmc/.pmc64 扩展名)。构建插件可能是一个非常烦琐的任务,因为你必须正确配置所有构建设置,否则,构建过程极有可能会失败。SDK 中包含有大量样本插件,每个样本插件都有它自己的生成文件。这些生成文件全部使用 Windows 系统上的 Borland 构建工具创建而成。因此,如果你希望使用不同的工具,或在不同的平台上构建生成文件,你可能会面临一些挑战。SDK 自带的 install_ xxx.txt 文件介绍了如何通过 GUN make 和 gcc,使用/bin/idamake.pl 构建插件。idamake.pl 文件用于从 Borland 风格的生成文件生成一个 GNU make 风格的生成文件,然后调用 GNU make 构建插件。
要构建插件,我们的首选是使用简化版本的生成文件和 GNU 工具(通过 Windows 上的 MinGW)。你可以将代码清单 17-1 中的简化版本的生成文件直接应用到你的插件项目中。
代码清单 17-1 创建 IDA 插件的一个样本生成文件
#Set this variable to point to your SDK directory IDA_SDK=../../ PLATFORM=$(shell uname | cut -f 1 -d _) ifneq "$(PLATFORM)" "MINGW32" IDA=$(HOME)/ida endif #Set this variable to the desired name of your compiled plugin PROC=idabook_plugin ifeq "$(PLATFORM)" "MINGW32" PLATFORM_CFLAGS=-D__NT__ -D__IDP__ -DWIN32 -Os -fno-rtti PLATFORM_LDFLAGS=-shared –s LIBDIR=$(shell find ../../ -type d | grep -E "(lib|lib/)gcc.w32") ifeq ($(strip $(LIBDIR)),) LIBDIR=../../lib/x86_win_gcc_32 endif IDALIB=$(LIBDIR)/ida.a PLUGIN_EXT=.plw else ifeq "$(PLATFORM)" "Linux" PLATFORM_CFLAGS=-D__LINUX__ PLATFORM_LDFLAGS=-shared –s IDALIB=-lida IDADIR=-L$(IDA) PLUGIN_EXT=.plx else ifeq "$(PLATFORM)" "Darwin" PLATFORM_CFLAGS=-D__MAC__ PLATFORM_LDFLAGS=-dynamiclib IDALIB=-lida IDADIR=-L$(IDA)/idaq.app/Contents/MacOs PLUGIN_EXT=.pmc endif #Platform specific compiler flags CFLAGS=-Wextra -Os $(PLATFORM_CFLAGS) #Platform specific ld flags LDFLAGS=$(PLATFORM_LDFLAGS) #specify any additional libraries that you may need EXTRALIBS= # Destination directory for compiled plugins OUTDIR=$(IDA_SDK)bin/plugins/ #list out the object files in your project here OBJS=idabook_plugin.o BINARY=$(OUTDIR)$(PROC)$(PLUGIN_EXT) all: $(OUTDIR) $(BINARY) clean: -@rm *.o -@rm $(BINARY) $(OUTDIR): -@mkdir -p $(OUTDIR) CC=g++ INC=-I$(IDA_SDK)include/ %.o: %.cpp $(CC) -c $(CFLAGS) $(INC) $ -o $@ LD=g++ $(BINARY): $(OBJS) $(LD) $(LDFLAGS) -o $@ $(OBJS) $(IDADIR) $(IDALIB) $(EXTRALIBS) #change idabook_plugin below to the name of your plugin, make sure to add any #additional files that your plugin is dependent on idabook_plugin.o: idabook_plugin.cpp
前面的生成文件使用 uname
命令确定运行平台并相应地配置一些构建标志。通过将相关对象文件的名称附加到 $OBJS
变量的后面及生成文件的末尾,你可以向插件项目添加其他源文件。如果你的插件需要其他库,你应在 $EXTRALIBS
中指定库名称。 $IDA_SDK
变量用于指定 的位置,它可以使用绝对或相对路径。在这个例子中, $IDA_SDK
使用的是一个相对路径,表示 比插件目录高两个目录。这是为了与/plugins(本例中为/plugins/ idabook_plugin)中的插件项目保持一致。如果选择将插件项目目录放置在相对于 的其他位置,必须确保 $IDA_SDK
正确引用 。最后,前面例子的配置可以将已编译的插件成功地存储在/bin/plugins 目录中。需要记住的是,成功编译一个插件并不一定会安装这个插件。我们将在下一节中讨论插件安装。
install_visual.txt 文件讨论了如何使用微软的 Visual C++ Express 构建 IDA 模块。要使用 Visual Studio 2008 从零开始创建一个项目,请执行以下步骤。
选择 File▶New ▶Project 打开 New Project 对话框,如图 17-1 所示。
图 17-1 Visual Studio“新建项目”对话框
指定项目类型为 Visual C++/Win32,选择 Win32 Project 模板,并为你的项目提供名称和存储位置。通常,你会将新建的插件项目保存在/plugins 目录中,以将所有的插件保存在同一个位置。单击 OK 按钮后,Win32 Application Wizard(Win32 应用程序向导)出现。单击 Next 按钮进入 Application Setting 步骤,然后将 Application type 设置为 DLL ,将 Additional options 设置为 Empty project ,在单击 Finish 按钮之前,界面如图 17-2 所示。
图 17-2 Visual Studio Win32 应用程序向导
- 建立项目的基本框架后,必须进行其他一些设置。通过 Project ▶Properties 可打开如图 17-3 所示的对话框,并可访问 Visual Studio 2008 中的项目属性。只有你增加或编辑一个新文件,或增加一个现有文件,将一个源文件添加到项目中,C/C++ 配置选项才会生效。
图 17-3 Visual Studio“项目属性”对话框
需要修改的设置分布在对话框左侧的 Configuration Properties(配置属性)部分。在完成项目的过程中,设置属性的方式如图 17-3 所示。对于你在对话框左侧选择的每一类属性,对话框右侧都会显示一个可配置的属性列表。注意,属性类别分层显示。你可以通过文件选择、单行编辑、多行编辑或下拉列表选择来编辑属性。表 17-1 详细说明了创建插件项目时必须编辑的属性。
表 17-1 Visual Studio 插件配置值(32 位)
配置属性类别 | 特定的属性 | 属 性 值 |
---|---|---|
常规 | 输出目录 | 根据需要,通常为〈SDKDIR〉\bin\plugins |
C/C++▶常规 | 其他包含目录 | 添加<SDKDIR>\include |
C/C++▶预处理器年 | 预处理器定义 | 附加“;_NT_;_IDP_ ” |
C/C++▶代码生成 | 运行库 | 多线程〈发行版〉a |
多线程调试(调试版) | ||
(非 DLL 版本)b | ||
链接器▶常规 | 输出文件 | 更改扩展名为.plw |
链接器▶常规 | 其他库目录 | 添加\lib\x86_win_vc_32 c |
链接器▶输入 | 其他依赖关系 | 添加 ida.lib (取自\lib\86_win_vc_32 ) |
链接器▶命令行 | 其他选项 | 添加/EXPORT:PLUGIN |
a 这里的多线程指 C++ 运行库本身。IDA 碰巧是一个利用这个库的单线程应用程序。单线程版本的 C++ 运行库并不存在。
b 选择 DLL 版本的 C++ 库要求插件最终运行的系统中包含 MSVCR80.DLL 文件。为了消除这种限制,可选择非 DLL 版本的 C++ 运行库,它生成一个更加便携的静态链接插件。
c 在 SDK6.1 之前,添加库目录\lib\vc.w32。
值得注意的是,在 Visual Studio 中,你可以分别为项目的调试和发行版本指定配置选项(见图 17-3 左上角)。如果要为插件构建独立的调试和发行版本,请确保修改两种配置中的属性。另外,从 Configurations 下拉列表(Properties 对话框的左上角)中选择 All Configurations,可以为你节省一些时间,因为这时你对属性所做的修改将应用于所有构建配置。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论