LoadLibraryExW 无法加载 User32.dll

Ant*_*ith 4 c windows dll winapi loadlibrary

当尝试通过 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);
Run Code Online (Sandbox Code Playgroud)

我查看了 DLL 本身,它是在 2020 年 4 月 8 日签署的(针对我机器上的版本),因此它应该仍然有效。

我做错了什么吗?

Ery*_*Sun 6

显然要求PE映像在其DLL特性中与(0x0080)LOAD_LIBRARY_REQUIRE_SIGNED_TARGET链接。这是一个标志,强制内核中的内存管理器在加载图像时检查数字签名。请参阅链接器选项/INTEGRITYCHECKIMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY

大多数系统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
Run Code Online (Sandbox Code Playgroud)

我对代码签名的主题以及加载器和内存管理器中的实现细节不太了解。我只是使用调试器在检查 DLL 特征中的 0x80 后发现加载失败并显示STATUS_INVALID_IMAGE_HASHin 。LdrpCompleteMapModule从那里我搜索了有关此值以及/integritycheck与 相关的选项的讨论LOAD_LIBRARY_REQUIRE_SIGNED_TARGET。我发现了一些非官方参考资料,声称后者需要前者。因此,我编写了一个脚本来转储系统 DLL 的 DLL 特征,以便找到具有该IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY标志的DLL。找到“bcrypt.dll”并检查它是否尚未加载后,我确认加载它LOAD_LIBRARY_REQUIRE_SIGNED_TARGET确实有效。