2015-12-18 2 views
-1

ok, получение файловой версии dll перед загрузкой, легко. im используя GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue, и он работает как шарм.Получение версии уже загруженной DLL (Windows API)

А что, если DLL уже загружена? Я знаю, что вы можете использовать LoadLibrary + IMAGE_DOS_HEADER + IMAGE_NT_HEADERS для получения определенной информации, такой как имена функций и т. д. Я заметил, что IMAGE_OPTIONAL_HEADER имеет разные поля версии, такие как MajorImageVersion & MinorImageVersion и т. д. Я пробовал почти все, но эти поля не всегда установлены и когда они есть, они не соответствуют значениям, возвращаемым GetFileVersionInfo. поэтому я предполагаю, что я смотрю не в то место. есть идеи?

+1

'GetModuleFileName' предоставит вам имя файла. 'LoadLibrary', если вы не знаете HMODULE загруженной dll. – dxiv

+0

Кто сказал что-нибудь про имя файла? im, пытаясь получить файловую версию уже загруженной dll. – bananashakealchemist

+0

После того, как вы получили имя, вы можете использовать код 'GetFileVersionInfoSize + GetFileVersionInfo + VerQueryValue', который у вас уже есть. Загрузится ли .dll или нет, это несущественно, когда вы получаете информацию о версии. – dxiv

ответ

3

После DLL загружается, вы можете сделать это:

  1. использовать GetModuleHandle(), чтобы получить дескриптор DLL.

  2. использование, что ручка с FindResource()/LoadResource()/LockResource() для доступа RT_VERSION данных ресурсов в DLL-.

  3. Сделайте копию данных этого ресурса блоку памяти, который вы выделяете (важно!). Используйте SizeofResource(), чтобы узнать, сколько байтов выделять и копировать.

  4. передайте этот блок памяти VerQueryValue() для доступа к его структуре VS_FIXEDFILEINFO, которая содержит номера версий DLL.

Шаг 3 имеет важное значение, потому что VerQueryValue() необходим доступ к перезаписываемой памяти (она опирается на различном fixups, сделанный в содержании памяти). Указатель памяти, возвращаемый LockResource(), указывает на постоянное запоминающее устройство. Если вы попытаетесь напрямую использовать указатель на ресурс, произойдет сбой VerQueryValue().

+0

Спасибо за помощь. это похоже на достойный подход. Им интересно, однако, если есть даже «более простой» вариант, без необходимости дополнительных вызовов api. похоже, что вы можете получить доступ к данным ресурса, передав константу IMAGE_DIRECTORY_ENTRY_RESOURCE в поле DataDirectory в IMAGE_OPTIONAL_HEADER. теперь я немного поиграю с ним и постараюсь заставить его работать. – bananashakealchemist

+0

Использование техники, которую я описываю, проще и безопаснее, чем сверление непосредственно в PE-заголовке. Навигация по PE сложный. –

+0

Да, я знаю, но я пытаюсь лучше понять все безумие. его легко, если вы уже знаете ответ, но я думаю, мне просто нравится бросать вызов себе. – bananashakealchemist

Смежные вопросы