# append file contents to view # # Will append a file's raw contents to the existing view (useful for working with firmware or memory dumps). Thanks to @mariomain for the snippet. def load_file(infilename): f = open(infilename, "rb") g = f.read() f.close() faddr = None while (faddr is not None): faddr = interaction.get_int_input("Load address", "Load address") fsize = len(g) return g, faddr, fsize def overlap(reg1, reg1sz, reg2, reg2sz): if ((reg1 >= reg2) and (reg1 < (reg2 + reg2sz))): return True if (((reg1 + reg1sz) > reg2) and ((reg1 + reg1sz) < (reg2 + reg2sz))): return True if ((reg1 < reg2) and ((reg1 + reg1sz) >= (reg2 + reg2sz))): return True return False def add_some_file_sec(file_name): rv = bv.get_view_of_type("Raw") fblob, faddr, fsize = load_file(file_name) prev_sec = bv.get_segment_at(bv.start) succ_sec = None new_succ_blob = None new_succ_blob_addr = 0 if (overlap(faddr, fsize, prev_sec.start, len(prev_sec)) == False) and (faddr < prev_sec.start): succ_sec = prev_sec else: for i in bv.sections: i = bv.get_section_by_name(i) if overlap(faddr, fsize, i.start, len(i)) == True: log_info("overlapping with region {}".format(hex(i.start))) return False if prev_sec.start != i.start: if (faddr >= (prev_sec.start + len(prev_sec))) and (faddr < i.start): succ_sec = i break prev_sec = i if succ_sec != None: follow_seg = bv.get_segment_at(succ_sec.start) the_rest = rv.read(follow_seg.data_offset, rv.length - follow_seg.data_offset) new_succ_blob = fblob + the_rest new_succ_blob_addr = follow_seg.data_offset else: new_succ_blob = fblob new_succ_blob_addr = rv.length rv.write(new_succ_blob_addr, new_succ_blob) if succ_sec != None: for i in bv.segments: if i.start > faddr: temp_start = i.start temp_off = i.data_offset temp_len = i.data_length bv.remove_auto_segment(i.start, len(i)) temp_off += fsize bv.add_auto_segment(start=temp_start, length=temp_len, data_offset=temp_off, data_length=temp_len, flags=(SegmentFlag.SegmentReadable | SegmentFlag.SegmentExecutable)) bv.add_auto_section(os.path.basename(file_name), start=faddr, length=fsize, semantics=SectionSemantics.ReadOnlyCodeSectionSemantics) bv.add_auto_segment(start=faddr, length=fsize, data_offset=new_succ_blob_addr, data_length=fsize, flags=(SegmentFlag.SegmentReadable | SegmentFlag.SegmentExecutable))