def codeify(self, ea=idc.BADADDR): func_count = 0 code_count = 0 if ea == idc.BADADDR: ea = self.get_start_ea(self.CODE) if ea == idc.BADADDR: ea = ida_shims.get_first_seg() print("\nLooking for undefined code starting at: %s:0x%X" % \ (ida_shims.get_segm_name(ea), ea)) while ea != idc.BADADDR: try: if ida_shims.get_segm_attr(ea, idc.SEGATTR_TYPE) == self.CODE: if ida_shims.get_func_name(ea) != '': ea = ida_shims.find_func_end(ea) continue else: if ida_shims.add_func(ea): func_count += 1 elif ida_shims.create_insn(ea): code_count += 1 except: pass ea = ida_shims.next_addr(ea) print("Created %d new functions and %d new code blocks\n" % \ (func_count, code_count))
def get_start_ea(self, attr): ea = idc.BADADDR seg = ida_shims.get_first_seg() while seg != idc.BADADDR: if ida_shims.get_segm_attr(seg, idc.SEGATTR_TYPE) == attr: ea = seg break else: seg = ida_shims.get_next_seg(seg) return ea
def _get_segments(self, attr): segments = [] seg = ida_shims.get_first_seg() while seg != idc.BADADDR: if ida_shims.get_segm_attr(seg, idc.SEGATTR_TYPE) == attr: start = ida_shims.get_segm_start(seg) end = ida_shims.get_segm_end(seg) segments.append((start, end)) seg = ida_shims.get_next_seg(seg) return segments
def get_data_section(self): ea = idc.BADADDR seg = ida_shims.get_first_seg() stop = idc.BADADDR while seg != idc.BADADDR: if ea == idc.BADADDR and \ ida_shims.get_segm_attr(seg, idc.SEGATTR_TYPE) == 2: ea = seg stop = ida_shims.get_segm_end(seg) seg = ida_shims.get_next_seg(seg) return ea, stop
def stringify(self): n = 0 ea = self.get_start_ea(self.DATA) if ea == idc.BADADDR: ea = ida_shims.get_first_seg() print "Looking for possible strings starting at: 0x%X..." % ea, for s in idautils.Strings(): if s.ea > ea: if not ida_shims.is_strlit(ida_shims.get_full_flags(s.ea)) \ and ida_shims.create_strlit(s.ea, 0): n += 1 print "created %d new ASCII strings" % n
def datify(self): ea = self.get_start_ea(self.DATA) if ea == idc.BADADDR: ea = ida_shims.get_first_seg() print("Converting remaining data to DWORDs...", end=' ') while ea != idc.BADADDR: flags = ida_shims.get_full_flags(ea) if (ida_shims.is_unknown(flags) or ida_shims.is_byte(flags)) and \ ((ea % 4) == 0): ida_shims.create_dword(ea) ida_shims.op_plain_offset(ea, 0, 0) ea = ida_shims.next_addr(ea) print("done.") self._fix_data_offsets()