def rewrite_segments(view: BinaryView): class EmulatorBackgroundTask(BackgroundTaskThread): def __init__(self, view): self.view = view super().__init__() def run(self): self.view.update_analysis_and_wait() new_raw_view = BinaryView() current_addr = 0 for segment in view.segments: segment_data = view.read(segment.start, segment.data_length) segment_data += b'\x00'*(len(segment) - segment.data_length) new_raw_view.write(current_addr, segment_data) current_addr += len(segment_data) new_view = BinaryViewType['Mapped'].create(new_raw_view) new_view.remove_auto_segment(0, len(new_raw_view)) t = EmulatorBackgroundTask(new_view) t.start() t.join() current_addr = 0 for segment in view.segments: new_view.add_user_segment( segment.start, len(segment), current_addr, len(segment), ( (SegmentFlag.SegmentReadable if segment.readable else 0) | (SegmentFlag.SegmentWritable if segment.writable else 0) | (SegmentFlag.SegmentExecutable if segment.executable else 0) ) ) current_addr += len(segment) return new_view
masked_value | ( full_width_value & ((1 << ((size + offset) * 8)) - 1) ) ) if sign_bit: full_width_value |= full_width_mask ^ ((1 << ((size + offset) * 8)) - 1) self._state.regs[full_width_reg] = full_width_value if __name__ == '__main__': bv = BinaryView() # bv.write(0, b'\x89\xd8\x90\x90\x90') # bv.write(0, b'\xb8\x01\x00\x00\x00') bv.write(0, b'\x01 \xa0\xe3') # bv.platform = Architecture['x86'].standalone_platform bv.platform = Architecture['armv7'].standalone_platform bv.create_user_function(0) bv.update_analysis_and_wait() function = bv.get_function_at(0) emu = InstructionEmulator(bv, {'r2': 1337}) print(emu._state.regs) emu.execute(function.llil[0])