天天看点

IDA pro使用笔记1. 函数IDAPython批量处理脚本

IDAPython常用api使用

  • 1. 函数
    • 1.1 获取函数的名称
    • 1.2 获取函数起始地址
    • 1.3 获取函数的反汇编代码
    • 1.4 判断函数是否为库函数
        • 九种返回值类型
  • IDAPython批量处理脚本

ida pro 6.6版本 idapython 2.7.2

1. 函数

idautils.Functions列举出已知的函数,返回一个list对象,每个item是一个函数的首地址,

idc.GetFunctionName(func) 获取函数名称

1.1 获取函数的名称

import idautils
for func in idautils.Functions():
    print hex(func),idc.GetFunctionName(func)
           
IDA pro使用笔记1. 函数IDAPython批量处理脚本

1.2 获取函数起始地址

import idautils
for func in idautils.Functions():
    #print hex(func),idc.GetFunctionName(func)
    func=idaapi.get_func(func)
    start = func.startEA
    end =func.endEA
    print('start: 0x%x end:0x%x' %(start,end))
           
IDA pro使用笔记1. 函数IDAPython批量处理脚本

1.3 获取函数的反汇编代码

import idautils
for func in idautils.Functions():
    print hex(func),idc.GetFunctionName(func)
    func=idaapi.get_func(func)
    start = func.startEA
    end =func.endEA
    #print('start: 0x%x end:0x%x' %(start,end))
    cur_addr = start
    while cur_addr <= end: 
        print hex(cur_addr), idc.GetDisasm(cur_addr) #获取反汇编指令
        cur_addr = idc.NextHead(cur_addr, end) #读取下一条指令
           
IDA pro使用笔记1. 函数IDAPython批量处理脚本

1.4 判断函数是否为库函数

判断函数是否为库函数时,可以在静态分析时省略

idc.GetFunctionFlags(func)
返回函数类型, 有:FUNC_NORET、FUNC_FAR、FUNC_LIB、FUNC_STATIC、FUNC_FRAME、FUNC_USERFAR、FUNC_HIDDEN、FUNC_THUNK、FUNC_BOTTOMBP等
           

九种返回值类型

  • FUNC_NORET ~~~~ 表示没有返回值的函数,值为0x1
  • FUNC_FAR ~~~~ 很少见到,值为0x2
  • FUNC_LIB ~~~~ 链接库函数,在做分析的时候经常可以忽略,值为0x4
  • FUNC_STATIC ~~~~ 静态函数,值为0x8
  • FUNC_FRAME ~~~~ 表示函数使用了结构指针ebp,值为0x10
  • FUNC_USERFAR ~~~~ 很少见到,值为0x20
  • FUNC_HIDDEN ~~~~ 隐藏函数,需要展开才能看见(不太懂),值为0x40
  • FUNC_THUNK ~~~~ 跳转到其他函数的函数,一般只有一个jmp指令,值为0x80
  • FUNC_BOTTOMBP ~~~~ 与FUNC_FRAME类似,该标志用于跟踪帧指针。它将识别帧指针等于堆栈指针的函数,值为0x100
#查找某种共操作数类型的指令
for func in idautils.Functions():
    flags=idc.GetFunctionFlags(func)
    #if flags & FUNC_LIB or flags & FUNC_THUNK:
        #continue
    dism_addr=list(idautils.FuncItems(func))
    for line in dism_addr:
        if idc.GetOpType(line,0) == o_phrase://o_reg  o_mem 
            print("0x%x %s"%(line,idc.GetDisasm(line)))

           

IDAPython批量处理脚本

https://blog.csdn.net/qq_35056292/article/details/89421793

继续阅读