关于IDAPython的实际应用和理解

常用的函数以及解释说明

  1. AskFile AskFile(forsave, mask,prompt)这个函数,当 forsave 参数为 0,打开一个文件对话框,当 forsave 的参数为 1,打
    开一个文件保存对话框, mask 用来指定文件后缀或者模式;
  2. idautils.XrefsTo(ea,flow) 获取所有调用了ea这个地方的地址,无论你是数据还是指令都会找到.应该是最有用的函数了,没有之一;

自己写的一个提取特定函数的参数的IDApython 脚本

def GetTextID(funcName):
    Sc_func_addr = idc.LocByName(funcName)
    #打开一个文件进行保存
    exportFile = idc.AskFile(1, "*.*", 'Export Buffer')
    f = open(exportFile, 'wb')

    for xref in idautils.XrefsTo(Sc_func_addr):
        addr = int(hex(xref.frm).replace("L",""),16)
        curAddr = addr
        imm = 0;
        prevAddr = addr
        nextAddr = addr
        for i in range(0,4):
            prevAddr = idc.PrevHead(prevAddr)
            #f.writelines(str(prevAddr) + "\n")
            if  idc.GetOpnd(prevAddr,0) == "R0" and (idc.GetDisasm(prevAddr).__contains__("LDR") or idc.GetDisasm(prevAddr).__contains__("MOV")):
                if not idc.GetOpnd(prevAddr,1).__contains__("SP"):
                    f.write("type:"+str(idc.GetOpType(nextAddr,1))+"\t" +hex(xref.frm).replace("L", "") + "\t\t" +hex(prevAddr)+ "\t\t"+
                        idc.GetOpnd(prevAddr, 1).replace("=", "") + "\n")


        for j in range(0, 4):
            #f.writelines(str(nextAddr)+"\n")
            #f.writelines(str(nextAddr) + "\n")
            nextAddr = idc.NextHead(nextAddr)
            if idc.GetOpnd(nextAddr,0) == "R0" and (idc.GetDisasm(nextAddr).__contains__("LDR") or idc.GetDisasm(nextAddr).__contains__("MOV")):
                if not idc.GetOpnd(nextAddr,1).__contains__("SP"):
                    f.write("type:"+str(idc.GetOpType(nextAddr,1))+"\t" +hex(xref.frm).replace("L", "") + "\t\t" +hex(nextAddr)+ "\t\t"+
                        idc.GetOpnd(nextAddr, 1).replace("=", "") + "\n")

总结

将函数的名称当成参数传到GetTextID 中 就能自动获取到这个函数的参数了 这个是我根据ARM汇编的一些参数传递的规则和汇编语法的规律得出来的代码 然后利用IDA的库函数去处理这样的逻辑 如果是换成x86汇编 或者是函数参数大于3个的话可能会不准确

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值