Подтвердить что ты не робот

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

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

В программировании на С будет

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы можете ознакомиться с использованием пакета 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>

Ответ 3

Вы можете встроить сборку прямо в вашу программу Python:

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

Ответ 4

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

Ответ 5

В качестве конкретного примера, здесь показано, как вызвать функцию, которая возьмет int и вернет его с приращением на единицу.

Для получения памяти с установленным флагом исполняемых файлов используется модуль 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()

Ответ 6

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

Ответ 7

В теории вы могли бы:

  • Напишите простую функцию в C, которая вызывает сборку
  • Используйте Cython или Pyrex для вызов этой функции из Python

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

Ответ 8

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