예제 #1
0
파일: segment.py 프로젝트: wzr/toolbag
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
예제 #2
0
    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
예제 #3
0
 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)