LoadLibraryExW не может загрузить User32.dll - PullRequest
3 голосов
/ 19 июня 2020

При попытке загрузить C: \ Windows \ System32 \ user32.dll через LoadLibraryExW происходит сбой с последней ошибкой ERROR_INVALID_IMAGE_HA SH.

Вот как он загружается:

HMODULE User32Lib = LoadLibraryExW(L"C:\\Windows\\System32\\user32.dll", NULL, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET);

Я посмотрел на саму DLL, и она была подписана (для версии, установленной на моей машине) 8 апреля 2020 года, поэтому она все еще должна быть действительной.

Я что-то делаю неправильно?

1 Ответ

4 голосов
/ 20 июня 2020

Очевидно, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET требует, чтобы PE-образ был связан с IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY (0x0080) в его характеристиках DLL . Это флаг, который заставляет диспетчер памяти в ядре проверять цифровую подпись при загрузке изображения. См. Параметр компоновщика / INTEGRITYCHECK .

Большинство системных DLL не имеют этой характеристики c. В "user32.dll" его нет, но в "bcrypt.dll" есть:

PS C:\> $user32_hdr = get-peheader C:\Windows\System32\user32.dll
PS C:\> $bcrypt_hdr = get-peheader C:\Windows\System32\bcrypt.dll
PS C:\> '{0:x}' -f $user32_hdr.DllCharacteristics
4160
PS C:\> '{0:x}' -f $bcrypt_hdr.DllCharacteristics
41E0

Я не очень разбираюсь в теме подписи кода и деталях реализации в загрузчик и менеджер памяти. Я просто использовал отладчик, чтобы обнаружить, что загрузка не срабатывает с STATUS_INVALID_IMAGE_HASH в LdrpCompleteMapModule, после того как он проверил 0x80 в характеристиках DLL. Оттуда я поискал обсуждения этого значения и опции /integritycheck по отношению к LOAD_LIBRARY_REQUIRE_SIGNED_TARGET. Я нашел несколько неофициальных ссылок, в которых утверждалось, что последнее требует первого. Итак, я написал сценарий для дампа характеристик системных библиотек DLL, чтобы найти ту, которая имеет флаг IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY. Найдя "bcrypt.dll" и проверив, что он еще не загружен, я подтвердил, что загрузка его с помощью LOAD_LIBRARY_REQUIRE_SIGNED_TARGET действительно работает.

...