首页
社区
课程
招聘
[转帖]两个IDA PRO的插件:IDApython & IDAperl
发表于: 2006-11-23 16:26 18163

[转帖]两个IDA PRO的插件:IDApython & IDAperl

2006-11-23 16:26
18163
来自:http://www.team509.com/modules.php?name=News&file=article&sid=17

两个IDA PRO的插件:IDApython & IDAperl




wooshi@gmail.com




IDA PRO是目前应用最广的静态反汇编分析工具,功能十分强大,但其自带的IDC脚本语言却十分丑陋,写起脚本来非常不方便。有两位大牛就写了两个工具来方便大家编写IDC的脚本,一个是Gergely Erdelyi 写的IDApython,另一个是RedPlait 写的IDAperl。总的说来,IDApython写出来的脚本非常漂亮,也非常简单,但IDAperl有一项功能是IDApython不具有的,那就是IDAperl的脚本支持debug功能。下面我们分别简单的介绍一下这两个强大的插件。


IDApython


安装:非常简单,先安装python2.3,然后在这里下载IDApython:http://www.d-dome.net/idapython/,把IDApython安装包的里的python目录拷到IDA的目录下,把plugins/python.plw拷到IDA的plugins目录下,再在IDA的plugins/plugins.cfg文件中添加如下几行(添不添好像问题不大)


Execute_Python_File python Alt-9 0


Execute_Python_Statement python Alt-8 1


Execute_Python_ScriptBox python Alt-7 2


这时候IDA的edit菜单的plugins的子菜单下会出现一个IDApython的菜单,你可以通过这里运行你的python for IDA的脚本了。


遗憾的是,IDApython的文档严重缺乏,好在大部分的函数名字跟IDC脚本的函数相类似,新加的函数在源程序里有比较详细的注释,不过就算是这样,也比较让人头疼,没办法,只好自己慢慢摸索了。IDApython有三个py文件,idc.py中定义的函数与idc脚本的函数是对应的,idaapi.py中定义了很多class,使脚本具有了面向对象的特征,idautils.py中定义了一些高等函数,使相当大部分的IDC功能可以简单的表示出来。


下面以一个例子来对比一下IDApython的好处。这个例子搜索一个函数内部的索引,并打印出来,我们先用idc.py中定义的函数来一下:

from idc import *


ea = 0x4011f6 (一个函数的开始地址,这里idapython好像有点问题,应该用ChooseFunction,但老是说不对)
funcend = FindFuncEnd(ea)
for ea in range(ea,funcend):
x = Rfirst0(ea)
while x <> BADADDR :
Message( str(hex(x)) + " refers to " + Name(x) + " : " + str(hex(x)) + " ");
x = Rnext0(ea,x);
Message("End of output. ");



跟标准的IDC脚本比较一下:

#include






static main(){


auto ea,x,f_end;


ea = ChooseFunction("Select a function to parse:");


f_end = FindFuncEnd(ea);


Message(" *** Code References from " + GetFunctionName(ea) + " : " + atoa(ea) + " ");


for ( ea ; ea <= f_end; ea = NextAddr(ea) ) {


x = Rfirst0(ea);



while ( x != BADADDR) {


Message(atoa(ea) + " refers to " + Name(x) + " : " + atoa(x) + " ");


x = Rnext0(ea,x);


}


}


Message("End of output. ");


}






可以看出,idapython写出来的代码漂亮了不少,而且有个更重要的好处,我们可以使用python庞大的函数库,使我们的开发省力不少。

下面我们再用idaapi.py中定义的函数来一遍:

from idaapi import *


func = choose_func("test",1)
print "begin print refs"
for funcea in range(func.startEA,func.endEA):
ref = get_first_fcref_from(funcea)
while ref != BADADDR:
print " called from 0x%x(%s)" % (funcea,get_name(BADADDR,ref))

ref = get_next_fcref_from(funcea, ref)


最后用idautils.py函数来一次:

from idautils import *
func = choose_func("test",1)
print "begin print refs"
for funcea in range(func.startEA,func.endEA):
reflist = CodeRefsFrom(funcea,0)
for ref in reflist :

print " called from 0x%x(%s)" % (funcea,get_name(BADADDR,ref))

恩,好像说服力不够,不过可以看到这个例子还是有些面向对象的特征了。总之,有了idapython,特别是idaapi的面向对象的包装与idautils中的常用函数的使用简化,使我们的工作简单化了。好,下面我们介绍一下idaperl,这个东西难看一些,不过功能也十分强大。





IDAPerl
安装:不是很简单喔,先安装perl for windows,再到一个俄文的网站上去下载IDAperl: http://www.wasm.ru/pub/23/files/perl_src.zip,这些东西需要有相应的IDAsdk才能编译,我编译好了,放到了http://www.team509.com/download/tools/security/idaperl.rar,把pm/下的内容放到perl的lib里去,把perl_dbg.plw和rp_vc.plw拷到IDA4.7的plugins目录下,这样就可以了。这时候打开ida4.7的时候,选择一个pe的windows程序,就会弹出一个”perl script for


debugger”的对话框,就可以加载你的perl for debugger的脚本了,同时edit菜单的plugins子菜单会有embedded perl 菜单,这里你可以加载一般的非debugger的分析脚本。


