Нахождение параметров функции Dll - PullRequest
18 голосов
/ 15 ноября 2008

Как найти параметры недокументированной функции Dll?

Я искал по всему интернету и в итоге нашел один способ: он включает в себя декорированные функции. Тем не менее, я не могу найти способ получить их.

Любая помощь будет оценена.

Ответы [ 7 ]

8 голосов
/ 16 ноября 2008

Вам нужно разобрать приложение, используя, как заметил Пол, что-то вроде IDA Pro (или бесплатную версию того же самого).

Хорошим вводным ресурсом является Wikibook, x86 Разборка . В частности, взгляните на раздел функций и стековых фреймов . Параметры функции вывода могут быть простыми для простых функций, принимающих несколько параметров стандартного типа.

Вероятно, лучший способ начать работу с подобными вещами - это создать небольшую тестовую DLL, создать несколько функций с известными параметрами, а затем разобрать вашу DLL, чтобы увидеть шаблоны. Изучайте разборку из своих собственных функций (для которых у вас есть исходный код и полная подпись), а не погружайтесь в разборку сторонних компонентов.

8 голосов
/ 02 июля 2009

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

Я бы настоятельно не рекомендовал пытаться разобрать системные DLL-библиотеки.

A НАМНОГО Более изощренный (и я не думаю, что обсуждаемый так далеко от внешнего вида вещей) метод состоит в перечислении содержимого PDB.

Файлы PDB являются символами отладки, как вы, возможно, знаете, однако, в связи с действиями в рамках антимонопольных судебных процессов, Microsoft обязана раскрывать большие объемы незарегистрированной информации.

Полностью точная, полезная и обновляемая информация для огромного количества API Windows только , документированная с помощью файла PDB. Соглашение о вызовах, количество аргументов и даже типы и имена аргументов документируются (но не в специфике использования course:).

Просмотрите DIA SDK, dia2dump - хороший пример, распространяемый вместе с Visual Studio, для дальнейшего изучения, он также предлагает решение для декорирования функций, чтобы поговорить конкретно с вашим вопросом.

Кроме того, kernel32 предоставляет UnDecorateSymbolName, так что вы можете использовать это также, если вы не хотите ссылаться на библиотеки debug sdk.

5 голосов
/ 15 ноября 2008

Единственный способ сделать это - разобрать функцию и посмотреть, как она использует регистры и стек. IDA Pro - лучший инструмент для этого, но он не является тривиальным.

4 голосов
/ 16 ноября 2008

Это COM Dll? Если это COM Dll, то зарегистрируйте его, используйте представление OLE, чтобы узнать интерфейс и параметры.

2 голосов
/ 18 ноября 2008

Прежде всего, скачайте Dependency Walker и откройте в нем свою DLL. Вы увидите экспортированные и импортированные символы. Если имя вашей функции выглядит как _MyFunction - это стиль "C" (не оформлен), и вы не имеете к нему никакого отношения (возможно, разберите, как сказано выше)

Если это больше похоже на? _MyFunction @ LoNgSetOfSome @ _StrangeChAracTers - это C ++ - оформлено, и вы можете попытаться «декорировать» его, используя {неофициальную} информацию из здесь

1 голос
/ 15 ноября 2008

Я не очень знаком с форматом PE, который использует Windows, но я почти уверен, что не существует простого способа сделать это. Если таблица символов не была удалена, вы можете найти некоторую информацию (не уверен, как Windows хранит отладочную информацию в PE), но она почти наверняка не поможет вам с типами параметров. Лучше всего загрузить DLL в отладчик и поэкспериментировать с ней ... отслеживать необработанную память в кадрах стека, отправлять различные типы переменных и т. Д.

Даже если вы найдете хороший ресурс по отладочной информации в PE-файле, почти наверняка не будет никакой информации для частной функции.

1 голос
/ 15 ноября 2008

Если единственной информацией, которую вы имеете, является недокрашенное имя функции, то, к сожалению, невозможно определить параметры функции только из этого.

Если вы хорошо разбираетесь в сборке, возможно, можно разобрать машинный код функции и перепроектировать его. Но это довольно сложно сделать для всех, кроме самых простых функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...