2017-06-02 73 views
-3

爲了避免dll預加載,我嘗試使用SetDllDirectory(""),因爲它在MSDN中提到要從搜索路徑中刪除當前目錄。避免通過重新加載DLL,任何更好的方式預加載的漏洞?

要添加到搜索路徑的目錄。如果此參數是空字符串(「」) ,則調用將從 默認DLL搜索順序中刪除當前目錄。如果此參數爲NULL,則功能 將恢復默認搜索順序。

令人驚訝的是它沒有奏效。我可以看到DLL仍然從當前目錄加載,如果DLL出現在那裏。我也厭倦將dll目錄路徑設置爲系統32路徑,但它仍然從當前目錄中選取dll。最後,我決定讓所有模塊加載到我的應用程序中並重新加載它們。我的代碼看起來像這樣,

if(wcsstr(szModName,L"TestLibrary.dll")) 
{ 
    FreeLibrary(hMods[i]); 
    LoadLibrary("SomeRelavantPath\TestLibrary.dll"); 
} 

你看到我的代碼什麼問題?

@Edit: 我的完整POC代碼,

int main(void) 
{ 
    SetDllDirectory(L""); 
    LPWSTR s = new WCHAR[100]; 
    GetDllDirectory(100,s); 
    HINSTANCE myDLL = LoadLibrary(L"TestLibrary.dll"); 
    //myDLL returns non-null, there is file in current dir and not at any other location, it should have return null. 
    return 0; 
} 
+0

在SetDllDirectory(「」)「之後立即嘗試」GetDllDirectory「,並立即在LoadLibrary之前。 – iehrlich

+0

@iehrlich沒有工作。有沒有任何理由調用'GetDllDirectory'應該工作? –

+0

@PranitKothari,我懷疑@iehrlich的意思是使用'GetDllDirectory'來確保搜索路徑確實已經改變爲你想要的。它改變了嗎? – yzt

回答

0

一個新的路徑卸載和加載再次是從安全角度來看毫無意義的,它是爲時已晚,因爲一個邪惡的.dll文件可能在執行其代碼DllMain的!

best solution將直接鏈接到儘可能少的DLL,並在WinMain函數的任何其他位置之前調用SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)

+0

@Andres感謝您的快速回復。我也嘗試過使用'SetDefaultDllDirectories'。遇到同樣的問題。另外,我想支持Windows 7。它分鐘的要求是贏8 –

+0

它可以在Vista和Windows 7,如果他們有Windows更新後,2011年就GetProcAddress的開啓一段時間它,如果它不存在,你只需要手動加載完整路徑的東西。 – Anders

+0

@Andres我累了'SetDefaultDllDirectories'和的Wndows'LoadLibraryEx'組合10 API在那裏工作,問題依舊。 –

0

如果字符串指定完整路徑,則該函數僅搜索該模塊的路徑。

如果字符串指定沒有路徑的相對路徑或模塊名稱,則該函數使用標準搜索策略來查找模塊;欲瞭解更多信息,請參閱備註。

LoadLibrary function @ MSDN

撥打SetDllDirectory的電話將不會對完整路徑進行任何操作。

+0

好的,所以對於我的POC代碼,我只是使用'LoadLibrary(「TestLibrary.dll」);',並從當前目錄加載dll。現在不確定它是否是相對路徑? –

+0

請將您的完整POC代碼作爲更新發布在問題中。 – iehrlich

+0

更新了我的問題。 –