当前位置: 首页 > 工具软件 > IDAPython > 使用案例 >

关于IDAPython的实际应用和理解

庄经国
2023-12-01

常用的函数以及解释说明

  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个的话可能会不准确

 类似资料: