Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C LoadLibraryExW无法加载User32.dll_C_Windows_Winapi_Dll_Loadlibrary - Fatal编程技术网

C LoadLibraryExW无法加载User32.dll

C LoadLibraryExW无法加载User32.dll,c,windows,winapi,dll,loadlibrary,C,Windows,Winapi,Dll,Loadlibrary,尝试通过LoadLibraryExW加载C:\Windows\System32\user32.dll时,失败,最后一个错误是错误\u无效\u图像\u哈希 下面是如何加载的: HMODULE User32Lib = LoadLibraryExW(L"C:\\Windows\\System32\\user32.dll", NULL, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET); 我查看了DLL本身,它是在2020年4月8日签署的(针对我机器上的版本),因此它应该仍然有效

尝试通过LoadLibraryExW加载C:\Windows\System32\user32.dll时,失败,最后一个错误是错误\u无效\u图像\u哈希

下面是如何加载的:

HMODULE User32Lib = LoadLibraryExW(L"C:\\Windows\\System32\\user32.dll", NULL, LOAD_LIBRARY_REQUIRE_SIGNED_TARGET);
我查看了DLL本身,它是在2020年4月8日签署的(针对我机器上的版本),因此它应该仍然有效


我做错了什么吗?

显然
加载库\u需要\u签名\u目标
要求PE映像与its中的
映像\u DLLCHARACTERISTICS\u FORCE\u INTEGRITY
(0x0080)链接。这是一个标志,强制内核中的内存管理器在加载映像时检查数字签名。请参阅链接器选项

大多数系统DLL不具有此特性。“user32.dll”没有,但“bcrypt.dll”有:

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


我对代码签名的主题以及加载器和内存管理器中的实现细节知之甚少。在检查DLL特征中的0x80之后,我刚刚使用调试器发现加载失败,在
ldrpcompletemappmodule
中出现了
状态\u无效\u图像\u哈希值
。从那里,我搜索了关于该值的讨论,以及与
加载\u库\u需要\u签名\u目标相关的
/integritycheck
选项。我发现一些非官方的参考资料声称后者需要前者。因此,我编写了一个脚本来转储系统DLL的DLL特性,以便找到一个具有
IMAGE\u DLLCHARACTERISTICS\u FORCE\u INTEGRITY
标志的DLL。找到“bcrypt.dll”并检查它是否尚未加载,我确认用
LOAD\u LIBRARY\u REQUIRE\u SIGNED\u TARGET
加载它确实有效。

如果在没有
LOAD\u LIBRARY\u REQUIRE\u SIGNED\u TARGET
标志的情况下调用它,它加载是否正确?它在没有该标志的情况下加载是否正确。嗯。有没有可能它是一个32位可执行文件,试图加载64位dll?否,可执行文件是64位的可执行文件;在我的64位Win10机器上执行相同的操作。不知道发生了什么。。。