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