Это может показаться странным вопросом, но я хотел бы знать, как я могу запустить функцию в .dll из «сигнатуры» памяти. Я не очень понимаю, как это работает, но мне это очень нужно. Это способ запуска неэкспортированных функций из .dll, если вы знаете сигнатуру памяти и ее адрес. Например, у меня есть такие:
respawn_f "_ZN9CCSPlayer12RoundRespawnEv"
respawn_sig "568BF18B06FF90B80400008B86E80D00"
respawn_mask "xxxxx?xxx??xxxx?"
И, используя довольно изящный код C++, вы можете использовать его для запуска функций из .dll.
Вот хорошо объясненная статья об этом: http://wiki.alliedmods.net/Signature_Scanning
Итак, возможно ли использовать Ctypes или любой другой способ сделать это внутри Python?






Если вы уже можете запускать их с помощью C++, вы можете попробовать использовать SWIG для создания оболочки python для кода C++, который вы написали, делая его вызываемым из python.
Некоторые предостережения, которые я обнаружил при использовании 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, если это необходимо.