Подтвердить что ты не робот

Получить подписи экспортируемых функций в DLL

Можно ли получить экспортированную (C style?) подпись функции (число параметров/типы, тип возвращаемого значения) из DLL? Я могу просмотреть список имен функций, адресов, ординалов и т.д. С DLL Export Viewer, но я не могу просматривать подписи. Я имею только файл dll и не имею ни файлов .h, ни .def.

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

4b9b3361

Ответ 1

DLL не сохраняют подписи функций, которые они экспортируют. Другие ответы упомянули С++, и когда С++-функция экспортируется как С++, тогда имя действительно будет искажено. Позовите его правой схемой манипулирования компилятором, и у вас будет подпись. Но большинство DLL не экспортируют функции С++, используя их имена С++. Вместо этого функции, которые DLL выбирает для экспорта, экспортируются с использованием имен стиля C, поэтому, даже если DLL была написана на С++, экспортированные функции все равно не будут иметь никакой информации о сигнатуре.

У вас нет заголовка? Большинство поставщиков включают такие вещи в свои SDK. Если вы его не получили, то жалуйтесь поставщику. Если вы не должны были получить его, то, может быть, вы ошибаетесь в своей задаче; вы уверены, что должны использовать эту DLL напрямую?

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

Ответ 2

В С++ сигнатуры функций " mangled" в имени в зависимости от компилятора. Этого не происходит в C. Итак, если у вас есть функции C в вашей DLL, вы увидите unmangled names. Если это С++, вы увидите искаженные.

С++ требует искаженных имен, чтобы позволить компоновщику разрешать перегруженные функции с различными сигнатурами.

Я не думаю, что вы можете получить функцию singatures из библиотеки "C". Их просто нет.

Ответ 3

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

Удачи!