2017-07-24 62 views
0

因爲我想創建一個自解壓格式文件(*。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.DLLDWrite.dll等,在入口點Main()可以調用SetDllDirectory()之前DLL將被無意地加載。

在Windows 10(64位)中再現的其他文件名如下所示。

  • WTSAPI32.DLL
  • PROPSYS.DLL
  • MSIMG32.DLL
  • INDOWSCODECS.DLL
  • WINSTA.dll

我把在GitHub上的驗證碼:

https://github.com/hibara/DllPreload

DWMAPI.DLLDWrite.dllDebug,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; 
} 

所以我的問題是:有什麼方法可以在這種情況下怎麼辦?

+1

通常我們不打擾防止DLL劫持,因爲正如Raymond Chen所說,你已經在密封艙口的另一邊...... – immibis

+1

其實,不是已安裝的應用程序,我想用它作爲一個自解壓文件(EXE),所以我想採取適當的措施。 – hibara

回答

0

防止不安全的負載只適用於使用LoadLibrary/Ex()加載動態 DLL文件,所以您可以控制其中他們是從加載。 DllImport加載DLL 靜態,這就是爲什麼它們在main()運行之前加載,並且您無法控制它們。如何在C#中使用LoadLibrary/Ex()請參閱Dynamically calling an unmanaged dll from .NET (C#)

+0

DllImports與「在主運行之前加載」之間沒有相關性...... OP代碼顯示問題,因爲方法必須在執行之前進行JIT,因此需要在方法運行之前執行。 –