DLL без экспортируемых функций? - PullRequest
10 голосов
/ 06 июля 2011

Я немного покопался в DLL-библиотеках MS-Office и заметил, что некоторые из DLL не имеют экспортируемых функций.Что я не совсем понимаю, как приложение может использовать эти библиотеки DLL без экспорта каких-либо функций?!

Я имею в виду, dllmain () выполняется на LoadLibrary (), но какой в ​​этом смысл?Зачем кому-то создавать DLL без экспортируемых функций?

спасибо!: -)

Ответы [ 5 ]

3 голосов
/ 06 июля 2011

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

3 голосов
/ 06 июля 2011

Я не смотрел на рассматриваемые DLL;но возможно, что-то вроде MSOffice Microsoft сделала это, чтобы запутать DLL, чтобы сделать ее более трудной для отладки / реинжиниринга.

Однако, как вы спросите, как бы вы использовали такую ​​DLL?Хорошо, если приложение знает макет DLL, то оно может создать указатель на функцию с адресом известной функции и вызвать ее.

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

2 голосов
/ 06 июля 2011

Ресурсы

DLL, вероятно, имеет ресурсы, такие как строковые таблицы, изображения, значки и т. Д., Используемые остальной частью Office.

2 голосов
/ 06 июля 2011

Когда вы вызываете LoadLibrary, DLL получает вызов своего DllMain. Это точка входа в DLL. Он вызывается при присоединении процесса и присоединении потока. Таким образом, у вас есть точка входа.

Как только он имеет хотя бы одну точку входа, он может создать экземпляр некоторого интерфейса (например, фабрики) и установить его, например, в виде. Переменные TLS, где другие модули будут получать их.

Таким образом, вы можете иметь подобную COM интерфейсную систему интерфейсов, которые не отображаются снаружи, кроме как для приложения. Нечто подобное - возможны многие варианты.

1 голос
/ 06 июля 2011

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

...