Example #1
0
 def fix_module(self):
     """cleanup module and apply relocations"""
     if self.bk_type != "module":
         return
     segs = self.bin_img.get_segments()
     # strip bk module header
     seg = segs[0]
     data = seg.get_data()
     seg.data = data[6:]
     seg.size -= 6
     # auto init flag set?
     flags = ord(seg.data[10])
     auto_init = (flags & 0x80) == 0x80
     # add relocations to myself for the following offsets
     # see blizkick source: blizkickmodule.i for details
     offs = (2, 6, 14, 18, 22)
     if auto_init:
         offs += (34, 38, 42)
     # get relocs to myself (seg 0)
     relocs = seg.get_reloc(seg)
     if relocs is not None:
         raise ValueError("no relocations expected in BlizKick module")
     relocs = BinImage.Relocations(seg)
     seg.add_reloc(seg, relocs)
     # add relocs
     for o in offs:
         relocs.add_reloc(BinImage.Reloc(o))
     # check if we can remove last data segment (contains only version info)
     if len(segs) == 2 and segs[1].get_type() == BinImage.SEGMENT_TYPE_DATA:
         data = segs[1].get_data()
         if data[:5] == "$VER:":
             self.bin_img.segments = [seg]
Example #2
0
 def extract_bin_img(self, entry, fixes=True, patches=False):
     data, relocs = self.extract_entry(entry, fixes, patches)
     # create a bin image
     bi = BinImage(BIN_IMAGE_TYPE_HUNK)
     seg = Segment(SEGMENT_TYPE_CODE, len(data), data)
     bi.add_segment(seg)
     # create reloc for target segment
     rl = Relocations(seg)
     # add offsets
     for o in relocs:
         r = Reloc(o)
         rl.add_reloc(r)
     seg.add_reloc(seg, rl)
     # return final binary image
     return bi
Example #3
0
 def extract_bin_img(self, entry, fixes=True, patches=False):
   data, relocs = self.extract_entry(entry, fixes, patches)
   # create a bin image
   bi = BinImage(BIN_IMAGE_TYPE_HUNK)
   seg = Segment(SEGMENT_TYPE_CODE, len(data), data)
   bi.add_segment(seg)
   # create reloc for target segment
   rl = Relocations(seg)
   # add offsets
   for o in relocs:
     r = Reloc(o)
     rl.add_reloc(r)
   seg.add_reloc(seg, rl)
   # return final binary image
   return bi
Example #4
0
    def load_image_fobj(self, fobj):
        """load a BinImage from an ELF file given via file object"""
        # read elf file
        reader = ELFReader()
        elf = reader.load(fobj)
        # create bin image and assign elf file
        bi = BinImage(BIN_IMAGE_TYPE_ELF)
        bi.set_file_data(elf)
        # walk through elf sections
        sect_to_seg = {}
        for sect in elf.sections:
            # determine segment type
            seg_type = None
            name = sect.name_str
            flags = 0
            if name == b".text":
                seg_type = SEGMENT_TYPE_CODE
            elif name == b".data":
                seg_type = SEGMENT_TYPE_DATA
            elif name == b".rodata":
                seg_type = SEGMENT_TYPE_DATA
                flags = SEGMENT_FLAG_READ_ONLY
            elif name == b".bss":
                seg_type = SEGMENT_TYPE_BSS
            # we got a segment
            if seg_type is not None:
                size = sect.header.size
                data = sect.data
                seg = Segment(seg_type, size, data, flags)
                bi.add_segment(seg)
                # assign section to segment
                seg.set_file_data(sect)
                sect_to_seg[sect] = seg

        # now run through segments to add relocations
        bi_segs = bi.get_segments()
        for seg in bi_segs:
            # retrieve associated ELF section
            sect = seg.get_file_data()

            # any relocations?
            rela = sect.get_rela()
            num_rela = len(rela)
            if num_rela > 0:
                self.add_elf_rela(sect, seg, sect_to_seg)

            # any symbols?
            symbols = sect.get_symbols()
            num_syms = len(symbols)
            if num_syms > 0:
                self.add_elf_symbols(symbols, seg)

        # try to add debug info
        ddl = DwarfDebugLine()
        got = ddl.decode(elf)
        if got:
            self.add_debug_line(ddl, bi, sect_to_seg)

        return bi
