用python执行汇编程序代码

时间:2011-05-18 06:53:13

标签: python pointers assembly memory-address

我想在python脚本中执行汇编代码。这可能吗?

在C编程中就像这样

static inline getesp(){
        __asm__("mov %esp, %eax");
}

但是如何用Python做到这一点?有可能吗?

7 个答案:

答案 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)

理论上,你可以:

  1. 在C中编写一个调用程序集的简单函数
  2. 使用CythonPyrex从Python调用该功能
  3. 我必须承认我没有使用Pyrex或Cython,但他们可能能够做你需要的而不必去编写一个完整的C扩展。

答案 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不支持这种低级硬件交互。