def apply_kallsyms(kallsyms): for address, name in kallsyms: if name[0] != 'A': new_name = str(name[1:]) if not _is_uname(new_name): new_name = '_' + new_name if _is_uname(new_name): if not set_name(address, new_name): del_items(address) set_name(address, new_name)
def __init__(self, addr=None, name=None, ptr=None): if addr is not None and name is not None: del_items(addr, DELIT_SIMPLE, 16) self.__ptr = Pointer(addr, name) elif ptr is not None: self.__ptr = ptr else: raise ValueError() if self.__ptr.type != GUID_TYPENAME: self.__ptr.type = Structure(GUID_TYPENAME).name
def make_xref(from_ea, to_ea, data_type, xref_size): """Force the data at `from_ea` to reference the data at `to_ea`.""" if not idc.get_full_flags(to_ea) or is_invalid_ea(to_ea): DEBUG(" Not making reference (A) from {:x} to {:x}".format(from_ea, to_ea)) return False make_head(from_ea) if is_code(from_ea): _CREFS_FROM[from_ea].add(to_ea) _CREFS_TO[to_ea].add(from_ea) else: _DREFS_FROM[from_ea].add(to_ea) _DREFS_TO[to_ea].add(from_ea) # If we can't make a head, then it probably means that we're at the # end of the binary, e.g. the last thing in the `.extern` segment. # or in the middle of structure. Return False in such case # # NOTE(artem): Commenting out since this breaks recovery of C++ applications # with IDA7. The failure occurs when processign references in .init_array # when the below code is enabled, those references are not treated as # references because make_head fails. # #if not make_head(from_ea + xref_size): # return False ida_bytes.del_items(from_ea, idc.DELIT_EXPAND, xref_size) if data_type == idc.FF_QWORD: data_size = 8 elif data_type == idc.FF_DWORD: data_size = 4 else: raise ValueError("Invalid data type") idc.create_data(from_ea, data_type, data_size, idaapi.BADADDR) if not is_code_by_flags(from_ea): idc.add_dref(from_ea, to_ea, idc.XREF_USER|idc.dr_O) else: DEBUG(" Not making reference (B) from {:x} to {:x}".format(from_ea, to_ea)) return True