2013-10-13 79 views
0

经常一个人想LoadLibrary系统DLL像Kernel32.dll,得心应手LoadLibraryExdwFlags参数,允许您指定LOAD_LIBRARY_SEARCH_SYSTEM32模拟LoadLibraryEx的LOAD_LIBRARY_SEARCH_SYSTEM32功能

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

但是我必须支持的Windows XP不能使用LOAD_LIBRARY_SEARCH_SYSTEM32,因为它在以前不存在。这使我得出以下结论:我需要提出一个完全合格的路径并将其传递给LoadLibrary

但是,由于WoW64和文件系统重定向的原因,强大的实现很棘手。 我不得不担心这种可能性,因为所讨论的代码存在于一个库中,可以在奇怪的环境中调用。

我现在的想法是类似下面的伪代码:

string Path; 
BOOL Wow64Process; 
if (IsWow64Process(CurrentProcess(), &Wow64Process) && Wow64Process && 
    WoW64FSRedirectionIsDisabled) 
    Path = GetSystemWow64Directory(); 
else 
    Path = GetSystemDirectory(); 
Path += "\Kernel32.dll"; 
LoadLibrary(Path); 

我也考虑过,并使用Wow64DisableWow64FsRedirectionWow64RevertWow64FsRedirection拒绝,但是这是有问题的,因为它会留在库中的DLLMain禁用FS重定向。

鉴于上述情况,最好的方法是什么我想要做什么?

谢谢!

回答

1

在加载没有依赖关系的DLL方面,你总是在想这个。如果用户在WOW64进程中禁用了文件系统重定向,则LoadLibraryEx将尝试从64位system32文件夹加载DLL。所以你可以简单地做同样的事情,并删除所有WOW64代码。

然而,documentation说(重点煤矿):

如果使用此值,%WINDOWS%\ SYSTEM32中搜索DLL 及其依赖

因此,您的方法无法复制LOAD_LIBRARY_SEARCH_SYSTEM32,因为您只能提供您加载的DLL的完整路径,而不能提供其相关性的完整路径。

希望复制此操作的唯一方法是强制system32位于DLL搜索路径的开头。指定完整路径不会对您有所帮助。

最后,你确定LOAD_LIBRARY_SEARCH_SYSTEM32在XP64上不可用吗?

+0

我确定'LOAD_LIBRARY_SEARCH_SYSTEM32'在XP64上不受支持。它仅支持从Windows Vista到使用[KB2533623](http://support.microsoft.com/kb/2533623)的Windows 8之前,而Windows 8据称支持它_de novo_。 – user2875552

0

作为其他答案的替代使用SetDlldirectory。 优点是当前目录未被检查用于DLL加载。

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

此外,它自XP SP1以来受到支持

+0

SetDllDirectory只对调用此API后加载的模块有影响。这通常限制了延迟加载模块或手动加载模块的适用性。换句话说,'SetDllDirectory'对加载kernel32.dll的位置没有影响。 – IInspectable

+0

但这不是问题......;)问题是关于显式LoadLibrary调用的“替换”和标志LOAD_LIBRARY_SEARCH_SYSTEM32。 – xMRi

+0

*“经常需要'LoadLibrary'像Kernel32.dll一样的系统DLL”* – IInspectable