Exemple #1
0
 def _add_bin_img_relocs(self, hunk_seg, seg):
     reloc_segs = seg.get_reloc_to_segs()
     hunk_relocs = []
     for reloc_seg in reloc_segs:
         seg_id = reloc_seg.id
         reloc = seg.get_reloc(reloc_seg)
         relocs = reloc.get_relocs()
         offsets = []
         for r in relocs:
             if r.get_width() != 2 or r.get_addend() != 0:
                 raise HunkParseError("Invalid reloc: " + r)
             offsets.append(r.get_offset())
         hunk_relocs.append((seg_id, offsets))
     if len(hunk_relocs) > 0:
         hunk_seg.setup_relocs(hunk_relocs)
Exemple #2
0
 def add_hunk_relocs(self, blk, seg, all_segs):
     """add relocations to a segment"""
     if blk.blk_id not in (Hunk.HUNK_ABSRELOC32, Hunk.HUNK_RELOC32SHORT):
         raise HunkParseError("Invalid Relocations for BinImage: %d" %
                              blk_id)
     relocs = blk.relocs
     for r in relocs:
         hunk_num = r[0]
         offsets = r[1]
         to_seg = all_segs[hunk_num]
         # create reloc for target segment
         rl = Relocations(to_seg)
         # add offsets
         for o in offsets:
             r = Reloc(o)
             rl.add_reloc(r)
         seg.add_reloc(to_seg, rl)
Exemple #3
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
Exemple #4
0
 def create_load_seg_file_from_image(self, bin_img):
   """create a HunkLodSegFile from a BinImage"""
   lsf = HunkLoadSegFile()
   for seg in bin_img.segments:
     seg_type = seg.get_type()
     # create HunkSegment
     lseg = HunkSegment()
     lsf.add_segment(lseg)
     if seg_type == SEGMENT_TYPE_CODE:
       lseg.setup_code(seg.data)
     elif seg_type == SEGMENT_TYPE_DATA:
       lseg.setup_data(seg.data)
     elif seg_type == SEGMENT_TYPE_BSS:
       lseg.setup_bss(seg.size)
     else:
       raise HunkParseError("Unknown Segment Type in BinImage: %d" % seg_type)
     # add relocs
     self._add_bin_img_relocs(lseg, seg)
     # add symbols
     self._add_bin_img_symbols(lseg, seg)
     # add debug info
     self._add_bin_img_debug_info(lseg, seg)
   return lsf