通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法

Avoid dll pre-loading vulnerability by reloading dll, any better way?

本文关键字:DLL 加载 漏洞 任何 更好 方法 新加载      更新时间:2023-10-16

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

要添加到搜索路径的目录。如果此参数是 空字符串("(,呼叫从 默认DLL搜索顺序。如果此参数为null,则功能 还原默认搜索顺序。

令人惊讶的是它无效。如果DLL在此处存在,我可以看到DLL仍在从当前目录中加载。我还厌倦了将DLL目录路径设置为System 32路径,但仍然从当前目录中选择DLL。最后,我决定将所有模块加载到我的应用程序中,然后重新加载它们。我的代码看起来像这样,

if(wcsstr(szModName,L"TestLibrary.dll"))
{
   FreeLibrary(hMods[i]);
   LoadLibrary("SomeRelavantPathTestLibrary.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;
}

从一个安全角度来看,再次使用新路径卸载和加载是毫无意义的,因为邪恶.dll可以在其dllmain中执行代码!

最好的解决方案是直接链接到尽可能少的DLL,并在Winmain功能中的其他任何内容之前致电SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)

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

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

来自loadLibrary函数 @ msdn。

呼叫SetDllDirectory将对完整的路径无能为力。