Запуск неэкспортированных функций .dll с помощью Python

Это может показаться странным вопросом, но я хотел бы знать, как я могу запустить функцию в .dll из «сигнатуры» памяти. Я не очень понимаю, как это работает, но мне это очень нужно. Это способ запуска неэкспортированных функций из .dll, если вы знаете сигнатуру памяти и ее адрес. Например, у меня есть такие:

respawn_f "_ZN9CCSPlayer12RoundRespawnEv"
respawn_sig "568BF18B06FF90B80400008B86E80D00"
respawn_mask "xxxxx?xxx??xxxx?"

И, используя довольно изящный код C++, вы можете использовать его для запуска функций из .dll.

Вот хорошо объясненная статья об этом: http://wiki.alliedmods.net/Signature_Scanning

Итак, возможно ли использовать Ctypes или любой другой способ сделать это внутри Python?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
875
2

Ответы 2

Если вы уже можете запускать их с помощью C++, вы можете попробовать использовать SWIG для создания оболочки python для кода C++, который вы написали, делая его вызываемым из python.

http://www.swig.org/

Некоторые предостережения, которые я обнаружил при использовании SWIG:

Swig ищет типы на основе строкового значения. Например целочисленный тип в Python (int) будет выглядеть, чтобы убедиться, что что тип cpp - "int", иначе swig будет жаловаться насчет несоответствия типов. Автоматической конвертации нет.

Swig копирует исходный код дословно, поэтому даже объекты в одном пространстве имен должен быть полностью определен, чтобы файл cxx правильно компилировался.

Надеюсь, это поможет.

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

Вы можете вызвать произвольный экспорт, используя ctypes. Поскольку имя искажено и не является допустимым идентификатором Python, вы можете использовать getattr ().

Другой подход, если у вас есть правильная информация, - это найти экспорт по порядковому номеру, что вам нужно было бы сделать, если бы имя не экспортировалось вообще. Один из способов получить порядковый номер - использовать dumpbin.exe, включенный во многие языки компиляции Windows. На самом деле это интерфейс для компоновщика, поэтому, если у вас есть MS LinK.exe, вы также можете использовать его с соответствующими переключателями командной строки.

Чтобы получить ссылку на функцию (которая является объектом «указатель на функцию», привязанным к ее адресу), вы можете использовать что-то вроде:

import ctypes func = getattr (ctypes.windll.msvcrt, "@@ myfunc") retval = func (Нет)

Естественно, вы должны заменить msvcrt на DLL, которую вы конкретно хотите вызвать.

Я не показываю здесь, как распутать имя, чтобы получить вызывающую сигнатуру и, следовательно, необходимые аргументы. Для этого потребуется демонтажер, и они очень специфичны для марки И ВЕРСИЯ компилятора C++, используемого для создания DLL.

Существует определенное количество проверок ошибок, если функция является stdcall, поэтому иногда вы можете возиться с вещами, пока не поймете их правильно. Но если это функция cdecl, то автоматической проверки нет. Точно так же вы должны не забыть включить дополнительный параметр this, если это необходимо.

Другие вопросы по теме