因为我想创建一个自解压格式文件(* .exe), 所以我按照以下网址的说明进行操作:
Secure loading of libraries to prevent DLL preloading attacks
为了防止DLL劫持漏洞,我尝试使用SetDllDirectory()
使当前工作目录(CWD)无效,如下所示:
namespace DllPreload
{
static class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetDllDirectory(string lpPathName);
/// <summary>
/// Here is the main entry point of the application.
/// </summary>
[STAThread]
static void Main()
{
SetDllDirectory("");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
但是,在CWD中放置易受攻击的DLL(例如DWMAPI.DLL
,DWrite.dll
等),DLL会在入口点Main()
可以调用SetDllDirectory()
之前无意中加载
Windows 10(64位)中再现的其他文件名如下。
我将验证码放在GitHub中:
https://github.com/hibara/DllPreload
演示代码中DWMAPI.DLL
,DWrite.dll
目录中的 Debug
和Release
是已配置DLL预加载的DLL。验证DLL的源代码如下:
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
MessageBox(NULL,
"This program is vulnerable to DLL Hijacking.",
"DLL Hijacked",
MB_OK);
return TRUE;
}
所以我的问题是:在这种情况下可以做些什么?
答案 0 :(得分:0)
防止不安全加载仅适用于使用LoadLibrary/Ex()
动态加载的DLL,因此您可以控制加载它们的 。 DllImport
加载DLL 静态,这就是为什么它们会在main()
运行之前加载,而您无法控制它们。
有关如何在C#中使用LoadLibrary/Ex()
的信息,请参阅Dynamically calling an unmanaged dll from .NET (C#)。