def alloc(size, name): '''Allocates a segment of the given size.''' # first lets get the last segment in this binary last_seg_end = idaapi.get_last_seg().endEA # and the first first_seg_start = idaapi.get_first_seg().startEA # now see how many bytes we have from there to 0xFFFFFFFF bytes_high = 0xFFFFFFFF - last_seg_end # now see how many bytes we have from 0x0 to the first segments start bytes_low = first_seg_start # check where we have more room if bytes_high > bytes_low: print "[*] segment.py: there is room above current segments" new_seg_start = last_seg_end + 0x10000 new_seg_start = new_seg_start & 0xFFFF0000 else: print "[*] segment.py: there is room below current segments" new_seg_start = 0 + 0x1000 idc.SegCreate(new_seg_start, new_seg_start + size, 0, True, 3, 2) idc.SegRename(new_seg_start, name) return new_seg_start
def AllocateCodeSegment(self): if self.segment_start != 0: self.FreeCodeSegment() while True: seg_start = idaapi.BADADDR while seg_start == idaapi.BADADDR: seg_start = idc.AskAddr( 0x1000, "Enter address to create new code segment") seg_size = 0 while seg_size == 0: seg_size = idc.AskAddr(0x10000, "Enter size of new code segment") if idc.SegCreate(seg_start, seg_start + seg_size, 0, 1, 0, 0) != 0: break self.segment_start = seg_start self.segment_size = seg_size while True: seg_name = '' while seg_name == '': seg_name = idc.AskStr("optimized", "Enter a new segment name") if idc.SegRename(self.segment_start, seg_name) != 0: break self.segment_name = seg_name self.free_ea = self.segment_start
def process_region(segname, name, start, end): assert end >= start if segname in skip: _log(2, 'Skipping segment {}', segname) return newname = '{}.{}'.format(segname, name) if kext: newname = '{}:{}'.format(kext, newname) if start == end: _log(2, 'Skipping empty region {} at {:x}', newname, start) return ida_segstart = idc.SegStart(start) if ida_segstart == idc.BADADDR: _log(0, "IDA doesn't think this is a real segment: {:x} - {:x}", start, end) return ida_segend = idc.SegEnd(ida_segstart) if start != ida_segstart or end != ida_segend: _log(0, 'IDA thinks segment {} {:x} - {:x} should be {:x} - {:x}', newname, start, end, ida_segstart, ida_segend) return _log(2, 'Rename {:x} - {:x}: {} -> {}', start, end, idc.SegName(start), newname) idc.SegRename(start, newname)