Выполнение ассемблерного кода с python

Я хочу выполнить код сборки внутри скрипта python. Это возможно?

в программировании на C было бы так

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

но как это сделать с Python? Возможно ли это?

7 ответов


один из способов сделать это-написать расширение (C) для Python. Вы можете взглянуть на этой документация для получения полной информации о том, как это сделать.

другим способом разработки расширений Python на основе C было бы прямое взаимодействие с внешней библиотекой с помощью ctypes модуль.

в любом случае вам понадобится код C, скомпилированный в библиотеку или расширение, и способ вызвать его из Python. Ясно для чего вы хотите достичь этого, вероятно, не оптимально, но на самом деле его не так много работы, чтобы выставить несколько функций.


Вы можете посмотреть в с помощью CorePy пакета, доступен здесь. Чтобы использовать его на amd64, например, в документации:

# Load the x86_64 instructions and environment
>>> import corepy.arch.x86_64.isa as x86
>>> import corepy.arch.x86_64.platform as x86_env
Platform: linux.spre_linux_x86_64_64

# Create a simple synthetic program
>>> code = x86_env.InstructionStream()
>>> code.add(x86.mov(code.gp_return, rsp))

# Execute the synthetic program 
>>> proc = x86_env.Processor()
>>> result = proc.execute(code, mode='int')
>>> print result
<rsp value will be here>

вы можете встроить сборку непосредственно в свою программу Python:

Они работают путем компиляции сборки и загрузки ее в исполняемую память во время выполнения. Этот первые три проекта реализуют ассемблеры x86-64 или x86 в Python, тогда как последний вызывает внешний компилятор.


извините за некропостинг, но я думаю, что вы можете написать свою собственную DLL с помощью asm и вызвать его функции из Python.


теоретически вы могли бы:

  1. напишите простую функцию в C, которая вызывает сборку
  2. использовать на Cython или Pyrex чтобы вызвать эту функцию из Python

Я должен признать, что я не использовал ни Pyrex, ни Cython, но они могли бы сделать то, что вам нужно, не утруждая себя написанием полномасштабного расширения C.


очень возможно, что я сделал небольшой ассемблер в python, некоторые из библиотек, которые я использовал, возможно, поддерживали Ctypes, но я использовал чистый Python, большинство языков на самом деле взаимодействуют на низком уровне, мы просто используем функции языка HLL и не обращая внимания на то, как обрабатывается код, я также написал небольшое приложение для редактирования изображений POC в visual basic, которое использовало код ASM x86 Я на самом деле не уверен, как отредактировать это в то, что я пытался сказать. кроме, может быть функции, которые будут читать код asm и работать из самого скрипта. Я верю, что мои мысли были отмечены как неправильные. Код ASM может быть выполнен с помощью скриптовых функций, которые читают эту область кода и компилируют их. почти как если бы он был встроен в ассемблер fly. Я стараюсь помочь не так великому оратору, Хотя (или пишущему в этом случае, как это может быть) эта страница здесь, возможно, сможет лучше объяснить, что я пытаюсь сказать http://code.activestate.com/recipes/579037-how-to-execute-x86-64-bit-assembly-code-directly-f/


Python не поддерживает этот тип низкоуровневого аппаратного взаимодействия.