用python执行汇编程序代码

Yud*_*ira 19 python assembly pointers memory-address

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

在C编程中会是这样的

static inline getesp(){
        __asm__("mov %esp, %eax");
}
Run Code Online (Sandbox Code Playgroud)

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

jkp*_*jkp 14

你可以这样做的一种方法是为Python编写一个(C)扩展.您可以查看文档以获取有关如何执行此操作的完整详细信息.

开发基于C的Python扩展的另一种方法是使用ctypes模块直接与外部库接口.

无论如何,你需要将一些C代码编译成库或扩展,以及从Python调用它的方法.很明显,对于你想要实现的目标,这可能不是最优的,但实际上它并没有那么多公开一些功能的工作.

  • 应该指出的是,由于Python支持C扩展,你可以在纯汇编程序中编写who; e扩展,只要你编写代码就可以遵循C的调用约定wrt参数传递,返回值,寄存器用法等. (6认同)

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)


Кра*_*йст 5

抱歉,我不能为您进行尸检发布,但我认为您可以使用asm编写自己的DLL,并在Python中调用它的函数。