Example #5
0
  def load_image_fobj(self, fobj):
    """load a BinImage from an ELF file given via file object"""
    # read elf file
    reader = ELFReader()
    elf = reader.load(fobj)
    # create bin image and assign elf file
    bi = BinImage(BIN_IMAGE_TYPE_ELF)
    bi.set_file_data(elf)
    # walk through elf sections
    sect_to_seg = {}
    for sect in elf.sections:
      # determine segment type
      seg_type = None
      name = sect.name_str
      flags = 0
      if name == '.text':
        seg_type = SEGMENT_TYPE_CODE
      elif name == '.data':
        seg_type = SEGMENT_TYPE_DATA
      elif name == '.rodata':
        seg_type = SEGMENT_TYPE_DATA
        flags = SEGMENT_FLAG_READ_ONLY
      elif name == '.bss':
        seg_type = SEGMENT_TYPE_BSS
      # we got a segment
      if seg_type is not None:
        size = sect.header.size
        data = sect.data
        seg = Segment(seg_type, size, data, flags)
        bi.add_segment(seg)
        # assign section to segment
        seg.set_file_data(sect)
        sect_to_seg[sect] = seg

    # now run through segments to add relocations
    bi_segs = bi.get_segments()
    for seg in bi_segs:
      # retrieve associated ELF section
      sect = seg.get_file_data()

      # any relocations?
      rela = sect.get_rela()
      num_rela = len(rela)
      if num_rela > 0:
        self.add_elf_rela(sect, seg, sect_to_seg)

      # any symbols?
      symbols = sect.get_symbols()
      num_syms = len(symbols)
      if num_syms > 0:
        self.add_elf_symbols(symbols, seg)

    # try to add debug info
    ddl = DwarfDebugLine()
    got = ddl.decode(elf)
    if got:
      self.add_debug_line(ddl, bi, sect_to_seg)

    return bi
Example #6
0
    def create_image_from_load_seg_file(self, lsf):
        """create a BinImage from a HunkLoadSegFile object"""
        bi = BinImage(BIN_IMAGE_TYPE_HUNK)
        bi.set_file_data(lsf)
        segs = lsf.get_segments()
        for seg in segs:
            # what type of segment to we have?
            blk_id = seg.seg_blk.blk_id
            size = seg.size_longs * 4
            data = seg.seg_blk.data
            if blk_id == Hunk.HUNK_CODE:
                seg_type = SEGMENT_TYPE_CODE
            elif blk_id == Hunk.HUNK_DATA:
                seg_type = SEGMENT_TYPE_DATA
            elif blk_id == Hunk.HUNK_BSS:
                seg_type = SEGMENT_TYPE_BSS
            else:
                raise HunkParseError("Unknown Segment Type for BinImage: %d" %
                                     blk_id)
            # create seg
            bs = Segment(seg_type, size, data)
            bs.set_file_data(seg)
            bi.add_segment(bs)
        # add relocations if any
        bi_segs = bi.get_segments()
        for seg in bi_segs:
            # add relocations?
            hseg = seg.file_data
            reloc_blks = hseg.reloc_blks
            if reloc_blks is not None:
                for blk in reloc_blks:
                    self._add_hunk_relocs(blk, seg, bi_segs)
            # add symbol table
            symbol_blk = hseg.symbol_blk
            if symbol_blk is not None:
                self._add_hunk_symbols(symbol_blk, seg)
            # add debug infos
            debug_infos = hseg.debug_infos
            if debug_infos is not None:
                self._add_debug_infos(debug_infos, seg)

        return bi
Example #7
0
    def create_image_from_load_seg_file(self, lsf):
        """create a BinImage from a HunkLoadSegFile object"""
        bi = BinImage(BIN_IMAGE_TYPE_HUNK)
        bi.set_file_data(lsf)
        segs = lsf.get_segments()
        for seg in segs:
            # what type of segment to we have?
            blk_id = seg.seg_blk.blk_id
            size = seg.size_longs * 4
            data = seg.seg_blk.data
            if blk_id == Hunk.HUNK_CODE:
                seg_type = SEGMENT_TYPE_CODE
            elif blk_id == Hunk.HUNK_DATA:
                seg_type = SEGMENT_TYPE_DATA
            elif blk_id == Hunk.HUNK_BSS:
                seg_type = SEGMENT_TYPE_BSS
            else:
                raise HunkParseError("Unknown Segment Type for BinImage: %d" % blk_id)
            # create seg
            bs = Segment(seg_type, size, data)
            bs.set_file_data(seg)
            bi.add_segment(bs)
        # add relocations if any
        bi_segs = bi.get_segments()
        for seg in bi_segs:
            # add relocations?
            hseg = seg.file_data
            reloc_blk = hseg.reloc_blk
            if reloc_blk is not None:
                self.add_hunk_relocs(reloc_blk, seg, bi_segs)
            # add symbol table
            symbol_blk = hseg.symbol_blk
            if symbol_blk is not None:
                self.add_hunk_symbols(symbol_blk, seg)
            # add debug infos
            debug_infos = hseg.debug_infos
            if debug_infos is not None:
                self.add_debug_infos(debug_infos, seg)

        return bi