当尝试通过 LoadLibraryExW 加载 C:\Windows\System32\user32.dll 时,它失败并显示最后一个错误 ERROR_INVALID_IMAGE_HASH。
这是它的加载方式:
HMODULE User32Lib = LoadLibraryExW(L"C:\\Windows\\System32\\user32.dll", NULL, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET);
我查看了 DLL 本身,它是在 2020 年 4 月 8 日签署的(针对我机器上的版本),因此它应该仍然有效。
我做错了什么吗?
最佳答案
显然 LOAD_LIBRARY_REQUIRE_SIGNED_TARGET
要求 PE 镜像与 IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
链接(0x0080) 在其 DLL characteristics .这是一个标志,强制内核中的内存管理器在加载图像时检查数字签名。引用链接器选项 /INTEGRITYCHECK .
大多数系统 DLL 没有这个特性。 “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
, 在它检查了 DLL 特征中的 0x80 之后。从那里我搜索了关于这个值和 /integritycheck
的讨论。与 LOAD_LIBRARY_REQUIRE_SIGNED_TARGET
有关的选项.我发现一些非官方的引用资料声称后者需要前者。因此,我编写了一个脚本来转储系统 DLL 的 DLL 特征,以便找到具有 IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
的 DLL 特征。旗帜。找到“bcrypt.dll”并检查它尚未加载后,我确认使用 LOAD_LIBRARY_REQUIRE_SIGNED_TARGET
加载它。确实有效。
关于c - LoadLibraryExW 加载 User32.dll 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62461457/