Поиск параметров функции Dll

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

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

Мы будем признательны за любую помощь.


person user37875    schedule 15.11.2008    source источник


Ответы (7)


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

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

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

person Community    schedule 16.11.2008
comment
Хм.... Судя по моему ответу :P (шутка, хорошо;), в любом случае вам вообще не нужно разбирать, вы можете получить гораздо более точную информацию намного быстрее, прежде чем прибегать к этому, на самом деле это последнее возможное средство после шаги, которые я предложил. - person RandomNickName42; 02.07.2009

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

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

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

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

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

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

Кроме того, ядро ​​​​32 предоставляет UnDecorateSymbolName, поэтому вы можете использовать его, если не хотите ссылаться на библиотеки отладки SDK.

person RandomNickName42    schedule 02.07.2009

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

person Ana Betts    schedule 15.11.2008
comment
Хороший ответ, наверное, мне следует удалить свой. надо поработать над краткостью :) - person Jason Coco; 15.11.2008

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

person Vinay    schedule 16.11.2008

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

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

person Dmitry Khalatov    schedule 18.11.2008
comment
PE Explorer может внутренне разбирать экспортированные символы из библиотек, скомпилированных с помощью компиляторов Microsoft и Borland C++: heaventools.com /unmangle.htm - person Wylder; 16.07.2010

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

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

person Greg Hewgill    schedule 15.11.2008

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

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

person Jason Coco    schedule 15.11.2008