pyasmjit

JIT assemby code generation and execution


License
BSD-2-Clause
Install
pip install pyasmjit==0.2

Documentation

PyAsmJIT

PyAsmJIT is a Python package for x86/x86_64/ARMv7 assembly code generation and execution.

This package was developed as part of the BARF project (https://github.com/programa-stic/barf-project) in order to test instruction translation from x/86/x86_64/ARM to REIL. The main idea is to be able to run fragments of code natively. Then, the same fragment is translated to REIL and executed in a REIL VM. Finally, both final contexts (the one obtained through native execution and the one from emulation) are compare for differences.

Installation

The following command installs the package:

$ python setup.py install

Dependecies

  • NASM : the Netwide Assembler, a portable 80x86 assembler

Quickstart

The following extract shows how to execute on-the-fly a fragment of x86_64 assembly code.

import pyasmjit

code = """\
add rax, rbx
"""

context_in = {
    'rax' : 0x1,
    'rbx' : 0x2,
    'rcx' : 0x1,
    'rdx' : 0x1,
    'rdi' : 0x1,
    'rsi' : 0x1,
}

print code
print context_in

rv, context_out = pyasmjit.x86_execute(code, context_in)

print context_out

And for ARMv7:

import pyasmjit

code = """\

movs r8, r2, lsl #31
mov r7, #0x7FFFFFFF
mov r8, #0x7FFFFFFF
adds r7, r7, r8
#subs r10, r10, #0xFFFFFFFF
"""

context_in = {
    'r0' : 0x0,
    'r1' : 0x1,
    'r2' : 0x2,
    'r3' : 0x3,
    'r4' : 0x4,
    'r5' : 0x5,
    'r6' : 0x6,
    'r7' : 0x7,
    'r8' : 0x8,
    'r9' : 0x9,
    'r10' : 0xa,
    'r11' : 0xb,
    'r12' : 0xc,
    'apsr' : 0x0,
}

print code
print context_in

rv, context_out, mem = pyasmjit.arm_execute(code, context_in)

print context_out

Overview

The inner workings of the package is very simple. PyAsmJIT communicates with nasm using the subprocess package. Once the machine code is generated, it is place in a memory location previously reserved with the proper permissions flags. Then, the code is executed as a thread.

Limitations

Currently:

  • It does not handle memory operations
  • It only works with x86, x86_64 and ARMv7

License

The BSD 2-Clause License. For more information, see LICENSE.