IDA自动化分析

0x00 : 需求

​ 最近有一些自动化分析bin中调用路径的需求,在查询了一些资料后,组合了一些现有方案,最终完成了自己的这个小工具。

​ 具体需求:

-    自动分析,后台跑
-    分析给定的函数调用路径

0x01 : code

python模版

1
2
3
4
5
idc.Wait() # 等待分析完

.... # 分析工作

idc.Exit(0) # 完成后自动退出

运行

1
"/Applications/IDA Pro 7.0/ida64.app/Contents/MacOS/ida64" -c -A -S"scan.py" bin

分析调用路径

这部分直接用了利用IDA Python静态分析函数调用路径里的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def gen_r_call_chain(func_name, osintneting):
del r_call_chain[:]
f_r_call_out = open('call_{0}_{1}.csv'.format(cur_bin_filename, func_name), 'w')
get_my_caller(func_name, osintneting, f_r_call_out)
f_r_call_out.close()


def get_my_caller(func_name, osintneting, fl):
if ida_kernwin.user_cancelled():
print('Cancelled')
fl.close()
exit()

str = '{0}\t'.format(func_name)
r_call_chain.append(str)
addr = get_name_ea(0, func_name)
addr_ref_to = get_first_fcref_to(addr)

osinteneting_end = False
if addr_ref_to == BADADDR:
osinteneting_end = True
elif osintneting == -1:
osinteneting_end = False
elif osintneting == 1:
osinteneting_end = True
if osinteneting_end is True:
length = len(r_call_chain)
for idx in range(length):
fl.write(r_call_chain[length - idx - 1])
sys.stdout.write(r_call_chain[length - idx - 1])
fl.write("\n")
sys.stdout.write('\r\n')
r_call_chain.pop()
return

while (addr_ref_to != BADADDR) and (addr_ref_to != addr):
parent_func_name = get_func_name(addr_ref_to)
get_my_caller(parent_func_name, osintneting - 1, fl)
addr_ref_to = get_next_fcref_to(addr, addr_ref_to)
if addr_ref_to == BADADDR:
r_call_chain.pop()
break

##0x03 : reference

命令行调用 idapython 脚本

利用IDA Python静态分析函数调用路径