def getlen(self): # Lazy version if hasattr(self, "_getlen"): return self._getlen max_addr = SegEnd(list(Segments())[-1] - (self.offset + self.shift)) self._getlen = max_addr return max_addr
def find_all_segments(self, segment_names): segments = {name: None for name in segment_names} for seg_va in Segments(): seg_name = SegName(seg_va) if seg_name in segment_names: segments[seg_name] = (seg_va, SegEnd(seg_va)) return segments
def all_valid_ea(): """Return all valid EA as a Python generator.""" from idautils import Segments from idc import SegStart, SegEnd for s in Segments(): ea = SegStart(s) while ea < SegEnd(s): yield ea ea = idaapi.nextaddr(ea)
def dump_symbol_info(output_filename): """Dump information for BAP's symbolizer into output_filename.""" from idautils import Segments, Functions from idc import ( SegStart, SegEnd, GetFunctionAttr, FUNCATTR_START, FUNCATTR_END ) try: from idaapi import get_func_name2 as get_func_name # Since get_func_name is deprecated (at least from IDA 6.9) except ImportError: from idaapi import get_func_name # Older versions of IDA don't have get_func_name2 # so we just use the older name get_func_name def func_name_propagate_thunk(ea): current_name = get_func_name(ea) if current_name[0].isalpha(): return current_name func = idaapi.get_func(ea) temp_ptr = idaapi.ea_pointer() ea_new = idaapi.BADADDR if func.flags & idaapi.FUNC_THUNK == idaapi.FUNC_THUNK: ea_new = idaapi.calc_thunk_func_target(func, temp_ptr.cast()) if ea_new != idaapi.BADADDR: ea = ea_new propagated_name = get_func_name(ea) or '' # Ensure it is not `None` if len(current_name) > len(propagated_name) > 0: return propagated_name else: return current_name # Fallback to non-propagated name for weird times that IDA gives # a 0 length name, or finds a longer import name idaapi.autoWait() with open(output_filename, 'w+') as out: for ea in Segments(): fs = Functions(SegStart(ea), SegEnd(ea)) for f in fs: out.write('("%s" 0x%x 0x%x)\n' % ( func_name_propagate_thunk(f), GetFunctionAttr(f, FUNCATTR_START), GetFunctionAttr(f, FUNCATTR_END)))
def getlen(self): return SegEnd(0) - (self.offset + self.shift)
def get_section_range(type): # eg: .text/.bss/.rodata ea = SegByBase(SegByName(type)) return SegStart(ea), SegEnd(ea)