idapython 使用--一些函数用法

idapython 使用

  • idapro 7.5

本篇笔记来总结一下近期写idapython时使用到的一些idapython的函数用法

  • 通过变量名字找变量的二进制地址

    addr = get_name_ea_simple("outputfile")
    返回地址(int型)
    
  • 寻找程序的起始地址和结束地址

    min_ea = inf_get_min_ea() #起始地址
    max_ea = inf_get_max_ea() #结束地址
    
  • 寻找程序中指定段的起始地址和结束地址

    seg = get_segm_by_name(".text") #寻找.text段
    text_start = seg.start_ea #.text段的起始地址
    text_end = seg.end_ea     #.text段的结束地址
    
  • 数据交叉引用

    例如.got段中有名为outputfile的变量,通过数据交叉引用查看它在程序中的引用地址
    outlist = DataRefsTo(opt_addr)
    输入一个地址,返回一个可迭代对象,可以通过将outlist类型转换为list或者通过循环来查看里面的内容
    
  • 寻找程序中某个字符串的引用地址

    例如想找到含有“output”的地址
    while cur_addr < end_addr:
        cur_addr = idc.find_text(cur_addr,SEARCH_DOWN,0,0,"optarg")#FindText
        # 注意第五个参数需要写成字符串的形式,使用字符串变量的话会报错
        if cur_addr == BADADDR:
        	continue
        else:
        	print(cur_addr)
        cur_addr = idc.next_head(cur_addr)
    
  • 获取二进制中的所有函数

    funclist = Functions()
    
  • 通过某个地址来找到该地址所在的函数

    func = idaapi.get_func(addr1)
    
  • 根据某个地址来找到该地址所在函数的函数名称

    funcname = get_func_name(addr1)
    
  • 编译函数中所有的基本块

    fc = idaapi.FlowChart(func, flags=idaapi.FC_PREDS)
    for block in fc:#函数的所有块
        j = block.start_ea #块的起始地址
        while j < block.end_ea:#block.end_ea表示下一个块的起始地址
        	print(j)
        	j = idc.next_head(j,block.end_ea)#寻找下一条指令
    
  • 基本块指令的一些操作

    通过上面的代码可以来遍历基本块中的每条指令
    获得指令的汇编代码,输入是指令的地址
    asm = idc.GetDisam(j)
    获取指令操作符
    operandstr = print_insn_mnem(j)
    
    
  • 基本块的前驱和后继关系

    获取一个基本块的所有前驱基本块
    for pred in block.preds():
    	print(pred.start_ea)
    获取一个基本块的所有后继基本块
    for succ in block.succs():
    	print(succ.start_ea)
    
  • 获取switch case中每个case的地址

    在此之前,得到jmp eax(jump表)在程序中的地址 jmpaddr
    a = idaapi.get_switch_info(jmpaddr)
    loc = a.jumps
    element_num = a.get_jtable_size()
    element_size = a.get_jtable_element_size()
    for i in range(element_num):
    	#跳转表数组中每一项的地址
    	table_entry = loc+i*element_size
    	jmpto_entry = a.elbase + idc.get_wide_dword(table_entry)
    	#得到case在程序中的位置
    

本文为笔者在近期工作学习中所使用到的一些idapython的函数,如有代码错误或者标注不清的地方,希望大家在评论区批评指正,谢谢!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值