Files
idapython-src/api-examples/func/decompile_func_and_callees.py
2025-03-13 16:17:53 +01:00

76 lines
1.9 KiB
Python

import idautils
import ida_kernwin
import ida_funcs
import ida_ua
import ida_allins
import ida_ida
import ida_hexrays
import ida_lines
import idc
def build_function_list(func):
func_list = []
items = ida_funcs.func_item_iterator_t(func)
for item in items:
is_jmp = False
insn = ida_ua.insn_t()
if not ida_ua.decode_insn(insn, item):
continue
if not insn.itype == ida_allins.NN_call and not insn.itype == ida_allins.NN_jmp:
continue
if insn.itype == ida_allins.NN_jmp:
is_jmp = True
for xref in idautils.CodeRefsFrom(item, 0):
callee = ida_funcs.get_func(xref)
if not callee:
print(f'Unable to retrieve function object for {xref:x}. Skipping.')
continue
if is_jmp and callee.start_ea == func.start_ea:
continue
if callee not in func_list:
func_list.append(callee)
return func_list
def print_pseudo_code(cfunc):
sv = cfunc.get_pseudocode()
for sline in sv:
print(ida_lines.tag_remove(sline.line))
print('')
def decompile_and_print(func):
func_list = build_function_list(func)
func_list = [func, *func_list]
for item in func_list:
cfunc = ida_hexrays.decompile(item)
if not cfunc:
print(f'Unable to decompile function {ida_funcs.get_func_name(item.start_ea)}')
return False
print_pseudo_code(cfunc)
def main():
if not ida_ida.inf_get_procname() == 'metapc':
return False
if not ida_hexrays.init_hexrays_plugin():
return False
func = ida_funcs.get_func(idc.here())
if not func:
print('Please put the cursor inside a function and retry.')
decompile_and_print(func)
ida_kernwin.msg_clear()
main()