返回介绍

17.2 构建插件

发布于 2024-10-11 21:05:46 字数 5684 浏览 0 评论 0 收藏 0

在 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 从零开始创建一个项目,请执行以下步骤。

  1. 选择 File▶New ▶Project 打开 New Project 对话框,如图 17-1 所示。

    enter image description here

    图 17-1 Visual Studio“新建项目”对话框

  2. 指定项目类型为 Visual C++/Win32,选择 Win32 Project 模板,并为你的项目提供名称和存储位置。通常,你会将新建的插件项目保存在/plugins 目录中,以将所有的插件保存在同一个位置。单击 OK 按钮后,Win32 Application Wizard(Win32 应用程序向导)出现。单击 Next 按钮进入 Application Setting 步骤,然后将 Application type 设置为 DLL ,将 Additional options 设置为 Empty project ,在单击 Finish 按钮之前,界面如图 17-2 所示。

enter image description here

图 17-2 Visual Studio Win32 应用程序向导

  1. 建立项目的基本框架后,必须进行其他一些设置。通过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文