通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法
Avoid dll pre-loading vulnerability by reloading dll, any better way?
为了避免使用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
将对完整的路径无能为力。
相关文章:
- 从 wxWidgets 中的.DLL加载图标
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 无法使用c++/cli包装从c#dll加载函数
- 混合延迟 dll 加载和手动调用 LoadLibraryA 是否安全?
- 无法从 dll 加载函数
- 如何设置我的dll加载,该dll取决于Env-ailiable的某些第三部分DLL
- 将本机非托管的C DLL加载到托管的C#应用中,导致DLL输出垃圾
- 无法在 Python 3.5 上导入 cv2 DLL 加载失败
- 当使用“空dllmain”的dll加载链接到DLL时,应用程序无法启动(0xc0000142)
- 如何从DLL加载的DLL链接到函数
- 如何从Java中的C DLL加载和使用结构和功能
- 我可以用具有相同功能名称的多个DLL加载元素吗?
- 窗口挂钩和 dll 加载
- CEGUI-从DLL加载资源
- 什么可能导致时间函数和 DLL 加载之间死锁
- 以下代码是如何工作的(从DLL加载动态类)
- 错误:Visual Studio中没有为opencv_world310.dll加载符号
- 使用 LoadLibraryA 的 dll 加载错误
- 从 WinAPI C 项目中的专用 DLL 加载图像资源
- 模块"MyShellExt.dll"加载失败