0

往往想LoadLibrary一个系统DLL之类的Kernel32.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);

我已经考虑过并拒绝使用Wow64DisableWow64FsRedirectionandWow64RevertWow64FsRedirection但这有问题,因为它会在库的DLLMain.

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

谢谢!

4

2 回答 2

1

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

但是,文档说(强调我的):

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

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

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

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

于 2013-10-13T07:47:40.973 回答
0

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

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

从 XP SP1 开始也支持

于 2013-10-14T07:43:40.497 回答