Пример #1
0
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])