def Functions(start=None, end=None): """ Get a list of functions @param start: start address (default: inf.min_ea) @param end: end address (default: inf.max_ea) @return: list of heads between start and end @note: The last function that starts before 'end' is included even if it extends beyond 'end'. Any function that has its chunks scattered in multiple segments will be reported multiple times, once in each segment as they are listed. """ if not start: start = ida_ida.cvar.inf.min_ea if not end: end = ida_ida.cvar.inf.max_ea # find first function head chunk in the range chunk = ida_funcs.get_fchunk(start) if not chunk: chunk = ida_funcs.get_next_fchunk(start) while chunk and chunk.start_ea < end and (chunk.flags & ida_funcs.FUNC_TAIL) != 0: chunk = ida_funcs.get_next_fchunk(chunk.start_ea) func = chunk while func and func.start_ea < end: startea = func.start_ea yield startea func = ida_funcs.get_next_func(startea)
def __process_functions(self): functions = list() start = ida_ida.cvar.inf.min_ea end = ida_ida.cvar.inf.max_ea # find first function head chunk in the range chunk = ida_funcs.get_fchunk(start) if not chunk: chunk = ida_funcs.get_next_fchunk(start) while chunk and chunk.start_ea < end and (chunk.flags & ida_funcs.FUNC_TAIL) != 0: chunk = ida_funcs.get_next_fchunk(chunk.start_ea) func = chunk while func and func.start_ea < end: start_ea = func.start_ea func_flags = ida_bytes.get_full_flags(start_ea) func_name = ida_funcs.get_func_name(start_ea) func_name_demangled = ida_name.get_demangled_name( start_ea, 0xFFFF, 0, 0) func_autonamed = func_flags & ida_bytes.FF_LABL != 0 func_public = ida_name.is_public_name(start_ea) function = { 'start_rva': start_ea - self._base, 'name': func_name, 'name_demangled': func_name_demangled, 'is_public': func_public, 'is_autonamed': func_autonamed } # PE32/PE32+ only support binaries up to 2GB if function['start_rva'] >= 2**32: print('RVA out of range for function: ' + function['name'], file=sys.stderr) self.__process_function_typeinfo(function, func) function['labels'] = self.__process_function_labels(func) functions.append(function) func = ida_funcs.get_next_func(start_ea) return functions
def processFunctions(): functions = list() start = ida_ida.cvar.inf.min_ea end = ida_ida.cvar.inf.max_ea # find first function head chunk in the range chunk = ida_funcs.get_fchunk(start) if not chunk: chunk = ida_funcs.get_next_fchunk(start) while chunk and chunk.start_ea < end and (chunk.flags & ida_funcs.FUNC_TAIL) != 0: chunk = ida_funcs.get_next_fchunk(chunk.start_ea) func = chunk while func and func.start_ea < end: start_ea = func.start_ea flags = ida_bytes.get_full_flags(start_ea) function = { 'start_ea': start_ea, 'name': ida_funcs.get_func_name(start_ea), 'is_public': ida_name.is_public_name(start_ea), 'is_autonamed': flags & ida_bytes.FF_LABL != 0 } processFunctionTypeinfo(function) functions.append(function) func = ida_funcs.get_next_func(start_ea) return functions