2013-10-13 76 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