Executing assembler code with python

后端 未结 7 1606
长情又很酷
长情又很酷 2021-02-01 18:00

I want to execute assembly code inside a python script. Is that possible?

In C programming would be like this

static inline getesp(){
        __asm__(\"m         


        
7条回答
  •  太阳男子
    2021-02-01 18:43

    As a specific example, here is how to call a function which will take an int and return it incremented by one.

    To obtain memory with the executable flag set, mmap module is used.

    To call the function, ctypes module is used.

    To put the machine code into memory, there is hardcoded byte string of x86-64 machine code.

    The code will print 43.

    In practice, I'd write the code in C shared object library and use inline assembly in C. I'd then use cffi to load and run the library. The advantage of this example is that it is self-contained and only needs the standard Python library.

    import ctypes
    import mmap
    
    buf = mmap.mmap(-1, mmap.PAGESIZE, prot=mmap.PROT_READ | mmap.PROT_WRITE | mmap.PROT_EXEC)
    
    ftype = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int)
    fpointer = ctypes.c_void_p.from_buffer(buf)
    
    f = ftype(ctypes.addressof(fpointer))
    
    buf.write(
        b'\x8b\xc7'  # mov eax, edi
        b'\x83\xc0\x01'  # add eax, 1
        b'\xc3'  # ret
    )
    
    r = f(42)
    print(r)
    
    del fpointer
    buf.close()
    

提交回复
热议问题