Windows 模拟LoadLibraryEx';s加载\u库\u搜索\u系统32功能

Windows 模拟LoadLibraryEx';s加载\u库\u搜索\u系统32功能,windows,winapi,dll,Windows,Winapi,Dll,通常人们希望LoadLibrary像Kernel32.DLL那样的系统DLL,而LoadLibraryEx有一个dwFlags参数,允许您指定LOAD\u LIBRARY\u SEARCH\u SYSTEM32 出于安全原因,这可能非常重要,因为恶意攻击者可以破坏LoadLibrary查看的默认搜索路径 然而,我必须仍然支持的Windows XP不能使用LOAD\u LIBRARY\u SEARCH\u SYSTEM32,因为它在很久以前就不存在了。这使我得出以下结论:我需要找到一个完全限定的路

通常人们希望
LoadLibrary
Kernel32.DLL那样的系统DLL,而
LoadLibraryEx
有一个
dwFlags
参数,允许您指定
LOAD\u LIBRARY\u SEARCH\u SYSTEM32

出于安全原因,这可能非常重要,因为恶意攻击者可以破坏
LoadLibrary
查看的默认搜索路径

然而,我必须仍然支持的Windows XP不能使用
LOAD\u LIBRARY\u SEARCH\u SYSTEM32
,因为它在很久以前就不存在了。这使我得出以下结论:我需要找到一个完全限定的路径,并将其传递给
LoadLibrary

然而,由于WoW64和文件系统重定向的原因,这一功能的健壮实现非常棘手。 我不得不担心这种可能性,因为所讨论的代码存在于库中,并且可以在陌生的环境中调用

我目前的想法类似于以下伪代码:

string Path;
BOOL Wow64Process;
if (IsWow64Process(CurrentProcess(), &Wow64Process) && Wow64Process && 
    WoW64FSRedirectionIsDisabled)
    Path = GetSystemWow64Directory();
else
    Path = GetSystemDirectory();
Path += "\Kernel32.dll";
LoadLibrary(Path);
我已经考虑并拒绝使用
Wow64DisableWow64FsRedirection
Wow64RevertWow64FsRedirection
,但这是有问题的,因为它会在库的
DLLMain
中禁用FS重定向

鉴于上述情况,我想做的事情的最佳方式是什么


谢谢

在加载没有依赖项的DLL方面,您考虑得太多了。如果用户在WOW64进程中禁用了文件系统重定向,则
LoadLibraryEx
将尝试从64位system32文件夹加载DLL。因此,您可以简单地执行完全相同的操作并删除所有WOW64代码

然而,专家说(我的重点):

如果使用此值,将搜索%windows%\system32以查找DLL及其依赖项

因此,您的方法无法复制
LOAD\u LIBRARY\u SEARCH\u SYSTEM32
,因为您只能为加载的DLL提供完整路径,而不能为其依赖项提供完整路径

希望复制这种情况的唯一方法是强制
system32
位于DLL搜索路径的开头。指定完整路径对您没有帮助


最后,您确定XP64上没有
LOAD\u LIBRARY\u SEARCH\u SYSTEM32
吗?

作为其他答案的替代方法,请使用SetDlldirectory。 优点是不检查当前目录的DLL加载

仍然打开的是路径搜索。。。但这是在最后一个位置,因此应该首先使用SettDllDirectory加载位于SYSTEM32目录中的DLL


此外,由于XP SP1支持它,我确信XP64不支持
LOAD\u LIBRARY\u SEARCH\u SYSTEM32
。它仅在Windows Vista到Windows 8之前的版本中受支持,而Windows 8声称从头支持它。
SetDllDirectory
仅对调用此API后加载的模块有效。这通常限制了延迟加载模块或手动加载模块的适用性。换句话说,
SetDllDirectory
对从何处加载kernel32.dll没有影响。但这不是问题…;)问题是关于显式LoadLibrary调用和标志LOAD_LIBRARY_SEARCH_SYSTEM32的“替换”。如果使用SetDllDirectory,通常不会加载“外部”Kernel32.DLL,因为“有问题”的当前目录“已不在搜索路径中!如果内核32已经在内存中,则通过PATH变量进行DLL植入/劫持将不起作用。对于99.9%的所有应用程序,情况就是这样。如果我错了,请纠正我。