模拟LoadLibraryEx的LOAD_LIBRARY_SEARCH_SYSTEM32功能

时间:2013-10-13 07:37:49

标签: windows winapi dll

通常有人希望LoadLibraryKernel32.dll这样的系统DLL,轻而易举地LoadLibraryEx有一个dwFlags参数,允许您指定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重定向。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

在加载没有依赖关系的DLL方面,你是在考虑这个问题。如果用户在WOW64进程中禁用了文件系统重定向,则LoadLibraryEx将尝试从64位system32文件夹加载DLL。因此,您可以完全相同并删除所有WOW64代码。

然而,documentation说(强调我的):

  

如果使用此值,则会在%windows%\ system32中搜索DLL 及其依赖项

因此,您的方法无法复制LOAD_LIBRARY_SEARCH_SYSTEM32,因为您只能提供加载的DLL的完整路径,但不能提供其依赖项。

希望复制此内容的唯一方法是强制system32位于DLL搜索路径的头部。指定完整路径对您没有帮助。

最后,您确定XP64上没有LOAD_LIBRARY_SEARCH_SYSTEM32吗?

答案 1 :(得分:0)

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

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

自XP SP1以来也支持它