因爲我想創建一個自解壓格式文件(*。exe文件), 所以我跟着指示以下網址:預防DLL劫持漏洞不會在工作C#
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());
}
}
}
但是,將脆弱的DLL文件,如DWMAPI.DLL
,DWrite.dll
等,在入口點Main()
可以調用SetDllDirectory()
之前DLL將被無意地加載。
在Windows 10(64位)中再現的其他文件名如下所示。
- WTSAPI32.DLL
- PROPSYS.DLL
- MSIMG32.DLL
- INDOWSCODECS.DLL
- WINSTA.dll
我把在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;
}
所以我的問題是:有什麼方法可以在這種情況下怎麼辦?
通常我們不打擾防止DLL劫持,因爲正如Raymond Chen所說,你已經在密封艙口的另一邊...... – immibis
其實,不是已安裝的應用程序,我想用它作爲一個自解壓文件(EXE),所以我想採取適當的措施。 – hibara