c - LoadLibraryExW 加载 User32.dll 失败

标签 c windows winapi dll 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);

我查看了 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_HASHLdrpCompleteMapModule , 在它检查了 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/

相关文章:

c++ - 我怎样才能在文本框中做平滑的字母(抗锯齿)

c - 如何使用c在终端上实现 "text editor"风格的界面

windows - Chromium 中的 MP4 编解码器支持

c - 当 Web 服务器创建新的 TCP 连接时,Web 浏览器缓存如何工作?

javascript - COM对象在Vista下创建一个 "Open File"对话框?

c++ - Windows C++ 中的 MSN Messenger/Growl 样式警报

c++ - 我的设备通过 USB 连接后触发 exe

c++ - 使用默认网络摄像头的 API?

c - 我的C程序在启动时一直崩溃

C 动态内存与堆栈内存变量