通常有人希望LoadLibrary
像Kernel32.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);
我已经考虑过,并拒绝使用Wow64DisableWow64FsRedirection
和Wow64RevertWow64FsRedirection
,但这是有问题的,因为它会在库的DLLMain
中禁用FS重定向。
鉴于上述情况,我想要做的最好的方法是什么?
谢谢!
答案 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以来也支持它