用C/C++编写IDA插件
版权®2005 Steve Mical lefsteve@binarypool .com
用C/C++编写IDA插件
第一章入门
1 . 1为什么会有这本手册?
花了大量时间在IDA SDK中来阅读那些头文件 以及学习别人的插件源代码后我觉得应该有一个更简单的方法来开始IDA插件编写。尽管这些头文件中的注释十分翔实但我发现这样浏览和搜索这些注释有点困难 因为我需要它们时并不想通过大劳动量的搜索。我想我该写这样一本手册来帮助那些希望开始学习插件开发的朋友。因此我决定用一个篇章来介绍如何配置开发环境让您能更快速地入门。
1 .2涵盖的内容
这本手册将引导您开始编写IDA插件首先将介绍SDK然后是介绍在多个平台下配置插件开发环境。您将得到如何使用各种类和结构的经验接下来是介绍一些作用广泛的SDK导出函数。最后我将介绍如何使用IDA API来完成基本的任务例如用循环来分析函数钩挂调试器和操作IDA数据库文件IDB文件 。当您读完后您应该能运用自己的知识来编写您自己的插件希望您能通过社区把您的插件公布出来。
1 .3不包括的内容
尽管IDA的标准版和高级版支持许多其他的平台但我主要关注于x86平台因为我在这平台上面有最多的经验。因此如果您需要全面掌握所有的IDA函数我建议您去看看其它的那些头文件。
这本手册主要介绍的是“只读(read only)”函数而不大介绍其它的函数如添加注释错误校验定义结构等等函数。 SDK资料中的种类很庞大不介绍这些函数是想让手册体积适中。
我开始想介绍netnodes的概念可是因为IDA SDK的结构和类的成员很复杂而且还有很多特殊原因您知道的手册不会包含一切。如果您确实需要这些知识请您写信告诉我可能会在下一个手册版本中来介绍这些如果没别的特殊原因的话。
1 .4前置知识
首先最重要的是您应该掌握如何使用IDA这样您就能够舒服地浏览反汇编代码 以及配置调试器。还有您应该准备C/C++语言的知识最好还有x86汇编语言。在这里 C++是非常重要的因为SDK有相当多的C++代码。如果您对C++不熟悉但很精通C您应该至少理解OOP的概念如类对象方法以及继承。
1 .5居家旅行必备良药
编写、运行IDA插件您需要IDA pro反汇编器4. 8版或4.9版还有IDA SDK 您可以从http://www.datarescue.com处获得但需要IDA授权许可 ,以及一个C/C++编译器象Visual Studio GCC平台 Borland系列或其他的。
1
用C/C++编写IDA插件
请注意 4.9版中所做的一些改变 已经被写进手册了。而且对于
4.9版 SDK是稳定的 4.9版的一些函数将不会再改变也就是说给4.9版写的插件通常是二进制形式也可以在以后的版本中正常工作。
1 .6 C/C++之外的选择
如果您对C也不感冒那么可以看看IDAPython 它是一个函数集用高级语言Python封装了所有C++ API。要获取更多详细资料请去http://d-home.net/idapython。还有一份使用IDApython的手册在http://dkbza.org/idapython_intro.html里面有很多详尽的介绍作者是Ero Carrera。
还有一份介绍使用VB6和C#编写IDA插件的文章请登陆http://www.openrce.org/articles/full_view/13。
1 . 7关于这本手册
如果您有任何问题、建议或您发现一些错误请您告诉我 SteveMicallef邮箱是steve@binarypool.com。如果您真的从手册中读到对您有帮助的内容我仍然会写信感谢您这么做是非常值得的。
因为SDK会不断“长胖” 所以这本手册也会适时的升级。您将从这里http://www.binarypool.com/idapluginwriting/处获得最新版本的手册拷贝。
1 .8致谢
我必须感谢下面列出的朋友他们对本手册提供了审校、鼓励以及反馈下列牛人排名不分顺序
Iifak Guilfanov Pierre Vandevenne Eric Landuyt VitalyOsipov Sccott Madison Andrew Griffiths Thorsten Schneider和Pedram Amini。
1 .9其他资料
在手册的编写过程中参考了一份关于IDA插件的文档该文档介绍了如何使用4.9版的通用脱壳插件其中包括如何编写这种插件以及如何运行插件。它可以在http://www.datarescue.com/idabase/unpack_pe/unpacking.pdf处被找到。如果您对编写插件很积极您可以去Dataresuce的论坛去寻求帮助(http://www.dataresuce.com/cig-local/ultimatebb.cgi) 当没有官方支持的时候您可以向Datarescue的人或者IDA老手求助他们会乐意帮助您。
另一个非常棒的地方是http://www.openrce.org 在那儿您将不仅仅找到很多逆向工程方面的好文章还有工具插件以及文档。那儿还有牛人在论坛里他们将尽可能帮您解决IDA或者一般的逆向工程问题。
2
用C/C++编写IDA插件
第二章I DA SDK全局组织
IDA是一款非常好的反汇编器而且最近还发布了一个调试器。 IDA单独实现了很多了不起的功能可是有时候您可能需要实现一些IDA并没提供的功能 比如自动化或者做一些特殊的任务。另人欣慰的是发布IDA SDK的Dataresuce公司的那些哥们儿提供了一些接口供您自己扩展IDA的功能。
下面是您能够用IDA SDK编写的四种类型模块插件模块将是本手册的主题
上面的“插件(plug-in)”术语将代替“插件模块(plug-inmodule)”除非有特别说明。
IDA SDK包含了您需要编写IDA插件的所有头文件和库文件。还支持Linux和Win平台下很多的编译器而且还给出了一个插件例子的源代码用来示范一些简单的功能。
不管您是一位逆向工程师、漏洞研究员、病毒分析员或是身兼以上数职 SDK都提供了一个格外强大灵活的平台。您差不多都能用它编写您自己的调试器/反汇编器这当然是另人满意的。下面保守地列出了一些您能够用SDK做的事情
自动分析和脱壳。
自动搜索被使用的函数比如 LoadLibrary() , strcpy() 和
您想到的其他函数。
分析程序数据流寻找您感兴趣的东西。
二进制文件比对。
编写一个反编译器。
还有其他的功能„„
查看别的朋友用IDA SDK编写的插件代码请登陆IDA Palace网站地址是http://home.arcor.de/idapalace/。
3
用C/C++编写IDA插件
2. 1安装方法
很简单的。当您得到了SDK(一般都应该是. zip格式的文件) 解压缩它到您选择的目录。我通常是在IDA的安装目录下建立一个sdk目录把所有的玩意儿都放那儿但这不是很要紧的您也可以按您的想法办。
2.2 目录结构
我将探讨一些关于插件编写的内容 以及讨论它们的实质但不涉及所有SDK的内容。
XX表示32位或者64位这要看您所运行的平台架构。
2.3头文件介绍
在include 目录中的五十多个头文件中我发现很多常用于编写插件的头文件。如果您需要所有头文件中的说明信息可以看看SDK根目录下的readme. txt说明文档或者是头文件中自带的说明。下面这个列表只是简单描述了它们的大致功能更详细的介绍请参阅以后的章节。
用C/C++编写IDA插件
2.4使用SDK
大致来说头文件中的任何您能使用的函数都有一个前缀 ida_export而全局变量则冠以ida_export_data前缀。这点规矩是为了与底层函数(在头文件中也有定义)保持安全距离并且提供了一些封装好的高层函数。您还可以使用任何定义好的类、结构和枚举。
5
用C/C++编写IDA插件
第三章配置一个编译环境
开始编程之路前最好是有一个合适的环境 以使得开发过程简单容易。一般流行的环境都会被介绍如果您不是一般流行环境比如您是ENIAC的忠实用户那么我只能说抱歉了。如果您已经配置好了开发环境请从容地跳到下一章。
3. 1 Windows下使用Visual Studio
这里将用Visual Studio .NET 2003做示范一般也适用于这以后的版本可能也适应以前的版本。
一旦您的Visual Studio在运行请您关闭您可能打开的任何一个工程或方案我们需要一个完全干净的状态。
用C/C++编写IDA插件
3.2 Windows下使用GCC的Dev-C++和MinGW
您可以从http://www.bloodshed.net/dev/devcpp.html获取Dev-C++ GCC和MinGW的一个集合软件包。先安装并设置好现在假设一切都能正常工作。同上启动Dev-C++并确保没有其他的工程文件被打开我们需要一个纯净的状态。
3.3 Linux下使用GCC
Windows下的插件是.plw扩展名 Linux插件有所有不同是以.plx为扩展名。因此在示例中没有GUI IDE所以不再是一步步的配置过程我将只用Makefile来做示范下面的例子中可能并不是一个最纯净的Makefile但它应该能工作。
在这个示例中 IDA安装于/usr/local/idaadv SDK位于sdk子目录。把下面的Makefile放到您插件的源代码目录。
设置SRC为您的插件包含的源代码 以及OBJS为将要被编译的目标文件相同文件名仅仅是换了一个扩展名为.o
7
用C/C++编写IDA插件
SRC=file1.cpp file2.cpp
OBJS=file1.o file2.o
CC=g++
LD=g++
CFLAGS=-D__IDP__ -D__PLUGIN__ -c -D__LINUX__ \
-I/usr/local/idaadv/sdk/include $(SRC)
LDFLAGS=--shared $(OBJS) -L/usr/local/idaadv -lida \
--no-undefined -Wl,--version-script=./plugin. scriptall:
$(CC) $(CFLAGS)
$(LD) $(LDFLAGS) -o myplugin.plxcp myplugin.plx /usr/local/idaadv/plugins
要编译您的插件 make程序将完成这项任务再为您复制插件到IDA plugins目录。
3.4一份插件模板
IDA “钩挂(hooks in)”到您的插件是通过PLUGIN类来实现的而且一般来说是唯一需要被导出的一个对象因而能被IDA使用 。还有您应该通过#include预编译指令来包含一些基本的头文件例如 ida.hpp, idp.hpp和loader.hpp。
下面的模板可以作为您开始学习插件的一个开始。如果您将它粘贴到您的开发环境的一个文件里它应该能编译而且当在IDA里运行它的时候
Edit->Plugins->pluginname,或者直接按下定义的快键 它将在IDA的日志窗口中插入“Hello World”文本。
#include <ida.hpp>
#include <idp.hpp>
#include <loader.hpp>int IDAP_init(void)
{
//在这里做一些校验 以确保您的插件是被用在合适的环境里。
}void IDAP_term(void)
{
//当结束插件时一般您可以在此添加一点任务清理的代码。return;
}
//插件可以从plugins.cfg文件中被传进一个整型参数。
//当按下不同的热键或者菜单时您需要一个插件做不同
//的事情时这非常有用。void IDAP_run(int arg)
{
//插件的实体
8
Fiberia.io是个新站,跟ViridWeb.com同一家公司的,主要提供基于KVM架构的VPS主机,数据中心在荷兰Dronten。商家的主机价格不算贵,比如4GB内存套餐每月2.9美元起,采用SSD硬盘,1Gbps网络端口,提供IPv4+IPv6,支持PayPal付款,有7天退款承诺,感兴趣的可以试一试,年付有优惠但建议月付为宜。下面列出几款主机配置信息。CPU:1core内存:4GB硬盘:...
RAKsmart 商家这几年还是在做事情的,虽然他们家顺带做的VPS主机并不是主营业务,毕竟当下的基础云服务器竞争过于激烈,他们家主营业务的独立服务器。包括在去年开始有新增多个数据中心独立服务器,包括有10G带宽的不限流量的独立服务器。当然,如果有需要便宜VPS主机的他们家也是有的,比如有最低月付1.99美元的美国VPS主机,而且可选安装Windows系统。这里商家有提供下面六款六月份的活动便宜V...
tmhhost怎么样?tmhhost正在搞暑假大促销活动,全部是高端线路VPS,现在直接季付8折优惠,活动截止时间是8月31日。可选机房及线路有美国洛杉矶cn2 gia+200G高防、洛杉矶三网CN2 GIA、洛杉矶CERA机房CN2 GIA,日本软银(100M带宽)、香港BGP直连200M带宽、香港三网CN2 GIA、韩国双向CN2。点击进入:tmhhost官方网站地址tmhhost优惠码:Tm...