DLL без экспортируемых функций?

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

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

Благодарность! :-)


person TCS    schedule 05.07.2011    source источник
comment
Есть ли у них встроенные ресурсы? Иногда это для встроенных значков, изображений и т. Д., Например. C:\Windows\System32\imageres.dll   -  person user541686    schedule 06.07.2011
comment
@Mehrdad - DLL не содержат никаких ресурсов .. @ildjarn - С тех пор, как я знаю, что серверы COM должны как минимум экспортировать DllRegisterServer () и DllUnregisterServer (), я прав?   -  person TCS    schedule 06.07.2011
comment
@TCS: Если возможно, не могли бы вы сказать, какая это DLL? Мне любопытно сейчас ...   -  person user541686    schedule 06.07.2011
comment
@TCS - ресурсов вообще нет? Я нахожу это очень странным.   -  person Mark Ransom    schedule 06.07.2011
comment
@TCS: только если COM-сервер поддерживает саморегистрацию; в противном случае они не требуются.   -  person ildjarn    schedule 06.07.2011
comment
@ildjarn: а? Прости? И для COM-DLL не требуется экспортируемая фабричная (DllGetClassObject) функция, так как ... когда?   -  person 0xC0000022L    schedule 06.07.2011
comment
@ildjarn: пожалуйста, источники. Я знаю, что самостоятельная регистрация не обязательна. Но вы утверждаете, что это COM-сервер без экспорта. Как?   -  person 0xC0000022L    schedule 06.07.2011
comment
@STATUS_ACCESS_DENIED: я заметил только о DllRegisterServer и DllUnregisterServer, но да, DllGetClassObject нужно будет экспортировать, вы правы.   -  person ildjarn    schedule 06.07.2011
comment
@ildjarn: извинения. Мое замечание было адресовано TCS :)   -  person 0xC0000022L    schedule 06.07.2011
comment
@Mehrdad, @Mark - я думаю, вы были правы насчет ресурсов. Я использовал другое приложение (ResourceExtract), и оно извлекало файлы .bin (в отличие от другого проводника ресурсов ...).   -  person TCS    schedule 06.07.2011
comment
Управляемые библиотеки DLL не экспортируются. Они также могут реализовать COM-серверы, используя mscoree.dll в качестве загрузчика. Бессмысленно не упоминать имя DLL.   -  person Hans Passant    schedule 06.07.2011
comment
@Hans - не управляемый (.Net). Забавная вещь о Microsoft. Они говорят всему миру использовать .Net, но продолжают развиваться на C ++ :-)   -  person TCS    schedule 06.07.2011
comment
@TCS: Если бы у вас было миллионы строк кода на C и C ++, переключились бы вы на .NET и переписали бы большую часть кода (или хотя бы сделали несколько оболочек) из-за этого? Или вы просто оставите то, что уже работает?   -  person user541686    schedule 06.07.2011
comment
@Mehrdad, это хороший аргумент, но я знаю, что даже новые продукты в основном используются на C ++. Хотя это все еще имеет смысл, это повторное использование кода из других программ, как вы и сказали ...   -  person TCS    schedule 06.07.2011
comment
@Hans: спасибо. Узнал что-то новое.   -  person 0xC0000022L    schedule 06.07.2011


Ответы (5)


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

person Mark Ransom    schedule 05.07.2011

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

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

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

person DaveR    schedule 05.07.2011
comment
Я действительно сомневаюсь, что Microsoft сделала бы что-то подобное. В системе есть более важные библиотеки DLL, которые следует защищать, но которые нет. - person user541686; 06.07.2011
comment
@Mehrdad: Возможно; но разные команды в Microsoft совершенно независимы, а это огромная компания. Тот факт, что логически существуют другие приложения / системные библиотеки DLL, которые более «важны», не исключает возможности того, что Office делает это. - person DaveR; 06.07.2011
comment
@ Дэйв: все еще не имеет смысла. Наиболее вероятная причина в том, что это ресурсные библиотеки DLL, как указано в другом ответе. Кроме того, проще всего начать поиск кода: есть ли у него точка входа (PE-заголовок). - person 0xC0000022L; 06.07.2011

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

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

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

person c-smile    schedule 05.07.2011
comment
Если есть точка входа в DLL. Что тоже никогда не говорилось;) - person 0xC0000022L; 06.07.2011
comment
Что тоже никогда не говорилось - почему? - person c-smile; 06.07.2011
comment
возможно, потому что точка входа не указана как экспортная. Я говорю, что слишком мало деталей в части ОП. - person 0xC0000022L; 06.07.2011
comment
@STATUS_ACCESS_DENIED: точки входа exe и dll всегда есть, и нет необходимости их экспортировать. Вы не увидите их в списке экспорта PE. Или я не понимаю о чем вы. - person c-smile; 06.07.2011
comment
c-smile: вы ошибаетесь, они не всегда есть для DLL. Но они являются хорошим индикатором того, будет ли DLL также запускать код или просто содержит некоторые данные. Соответствующий параметр в VS - ResourceOnlyDLL (/noentry) ... - person 0xC0000022L; 06.07.2011
comment
Кому STATUS_ACCESS_DENIED: Я снова не понимаю, о чем вы говорите. Проверьте комментарии автора: DLL-файлы не содержат ресурсов. Так что это не ресурсная DLL. Если это не так, у него должна быть точка входа, иначе это бесполезно. - person c-smile; 07.07.2011
comment
c-smile: забудь, видимо, с этим мы никуда не денемся;) - person 0xC0000022L; 07.07.2011

Ресурсы

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

person user541686    schedule 05.07.2011

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

person Puppy    schedule 05.07.2011
comment
Не могли бы вы привести источники вашего заявления о .NET. Я действительно не думаю, что подобные утверждения в формате вопросов и ответов, основанные на вере, разумны;) ... кроме того, DLL - это не просто биты и байты. Прежде всего, он следует определенному формату (PE), и хотя ваша теория получения указателей на функции из DLL без экспорта может работать, на практике это ад поддержки. - person 0xC0000022L; 06.07.2011
comment
Спасибо за разъяснения. То есть вы имеете в виду что-то вроде манифеста, в котором описывается, где найти капли кода? Интересный. Я чувствую грядущее желание запустить свою IDA Pro :) - person 0xC0000022L; 06.07.2011