Я хочу выполнить код сборки внутри python script. Возможно ли это?
В программировании на С будет
static inline getesp(){
__asm__("mov %esp, %eax");
}
Но как это сделать с Python? Возможно ли это?
Я хочу выполнить код сборки внутри python script. Возможно ли это?
В программировании на С будет
static inline getesp(){
__asm__("mov %esp, %eax");
}
Но как это сделать с Python? Возможно ли это?
Один из способов сделать это - написать расширение (C) для Python. Подробнее о том, как это сделать, можно в этой документации.
Другим способом разработки C-based Python-расширений было бы непосредственное взаимодействие с внешней библиотекой с помощью модуля 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.
В качестве конкретного примера, здесь показано, как вызвать функцию, которая возьмет 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()
Python не поддерживает этот тип аппаратного взаимодействия низкого уровня.
В теории вы могли бы:
Я должен признать, что я не использовал ни Pyrex, ни Cython, но они могли бы делать то, что вам нужно, не прибегая к проблеме написания полномасштабного расширения C.
Возможно, я сделал небольшой ассемблер в 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/