使用:由于IDAPerl的主要特长在于debugger脚本的编写,我们也主要介绍这部分功能,其他一般的功能函数与IDC脚本的函数的名称基本上是一样的,就不多做介绍了。IDAperl定义了很多程序运行状态改变时的回调(callback)函数,比如说进程启动的时候它定义了CbProcessStart,你可以写一个函数叫这个名字,同时把你要在进程启动时你要做的工作写到这个函数里。IDAperl一共定义了如下的回调函数:


CbProcessStart (unsigned long p_id)--- 进程启动时


CbProcessExit (unsigned long p_id, int exit_code)--- 进程退出时


CbThreadStart (unsigned long t_id)--- 线程启动时,在主线程启动时,不调用


CbThreadExit(unsigned long t_id, int exit_code) ----线程退出时


CbLibraryLoad(struct deb_module *dm) --- modules加载时


CbLibraryUnload (char *name)--- modules卸载时


CbBpt(unsigned long t_id, unsigned long addr) --- 遇到断点时


CbException(unsigned long t_id, int code, unsigned long ea, char *info) --- 异常抛出时





IDA还定义了很多支撑函数来支撑这些功能:


ProcessQty ? 进程的数量


GetProcessInfo (n, out_hash) ? 进程的一些信息


ThreadQty ? 线程的数量


GetThreadN (n) -返回线程(句柄?)


ProcessState ? 返回进程状态


StartProcess (path, args, dir) ? 等价winexec


SuspendProcess ? 暂停目前调试的进程


ContinueProcess ?继续运行目前调试的进程


Exit_Proсess ? 退出进程


AttachProcess (р_id) ? 加载调试进程

DetachProcess ?卸载调试进程

SelectThread (t_id) ? 激活选择的线程


StepInto ? 步入


StepOver ? 步过


RunTo (addr) ? 运行到


StepUntilRet ? 运行到返回


BptQty ? 断点的数量


GetBptN (n, out_hash) ? 得到断点的一些信息,out_hash的关键字有:


Ea ? 断点地址


Size - 断点大小


Type - 断点类型


Pass_сount - 断点pass多少才激活


Flags - 断点的标志


GetBpt (ea, out_hash) ? 跟上面函数基本一样,不过第一个参数是地址。


AddBpt (ea, size, type) ? 加个断点


DelBpt (ea) ? 删掉断点


EnableBpt (ea) ? 激活断点


DisableBpt (ea) ? 禁止断点


Dbg_module (out_hash) ? 调试模块的信息


Modules_list (out_array) ? 返回调试进程的module信息


ThreadContext (t_id, kind_of_сontext, out_hash) ? 返回线程的上下文信息。


Set_DrX (t_id, reg_value) ?为调试寄存器赋值


Set_Gs (t_id, reg_value) ? 为 Gs 寄存器赋值


Set_Fs (t_id, reg_value) -为 Fs 寄存器赋值


Set_Es (t_id, reg_value) -为 Es 寄存器赋值


Set_Ds (t_id, reg_value) -为 Ds 寄存器赋值

Set_Cs (t_id, reg_value) -为 Cs 寄存器赋值

Set_Ss (t_id, reg_value) -为 Ss 寄存器赋值.


Set_Efl (t_id, reg_value) ? 为标志寄存器赋值


Set_REG (t_id, reg_value) 为通用寄存器(Edi, Esi, Ebx, Edx, Ecx, Eax, Ebp, Esp or Eip)赋值。


怎么样,功能还是很强大吧?下面我们给出个例子来说明这个工具的妙用。


这个例子在程序运行时,在各种条件触发下,往test.log文件里写记录。




use IDA;
use IDADbg;
sub cbBpt
{
my( $tid,$addr) = @_;

printf(FILE "cpBpt instruction:%s ",GetMnem($addr)); #这里可以看出可以调用Idc的处理函数,非常好

my $context;
if ( ThreadContext($t_id, CONTEXT_ALL, $context) ) #得到当时的context信息
{
my $reg;
# dump all registers values
foreach $reg ( keys %$context )
{
printf(FILE "%s .eq. %X ", uc($reg), $context->{$reg} ); #把寄存器信息存入文件
}

}

}



sub cbThreadExit
{
printf(FILE "cbThreadExit ");
}
sub cbThreadStart
{
printf(FILE "cbThreadStart ");
}
sub cbProcessExit
{
printf(FILE "cbProcessExit ");
close(FILE);
}
sub cbProcessStart
{
open(FILE, ">d:test.log") or die("Cannot open test.log");
printf(FILE "cbProcessStart ");


}





从上面的例子可以看到, 在debug脚本里可以调用强大的perl包装的IDC脚本函数,可以对程序进行比较深入的研究了。





参考:


http://www.wasm.ru/article.php?article=ida_perl



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 5275
活跃值: (456)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
2
好东西
2006-11-23 20:13
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
看来还得学PYTHON了,曾经放弃过。。。。。。。。
2007-5-19 10:57
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来还得学PYTHON了,曾经放弃过。。。。。。。。
2007-5-19 11:12
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
5
我连最丑陋的IDC都还不会
2007-5-21 14:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
下载用看看再说
2007-6-9 17:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我连什么不会.怎么学呢.
2007-6-29 10:10
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
好东西,支持哈~~
2007-6-29 12:09
0
雪    币: 220
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主:“http://www.team509.com/download/tools/security/idaperl.rar”这个地址已经不能下载了!能否上传?
2007-10-27 14:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
thanks
2008-1-22 18:19
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主:“http://www.team509.com/download/tools/security/idaperl.rar”这个地址已经不能下载了!能否上传?
2017-1-15 09:52
0
游客
登录 | 注册 方可回帖
返回
//