Нахождение параметров функции Dll
Как я могу найти параметры недокументированной функции Dll?
Я искал по всему интернету и в итоге нашел один способ: он включает в себя украшенные функции. Тем не менее, я не могу найти способ получить их.
Любая помощь будет оценена.
7 ответов
Вам нужно разобрать приложение, используя, как заметил Пол, что-то вроде IDA Pro (или бесплатную версию того же самого).
Хорошим вводным ресурсом является Wikibook, x86 Disassembly. В частности, взгляните на раздел о функциях и фреймах стека. Параметры функции вывода могут быть простыми для простых функций, принимающих несколько параметров стандартного типа.
Вероятно, лучший способ начать с такого рода вещами - это создать небольшую тестовую DLL, создать несколько функций с известными параметрами, а затем разобрать вашу DLL, чтобы увидеть шаблоны. Изучите разборку из своих собственных функций (для которых у вас есть исходный код и полная подпись), а не погружайтесь в разборку сторонних компонентов.
Я сделал довольно подробный ответ: ReactOS - ваш лучший выбор, как кажется, все здесь немного не в себе.
Я настоятельно не хотел бы пытаться разобрать системные DLL.
Гораздо более выгодный (и я не думаю, что обсуждаемый так далеко от внешнего вида вещей) метод состоит в перечислении содержимого PDB.
Как вы, возможно, знаете, файлы PDB являются символами отладки, однако Microsoft обязана из-за действий антимонопольного суда выпускать большие объемы незарегистрированной информации.
Полностью точная, полезная и обновляемая информация для огромного количества API Windows документируется только через файлы PDB. Соглашение о вызовах, количество аргументов и даже типы и имена аргументов документированы (однако, конечно, не специфика использования:).
Посмотрите DIA SDK, dia2dump - хороший пример, поставляемый с Visual Studio, для дальнейшего изучения, он также предоставляет решение для удаления функций, предназначенных специально для вашего вопроса.
Кроме того, kernel32 предоставляет UnDecorateSymbolName, так что вы можете использовать это также, если вы не хотите связываться с отладочными библиотеками SDK.
Единственный способ сделать это - разобрать функцию и посмотреть, как она использует регистры и стек. IDA Pro - лучший инструмент для этого, но он не является тривиальным.
Это COM Dll? Если это COM Dll, то зарегистрируйте его, используйте представление OLE, чтобы узнать Интерфейсы и параметры.
Прежде всего, загрузите Dependency Walker и откройте в нем свою DLL. Вы увидите экспортированные и импортированные символы. Если имя вашей функции выглядит как _MyFunction - это стиль "C" (не оформлен), и вы не слишком много с ним делаете (возможно, разберите, как было сказано ранее)
Если это больше похоже на?_MyFunction@LoNgSetOfSome@_StrangeChAracTers это C++ - оформлено, и вы можете попытаться "декорировать" его, используя {неофициальную} информацию отсюда
Если единственная часть информации, которую вы имеете, - это недокументированное имя функции, то, к сожалению, невозможно определить параметры функции из этого.
Если вы хорошо разбираетесь в сборке, возможно, можно разобрать машинный код для функции и выполнить обратный инжиниринг. Но это довольно сложно сделать для всех, кроме самых простых функций.
Я не очень знаком с форматом PE, который используется в Windows, но я уверен, что не существует простого способа сделать это. Если таблица символов не была удалена, вы можете найти некоторую информацию (не уверен, как Windows хранит отладочную информацию в PE), но она почти наверняка не поможет вам с типами параметров. Лучше всего загрузить DLL в отладчик и поэкспериментировать с ней... отслеживать необработанную память в кадрах стека, отправлять различные типы переменных и т. Д.
Даже если вы найдете хороший ресурс по отладочной информации в PE-файле, почти наверняка не будет никакой информации для частной функции.