作为一个具体的例子,下面是如何调用一个函数,该函数将获取一个int并返回递增的一。
要获取设置了可执行标志的内存,
mmap
使用模块。
要调用函数,
ctypes
使用模块。
要将机器代码放入内存,有硬编码字节字符串。
代码将打印43。
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()