Очевидно, 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
действительно работает.