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静态分析函数调用路径