def dump_tails(pfn): "dump function tails for entry chunk pfn" assert ida_funcs.is_func_entry(pfn) print("Function has %d tails" % pfn.tailqty) for i in range(pfn.tailqty): ft = pfn.tails[i] print(" tail %i: %08X..%08X" % (i, ft.start_ea, ft.end_ea))
def dump_regvars(pfn): "dump renamed registers information" assert ida_funcs.is_func_entry(pfn) print("Function has %d renamed registers" % pfn.regvarqty) for rv in pfn.regvars: print("%08X..%08X '%s'->'%s'" % (rv.start_ea, rv.end_ea, rv.canon, rv.user))
def dump_frame(fn): "dump function frame info" assert ida_funcs.is_func_entry(fn) print("frame structure id: %08X" % fn.frame) print("local variables area size: %8X" % fn.frsize) print("saved registers area size: %8X" % fn.frregs) print("bytes purged on return : %8X" % fn.argsize) print("frame pointer delta : %8X" % fn.fpd)
def dump_regargs(pfn): "dump register arguments information" assert ida_funcs.is_func_entry(pfn) print("Function has %d register arguments" % pfn.regargqty) for ra in pfn.regargs: print( " register #=%d, argument name=\"%s\", (serialized) type=\"%s\"" % (ra.reg, ra.name, binascii.hexlify(ra.type)))
def dump_func_info(ea): "dump info about function chunk at address 'ea'" pfn = ida_funcs.get_fchunk(ea) if pfn is None: print("No function at %08X!" % ea) return print("current chunk boundaries: %08X..%08X" % (pfn.start_ea, pfn.end_ea)) dump_flags(pfn) if (ida_funcs.is_func_entry(pfn)): print("This is an entry chunk") dump_tails(pfn) dump_frame(pfn) dump_regvars(pfn) dump_regargs(pfn) dump_stkpnts(pfn) elif (ida_funcs.is_func_tail(pfn)): print("This is a tail chunk") dump_parents(pfn)