我想在Python脚本中执行汇编代码。这可能吗?
在C编程中,可以像这样实现
static inline getesp(){
__asm__("mov %esp, %eax");
}
但是用Python如何实现呢?可能吗?
我想在Python脚本中执行汇编代码。这可能吗?
在C编程中,可以像这样实现
static inline getesp(){
__asm__("mov %esp, %eax");
}
但是用Python如何实现呢?可能吗?
以下是一个具体的例子,介绍如何调用一个函数,该函数将获取一个整数并返回增加1后的结果。
要获取带有可执行标志的内存,使用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()
抱歉回复较晚,但我认为你可以使用汇编语言编写自己的DLL,并从Python中调用其函数。
Python不支持这种低级硬件交互。
很有可能我用Python编写了一个小的汇编器,使用了一些可能支持Ctypes的库,但我使用的是纯Python。大多数语言实际上在低级别接口。我们只是使用高级语言功能,没有适当地关注代码是如何被处理的。我还编写了一个小的POC图像编辑应用程序,在Visual Basic中使用了ASM x86代码。 我实际上不确定如何将其编辑为我想说的内容。也许可以使用函数来读取汇编代码,并在脚本内部工作。我相信我的想法被指出是错误的。可以通过读取代码区域并编译它们的脚本函数来执行ASM代码。就好像是内置的即时汇编器一样。我试图帮助不太擅长讲话的人(或者在这种情况下是写作者),这里的页面可能能更好地解释我想说的话 http://code.activestate.com/recipes/579037-how-to-execute-x86-64-bit-assembly-code-directly-f/
__attribute__((noinline))
或其他类似的东西。否则,它将只是在内联的任何地方插入一个mov %esp,%eax
,而编译器可能正在使用EAX进行其他操作。您应该使用asm("mov %esp, %0" : "=rm"(retval));
。此外,在声明中依赖C89隐式返回类型(int
)也是不好的。另外,从Python中获取ESP是一个非常糟糕的示例。也许可以展示如何使用BMI2指令,例如pext
? - Peter Cordes