DLL注入(英語:DLL injection)是一種涉及電腦資訊安全的特殊編程技術,它可以強行使一個處理程序載入某個動態連結媒體櫃以在其私有位址空間內執行指定程式碼(往往是惡意程式碼)。[1]DLL注入的常見手段是用外部DLL媒體櫃覆蓋一個程式原先的DLL媒體櫃,目的是實現該程式的作者未預期的結果。[2][3]比如,注入的程式碼可以掛鉤(Hook)系統訊息或系統呼叫[4][5],以達到讀取密碼框的內容等危險目的,而一般編程手段無法達成這些目的。[6]


能將任意程式碼注入任意處理程序的程式被稱為DLL注入器(DLL injector)。

實現方式

Windows平台

  • 先利用惡意TSR程式呼叫惡意DLL,在惡意DLL初始化時,由TSR定位待注入目標程式並將其控制代碼傳遞至DLL中的注入函式,注入函式會繞過安全權限並向目標程式的私有位址空間申請一塊預留空間,並在該空間內展開後續惡意操作[7]

Unix平台

  • 類Unix作業系統上,基於ld.so(在BSD上)和ld-linux.so(在Linux上)的動態連結器,可以通過在LD_PRELOAD環境變數中指定媒體櫃的路徑名,將任意媒體櫃連結到新處理程序中,該變數可以全域設定或單獨為某個處理程序設定。[8]

例如,在Linux系統上,這條命令會在啟動時將檔案"test.so"中的共享媒體櫃連結到命令"prog"中:

LD_PRELOAD="./test.so" prog

這樣的媒體櫃可以像其他共享對象一樣建立。在GCC中,這涉及到使用-fpic或-fPIC選項編譯包含要連結的新全域變數的原始檔[9],並使用-shared選項進行連結。[10]該媒體櫃可以像其他媒體櫃一樣訪問程式中聲明的外部符號。

  • macOS上,以下命令會在啟動時將檔案"test.dylib"中的共享媒體櫃連結到命令"prog"中:[11]
    DYLD_INSERT_LIBRARIES="./test.dylib" DYLD_FORCE_FLAT_NAMESPACE=1 prog
    
    在類Unix系統上,也可以使用基於除錯器的技術。[12]

參考資料

  1. ^ James Shewmaker. Analyzing DLL Injection (PDF). GSM Presentation. Bluenotch. 2006 [2008-08-31]. (原始內容 (PDF)存檔於2008-12-03). 
  2. ^ Iczelion. Tutorial 24: Windows Hooks. Iczelion's Win32 Assembly Homepage. August 2002 [2008-08-31]. (原始內容存檔於2008-08-01). 
  3. ^ Rocky Pulley. Extending Task Manager with DLL Injection. CodeProject. CodeProject. 2005-05-19 [2008-09-01]. (原始內容存檔於2009-02-06). 
  4. ^ Nasser R. Rowhani. DLL Injection and function interception tutorial. CodeProject. CodeProject. 2003-10-23 [2008-08-31]. (原始內容存檔於2008-06-15). 
  5. ^ Ivo Ivanov. API hooking revealed. CodeProject. CodeProject. 2002-12-02 [2008-08-31]. (原始內容存檔於2008-10-14). 
  6. ^ Robert Kuster. Three Ways to Inject Your Code into Another Process. CodeProject. CodeProject. 2003-08-20 [2008-08-31]. (原始內容存檔於2008-07-20). 
  7. ^ Tutorial 24: Windows Hooks. [2018-04-14]. 原始內容存檔於2008-08-01. 
  8. ^ UNIX man pages : ld.so (8). web.archive.org. 2009-02-06 [2024-06-10]. 
  9. ^ Code Gen Options - Using the GNU Compiler Collection (GCC). gcc.gnu.org. [2024-06-10]. 
  10. ^ Link Options - Using the GNU Compiler Collection (GCC). gcc.gnu.org. [2024-06-10]. 
  11. ^ Goldsborough, Peter. The LD_PRELOAD trick. Peter Goldsborough. [2024-06-10]. 
  12. ^ Code Injection into Running Linux Application. CodeProject. 2009-02-12 [2024-06-10] (美國英語). 

Category:電腦程式媒體櫃 Category:執行緒 Category:Windows管理