通过重新加载DLL避免dll预加载漏洞,有什么更好的方法吗?

时间:2017-06-02 03:47:34

标签: c++ winapi dll

为了避免dll预加载,我尝试使用MSDN中提到的SetDllDirectory("")来从搜索路径中删除当前目录。

  

要添加到搜索路径的目录。如果此参数是   空字符串(“”),该调用从中删除当前目录   默认的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;
}

2 个答案:

答案 0 :(得分:0)

从安全角度来看,从新路径再次卸载和加载是没有意义的,已经太晚了,因为邪恶的.dll可以在其DllMain中执行代码!

best solution将直接链接到尽可能少的DLL,并在WinMain函数中的其他任何内容之前调用SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)

答案 1 :(得分:0)

  

如果字符串指定了完整路径,则该函数仅搜索该模块的路径。

     

如果字符串指定了相对路径或没有路径的模块名称,则该函数使用标准搜索策略来查找模块;有关更多信息,请参阅备注。

来自LoadLibrary function @ MSDN

拨打SetDllDirectory对完整路径无效。