Yud*_*ira 19 python assembly pointers memory-address
我想在python脚本中执行汇编代码.那可能吗?
在C编程中会是这样的
static inline getesp(){
__asm__("mov %esp, %eax");
}
Run Code Online (Sandbox Code Playgroud)
但是如何用Python做到这一点?可能吗?
Luk*_*uke 12
您可以直接在Python程序中嵌入程序集:
这些工作通过编译程序集并在运行时将其加载到可执行内存中.前三个项目在Python中实现x86-64或x86汇编程序,而最后一个调用外部编译器.
use*_*610 11
作为一个具体的例子,这里是如何调用一个函数,该函数将接受一个 int 并返回它加一。
为了获得设置了可执行标志的内存,使用了mmap模块。
要调用该函数,使用ctypes模块。
为了将机器码放入内存,有硬编码的 x86-64 机器码字节串。
该代码将打印 43。
在实践中,我会在 C 共享对象库中编写代码并在 C 中使用内联汇编。然后我会使用它cffi来加载和运行库。这个例子的优点是它是自包含的,只需要标准的 Python 库。
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()
Run Code Online (Sandbox Code Playgroud)