我想在python脚本中执行汇编代码。这可能吗?
在C编程中就像这样
static inline getesp(){
__asm__("mov %esp, %eax");
}
但是如何用Python做到这一点?有可能吗?
答案 0 :(得分:12)
你可以这样做的一种方法是为Python编写一个(C)扩展。您可以查看this文档,了解有关如何执行此操作的完整详细信息。
开发基于C的Python扩展的另一种方法是使用ctypes模块直接与外部库进行交互。
在任何情况下,您都需要将一些C代码编译到库或扩展中,以及从Python调用它的方法。显然,对于你想要实现的目标,这可能不是最优的,但实际上它并没有那么多工作来公开一些功能。
答案 1 :(得分:11)
您可以直接在Python程序中嵌入程序集:
这些工作通过编译程序集并在运行时将其加载到可执行内存中。前三个项目用Python实现x86-64或x86汇编程序,而最后一个调用外部编译器。
答案 2 :(得分:4)
对于necroposting很抱歉,但我认为您可以使用asm编写自己的DLL,并在Python中调用它的函数。
答案 3 :(得分:2)
作为一个特定的示例,这是如何调用一个将接受一个int并返回递增1的函数的方法。
要获取设置了可执行标志的内存,请使用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()
答案 4 :(得分:0)
理论上,你可以:
答案 5 :(得分:0)
我很有可能在python中创建了一个小型汇编程序,我使用的一些库可能支持Ctypes,但我使用纯Python,大多数语言实际上都是低级别的接口,我们只是使用HLL Langage功能并且没有适当注意代码的处理方式,我还在Visual Basic中编写了一个使用ASM x86代码的小型POC图像编辑应用程序 我真的不确定如何将其编辑成我想说的内容。除了可能会读取asm代码并在脚本本身内工作的函数。我相信我的想法被指出是错误的。 ASM代码可以通过使用读取代码区域并编译它们的脚本函数来执行。几乎就像它是一个内置的飞行汇编程序。我试着帮助不那么优秀的演讲者(或者在这种情况下可能是写作)这个页面可能能够更好地解释我想说的是什么 http://code.activestate.com/recipes/579037-how-to-execute-x86-64-bit-assembly-code-directly-f/
答案 6 :(得分:-1)
Python不支持这种低级硬件交互。