gpt4 book ai didi

c++ - LoadLibrary File Not Found 取决于哪个应用程序调用

转载 作者:可可西里 更新时间:2023-11-01 11:44:06 35 4
gpt4 key购买 nike

我正在尝试实现一个名为(比方说)name.dll 的 C++ dll,它会加载另一个同样名为 name.dll 的 dll(不是我的)。

在我的 name.dll 实现中,我使用这一行加载真实的 name.dll:

            driver_library = LoadLibrary(_T("c:\\windows\\system32\\name.dll"));

我的 dll 位于 program.exe.local 文件夹中,因此程序会在 System32 中的真实程序之前加载我的程序。

根据哪个 program.exe 使用我的 dll,LoadLibrary 要么工作正常,要么返回我自己的 name.dll 句柄 作为 driver_library,GetLastError() 返回“找不到文件”。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx明确指出“如果字符串指定完整路径,则该函数仅在该路径中搜索模块。”它为何以及如何为某些应用程序加载自身?

program.exe 应用程序中的哪些内容会影响 LoadLibrary 的行为?

@Franck Boyne 评论道:“你有两个程序——我们称它们为 fine.exe 和 own.exe。fine.exe 程序加载你自己的 name.dll,然后从 System32 加载另一个 name.dll。own.exe 程序加载你自己的 name.dll但是当它调用 LoadLibrary 时,你会得到另一个你自己的 name.dll 的句柄,而不是 System32 的句柄。”

关于 own.exe(这根本不是我的“自己的”应用程序):-> name.dll 位于我创建的一个own.exe.local 文件夹中,该文件夹位于own.exe 目录中。

-> own.exe 有一个我删除的 application.manifest 文件(如果不使用我的 dll,应用程序仍然会在没有它的情况下正确启动)。 own.exe 没有嵌入式 list (使用 sigcheck 检查)。

-> name.dll 不是来自 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 的 Windows“已知 dll”之一

-> own.exe 不使用 LoadLibrary() 加载 name.dll(通过在 LoadLibrary/A/W/Ex 函数中设置断点进行检查)

-> own.exe 和 name.dll 都是 64 位的。

关于fine.exe(它是一个示例,我可以访问代码):

-> name.dll 位于 fine.exe 应用程序目录中。

-> 没有 list 文件(嵌入式或文本)。

最佳答案

您的问题程序是否可能正在使用 DLL 重定向?

来自 LoadLibrary 文档(强调已添加)...

If a path is specified and there is a redirection file for the application, the function searches for the module in the application's directory. If the module exists in the application's directory, LoadLibrary ignores the specified path and loads the module from the application's directory. If the module does not exist in the application's directory, LoadLibrary loads the module from the specified directory. For more information, see Dynamic Link Library Redirection.


2018 年 6 月 4 日更新

这是我认为正在发生的事情。

你的两个程序都在使用 load-time dynamic linking (有时称为 implicit linking )链接到名为 name.dll 的 DLL。我假设这两个程序都只指定了没有完整路径名的 name.dll。如果你想检查我想你可以运行 dumpbin /imports针对 fine.exeown.exe 检查 DLL 名称。

fine.exe

对于执行预期操作的程序(从\Windows\System32 加载第二个 name.dll),不涉及 DLL 重定向,因此 standard DLL Search Order在隐式链接期间跟随。应用程序目录在系统目录之前被搜索,因此您的 name.dll 拷贝被加载。

然后您的 name.dll 执行 LoadLibrary 调用,指定文件 C:\Windows\System32\name.dll 的完整路径.由于没有进行重定向,name.dll 的系统目录版本会按预期加载。

own.exe

如果程序没有按照您的预期执行(两次获取您自己的 name.dll 版本的句柄),则会进行 DLL 重定向,因为您有一个名为own.exe.local 在应用程序文件夹中。由于正在进行重定向,在隐式链接期间,标准搜索顺序被忽略,name.dllown.exe.local 加载。

然后您的 name.dll 执行 loadlibrary 调用,指定文件 C:\Windows\System32\name.dll 的完整路径. 但是 这次进行了重定向。 LoadLibrary 调用中指定的完整路径被忽略,模块从重定向文件夹 own.exe.local 加载。

由于 name.dll 的拷贝已经通过隐式链接加载,您只需获得模块的另一个句柄。

正如评论中所指出的,GetLastError 结果具有误导性。 LoadLibrary 调用没有返回 NULL(它返回了你自己的 name.dll 的句柄)所以 GetLastError 返回的值没有适用于 LoadLibrary 调用。

关于c++ - LoadLibrary File Not Found 取决于哪个应用程序调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50609996/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com