首页
社区
课程
招聘
[重发]一个快速查找叶节点函数的ida脚本,非常方便
发表于: 2013-9-7 10:03 9334

[重发]一个快速查找叶节点函数的ida脚本,非常方便

2013-9-7 10:03
9334

平日分析一个函数的功能时,为了弄清楚该函数的功能,总是不得不必须先行分析该函数调用的那些子函数的功能,但跳转到子函数去分析时,又要先行分析
该子函数调用的那些子函数,如此循环下去,不胜其烦。于是通常的办法都是从该函数的调用树最底层的函数(我称为叶节点函数)开始,一层一层往上分析。
然而找到该函数最终调用的那些叶节点函数又不方便,IDA倒是自带提供了一个交叉引用外部图形工具,可将一个函数的调用树直接画出来,然而画出来的图形
一团糟,很不清晰,所以我想到了用脚本代替,一次性直接找到那些叶节点函数

另一个需求是:一旦找到了那些叶节点函数,比如找到一个叶节点函数sub_444444,该函数除了调用一些知名的库函数外,不再调用其他函数。我习惯将所有找到
的分析完毕的所有叶节点函数更名为xy前缀形式的函数名,这样,下次再重复寻早那个高层函数的所有叶节点函数,这些所有已更名为xy前缀的原叶节点函数
就不再是叶节点了。(你可以修改脚本文件,将里面的xy字样替换成你喜欢的前缀名)

脚本使用方法:
将附件中的ida.idc文件放在ida安装目录下的idc目录中,替换即可(你自己先备份一下原来的ida.idc吧),然后启动IDA,将光标放在一个函数内部,按下Shift
+Alt+L快捷键,就可以一次性列举出该函数调用的所有叶节点函数了,当你逐个分析完那些叶节点函数后,更名为xy前缀,然后回到原高层函数内部,再次按快捷键
Shift+Alt+L,这个时候列举出的叶节点函数就是先前那些叶节点函数的上层函数了,如此循环,各个击破,嘿嘿

上次发的V1.1版本避免了直接递归函数造成的一直runing问题
但是形如:

void f1()
{
   f2();
}
void f()
{
  f1();
}
void f2()
{
   f();//实际上f间接递归调用了f2
   f1();//f1与f2之间交叉调用
}

这种相互的交叉和间接递归调用也会造成脚本一直runing的问题
V1.2版本已经纠正V1.1没注意到的这个问题
另外对于形如下面的这种残缺函数(Debug版尤其多),V1.1版本处理得也不是很好
f()
{
   指令
   指令
   指令
   ....
   jmp 外部函数
}

V1.2版本已纠正这些问题,你可以直接在WinMain()函数内部运行脚本,几秒钟就可以快速找到所有底层的叶节点函数,一般不会出现一直runing的问题
另外修改了脚本的结果输出方式,你可以双击消息窗口中的每一行跳转到对应的函数

另外附带的一个功能是:像VC一样,按 Ctrl+[ 快捷键可以一下子跳转到函数开头处,Ctrl+] 快捷键可以一下子跳转到函数结尾处

献给大家喽,有什么好的其他功能和不足,自己完善去吧,求致谢~
欢迎大家下载使用,使用过程中发现有什么问题请帖出来,请随时注意后面的脚本更新...


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (13)
雪    币: 813
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
鉴于有的函数是:
j___xxx
{
     jmp  外部实际的函数体
}
形式的函数名,这种J_函数本身不是库函数,但他jmp到的实际上就是库函数

j___strlen
{
     jmp  strlen
}

因此,凡是这种函数基本上都可认定为库函数(虽然他不具有库函数属性)
此楼的附件修正V1.2版本的这个问题,请最好使用这个版本,如果你觉得第一楼的版本也不错,就使用第一楼的附件吧
上传的附件:
2013-9-7 10:49
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
想法不错,期待继续改进
2013-9-7 11:13
0
雪    币: 131
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错,支持一下
2013-9-7 11:53
0
雪    币: 813
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
V1.3版本去掉了所有导入函数,
推荐使用这个版本,注意有的函数调用路径比较深,比如WinMain函数,因此脚本可能会运行很长
时间,应该不会不超过30秒,一般的中间层的函数,两三秒就出结果了
上传的附件:
2013-9-7 13:51
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
1.3 这个思路就不对了,很多时候,单单靠判断调用 库函数 就能模糊判断出当前函数的大概意图

应该打印出所有函数(遇相同调用的函数也一并按顺序打印),并且遇 jcc 还需要展开层次( 遇 jmp 直接归纳 )

这个脚本离实用暂时还有距离,楼主继续努力。。。。。。
2013-9-7 14:00
0
雪    币: 813
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
哪个版本体验较好,大家反馈一下哈
2013-9-7 14:00
0
雪    币: 813
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
有的函数调用的api函数多打几十个,把那些存根函数也列出来的话,输出列表会很长,不信你可以分析od的WinMain函数或者其他高层次函数
2013-9-7 14:04
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
9
我只用到了CTRL +[ ],哈哈哈

要是能在F5后的伪代码中也能这样跳就好了
2013-9-7 14:57
0
雪    币: 1906
活跃值: (712)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
多谢楼主分享了
2013-9-7 15:18
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
有没有超级F5,能从选定的proc反编译一直到其所调用的所有其他函数(叶子)输出到一个.c文件?
2013-9-8 17:01
0
雪    币: 813
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
昨两天有事忙别的去了,刚做的V1.4版本大力优化速度,可以直接从任意一个大型程序最顶层的WinMain函数开刀分析,不仅准确,而且秒出结果,强烈推荐~
上传的附件:
2013-9-11 17:01
0
雪    币: 233
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
函数指令遍历的代码是有问题的:如果函数由多个chunk组成,其中某些chunk位于函数返回指令所在chunk之后(inst>end),将无法遍历那些chunk。
2013-9-12 09:13
0
雪    币: 347
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
解析控制流,打印函数,6楼这个思路不错
2013-9-14 08:41
0
游客
登录 | 注册 方可回帖
返回
//