IDApython的应用
常用的函数以及解释说明
- AskFile AskFile(forsave, mask,prompt)这个函数,当 forsave 参数为 0,打开一个文件对话框,当 forsave 的参数为 1,打
开一个文件保存对话框, mask 用来指定文件后缀或者模式; - 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个的话可能会不准确