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

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

ОБНОВЛЕНИЕ. Используя инструмент под названием API Monitor, я могу подключиться к процессу, который использует упомянутую dll и посмотрите вызовы функций. Это позволяет мне видеть количество параметров, возвращаемое значение и их целочисленные значения (указатели?), Но это не очень помогает. Я, вероятно, должен найти способ определить, на какой тип структур указывают указатели во время вызова.


person huseyint    schedule 22.12.2008    source источник


Ответы (3)


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

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

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

person Rob Kennedy    schedule 22.12.2008

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

Удачи!

person Daniel Paull    schedule 22.12.2008

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

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

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

person Roddy    schedule 22.12.2008