十種程序注入技術介紹:常見注入技術及趨勢調查
前言
程序注入是一種廣泛使用的躲避檢測的技術,通常用於惡意軟體或者無檔案技術。其需要在另一個程序的地址空間內執行特製程式碼,程序注入改善了不可見性,同時一些技術也實現了永續性。儘管目前有許多程序注入技術,但在這篇文章中,我將會介紹十種在野發現的,在另一個程式的地址空間執行惡意程式碼的程序注入技術,並提供這些技術應用的截圖,以便於逆向工程和惡意軟體分析,然後協助檢測並防禦這些程序注入技術。
一、通過CREATEREMOTETHREAD和LOADLIBRARY進行經典DLL注入
該技術是用於將惡意軟體程式碼注入另一個程序最常用技術之一,惡意軟體作者將惡意的動態連結庫(DLL)的路徑寫入另一個程序的虛擬地址空間,並通過在目標程序中建立一個遠端執行緒來確保目標程序載入它。
惡意軟體首先需要選擇被注入的目標程序(例如svchost.exe),這通常可以通過呼叫三個應用程式設計介面(API)搜尋程序來完成:CreateToolhelp32Snapshot,Process32First和Process32Next。CreateToolhelp32Snapshot是用於列舉指定程序或所有程序的堆或模組狀態的API,其會返回一個快照。Process32First會檢索有關快照中第一個程序的資訊,然後通過迴圈Process32Next來迭代。找到目標程序後,惡意軟體通過呼叫OpenProcess獲取目標程序的控制代碼。
如圖一所示,惡意軟體呼叫VirtualAllocEx來獲得寫入其DLL路徑的空間。然後惡意軟體呼叫WriteProcessMemory在已分配的記憶體中寫入路徑。最後,為了讓程式碼在另一個程序中執行,惡意軟體作者會呼叫API,例如CreateRemoteThread,NtCreateThreadEx或RtlCreateUserThread。後兩個並未存在應用記錄,但是一般的想法就是將LoadLibrary的地址傳遞給其中一個API,以便遠端程序不得不代表惡意軟體執行DLL。
很多防毒軟體都會追蹤和標記CreateRemoteThread,此外,注入也需要磁碟上存在惡意DLL。但這是可以被檢測到的。考慮到攻擊者最常通過注入程式碼以逃避檢測,所以一些老練的攻擊者可能並不會使用這種方法。下面的截圖展示了一個叫Rebhip的惡意軟體應用了此技術。
二、PORTABLE EXECUTABLE注入(PE注入)
這種技術斌沒有傳遞LoadLibrary的地址,而是將其惡意程式碼複製到已存在的開放程序並執行(通過shellcode或呼叫CreateRemoteThread)。PE注入相對於LoadLibrary注入的一個優點是惡意軟體不必在磁碟上放一個惡意DLL。與第一種技術類似,惡意軟體在宿主程序中分配到記憶體,其並沒有編寫“DLL路徑”,而是通過呼叫WriteProcessMemory來編寫其惡意程式碼。然而,這種方法的一個缺陷是目標基址的改變,當惡意軟體將其PE注入到另一個程序時,其會有一個新的不可預測的基址,這就要求其動態地重新計算PE的地址。為了解決這個問題,惡意軟體需要在宿主程序中找到其重定位表地址,並通過迴圈其重定位描述符來解析絕對地址。
此技術類似於其他技術,例如反射式DLL,因為它們不會將任何檔案放在磁碟,但是,反射式DLL注入方法甚至會更加隱蔽。它們不依賴於任何額外的Windows API(例如CreateRemoteThread或LoadLibrary),因為它們在記憶體中載入和執行自己。反射式DLL注入通過建立一個DLL來實現,該DLL在執行時將自身對映到記憶體,而不是依賴於Windows的loader。
在分析PE注入時,呼叫CreateRemoteThread之前通常會看到迴圈(通常是兩個“for”迴圈,一個巢狀在另一箇中)這種技術在crypter(加密和混淆惡意軟體的軟體)中非常流行。在圖二中,樣本的單元測試中正在利用這種技術。程式碼有兩個巢狀迴圈來調整其重定位表,可以在呼叫WriteProcessMemory和CreateRemoteThread之前看到它。“AND 0x0fff”指令是另一個好指示,表明前12位用於獲取包含重定位塊的虛擬地址的偏移量。既然惡意軟體已經重新計算了所有必要的地址,那麼它需要做的只是將其起始地址傳遞給CreateRemoteThread並讓它執行。
三、PROCESS HOLLOWING技術(又名 PROCESS REPLACEMENT AND RUNPE)
惡意軟體可以不用將程式碼注入宿主程式,而是利用Process Hollowing技術。當惡意軟體從目標程序中取消對映,並使用惡意可執行檔案覆蓋目標程序的記憶體空間時,會發生Process Hollowing。
惡意軟體首先會建立一個新程序,以掛起模式託管惡意程式碼,如圖三所示,這是通過呼叫CreateProcess並將Process Creation Flag設定為CREATE_SUSPENDED(0×00000004)來完成的。新程序的主執行緒是在掛起狀態下建立的,並且在呼叫ResumeThread函式之前不會執行。接下來,惡意軟體需要使用惡意載荷交換合法檔案的內容,這是通過呼叫ZwUnmapViewOfSection或NtUnmapViewOfSection來取消對映目標程序的記憶體完成的。這兩個API基本上釋放了一個區的所有記憶體。現在記憶體處於未對映狀態,loader執行VirtualAllocEx為惡意軟體分配新記憶體,並使用WriteProcessMemory將每個惡意軟體的部分寫入目標程序空間。而惡意軟體通過呼叫SetThreadContext將入口點指向它已編寫的新程式碼段。最後,惡意軟體通過呼叫ResumeThread恢復掛起的執行緒,使程序退出掛起狀態。
四、執行緒執行劫持技術(或者說SUSPEND, INJECT, AND RESUME (SIR))
該技術與先前討論的Process Hollowing技術有一些相似之處。線上程執行劫持中,惡意軟體以程序的現有執行緒為目標,並避免任何其他的程序或執行緒建立操作。因此,在分析期間,你可能會看到對CreateToolhelp32Snapshot和Thread32First的呼叫,然後是OpenThread。
獲取目標執行緒的控制代碼後,惡意軟體通過呼叫SuspandThread來掛起這個執行緒,然後呼叫VirtualAllocEx和WriteProcessMemory來分配記憶體並執行程式碼注入。程式碼可以包含shellcode,惡意DLL的路徑以及LoadLibrary的地址。
圖4展示了使用這種技術的通用木馬。為了劫持執行緒的執行,惡意軟體通過呼叫SetThreadContext來修改目標執行緒的EIP暫存器(包含下一條指令的地址的暫存器)。之後,惡意軟體恢復執行緒來執行它已寫入主機程序的shellcode。從攻擊者的角度來看,SIR方法可能會出問題,因為在系統呼叫過程中掛起和恢復執行緒會導致系統崩潰。為了避免這種情況,如果EIP暫存器在NTDLL.dll範圍內,複雜一點的惡意軟體會稍後重新嘗試。
五、通過SETWINDOWSHOOKEX進行HOOK注入
HOOK是一種攔截函式呼叫的技術,惡意軟體可以利用HOOK的功能在特定執行緒中觸發事件時載入其惡意DLL。這通常通過呼叫SetWindowsHookEx將hook routine安裝到HOOK鏈中來完成。SetWindowsHookEx函式有四個引數。第一個引數是事件的型別。事件反映了HOOK型別的範圍,從鍵盤上的按鍵(WH_KEYBOARD)到滑鼠輸入(WH_MOUSE),CBT等等。第二個引數是指向惡意軟體想要在事件上呼叫的函式的指標。第三個引數是包含該函式的模組。因此,在呼叫SetWindowsHookEx之前,通常會看到對LoadLibrary和GetProcAddress的呼叫。此函式的最後一個引數是與HOOK過程相關聯的執行緒。如果此值設定為零,則所有執行緒都會在觸發事件時執行操作。但是,惡意軟體通常針對一個執行緒以降低噪聲,因此在SetWindowsHookEx之前也可以看到呼叫CreateToolhelp32Snapshot和Thread32Next來查詢和定位單個執行緒。注入DLL後,惡意軟體代表其threadId傳遞給SetWindowsHookEx函式的程序執行其惡意程式碼。在圖5中,Locky Ransomware實現了這種技術。
六、通過修改登錄檔實現注入和永續性
Appinit_DLL,AppCertDlls和IFEO(映像檔案執行選項)都是惡意軟體用於注入和永續性的登錄檔項。條目位於以下位置:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls HKLM\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls HKLM\Software\Microsoft\Windows NT\currentversion\image file execution options
AppInit_DLLs
惡意軟體可以在Appinit_Dlls登錄檔項下插入其惡意庫的位置,以使另一個程序載入其庫。此登錄檔項下的每個庫都會載入到每個載入User32.dll的程序中。User32.dll是一個非常常見的庫,用於儲存對話方塊等圖形元素。因此,當惡意軟體修改此子鍵時,大多數程序將載入惡意庫。圖6展示了Ginwui依賴這種注入和永續性方法的木馬。它只是通過呼叫RegCreateKeyEx開啟Appinit_Dlls登錄檔項,並通過呼叫RegSetValueEx來修改其值。
AppCertDlls
此方法與AppInit_DLLs方法非常相似,只是此登錄檔項下的DLL被載入到呼叫Win32 API函式CreateProcess,CreateProcessAsUser,CreateProcessWithLogonW,CreateProcessWithTokenW和WinExec的每個程序中。
映像檔案執行選項(IFEO)
IFEO通常用於除錯目的。開發人員可以在此登錄檔項下設定“偵錯程式值”,以將程式附加到另一個可執行檔案以進行除錯。因此,每當啟動可執行檔案時,會啟動附加到它的程式。要使用此功能,你只需提供偵錯程式的路徑,並將其附加到要分析的可執行檔案。惡意軟體可以修改此登錄檔項以將其自身注入目標可執行檔案。在圖7中,Diztakun木馬通過修改工作管理員的偵錯程式值來實現此技術。
七、APC注入和ATOMBOMBING
惡意軟體可以利用非同步過程呼叫(APC)通過將其附加到目標執行緒的APC佇列來強制另一個執行緒執行其特製程式碼。每個執行緒都有一個APC佇列,它們等待目標執行緒進入可變狀態時執行。如果執行緒呼叫SleepEx,SignalObjectAndWait,MsgWaitForMultipleObjectsEx,WaitForMultipleObjectsEx或WaitForSingleObjectEx函式,則執行緒進入可更改狀態。惡意軟體通常會查詢處於可更改狀態的任何執行緒,然後呼叫OpenThread和QueueUserAPC將APC排入執行緒。 QueueUserAPC有三個引數:
1)目標執行緒的控制代碼; 2)指向惡意軟體想要執行的功能的指標; 3)傳遞給函式指標的引數。
在圖8中,Amanahe惡意軟體首先呼叫OpenThread來獲取另一個執行緒的控制代碼,然後通過LoadLibraryA呼叫QueueUserAPC作為函式指標,將其惡意DLL注入另一個執行緒。
AtomBombing是一項由enSilo研究首次引入的技術,然後用於Dridex V4。 正如我們在前一篇文章中詳細討論的那樣,該技術也依賴於APC注入。 但是,它使用原子表寫入另一個程序的記憶體。
八、通過SETWINDOWLONG進行附加視窗記憶體注入(EWMI)
EWMI依賴於注入資源管理器托盤視窗的額外視窗記憶體,並且已經在Gapz和PowerLoader等惡意軟體系列中應用過幾次。註冊視窗類時,應用程式可以指定一些額外的記憶體位元組,稱為額外視窗記憶體(EWM)。但是,EWM的空間不大。為了規避此限制,惡意軟體將程式碼寫入explorer.exe的共享部分,並使用SetWindowLong和SendNotifyMessage使用指向shellcode的函式指標,然後執行它。
在寫入共享部分時,惡意軟體有兩種選擇。它既可以建立共享空間,也可以將其對映到自身和另一個程序(例如explorer.exe),也可以只打開已存在的共享空間。除了一些其他API呼叫之外,前者還有分配堆空間和呼叫NTMapViewOfSection的開銷,因此後一種方法更常用。在惡意軟體將其shellcode寫入共享部分後,它使用GetWindowLong和SetWindowLong來訪問和修改“Shell_TrayWnd”的額外視窗記憶體。GetWindowLong是一個API,用於將指定偏移量的32位值檢索到視窗類物件的額外視窗記憶體中,SetWindowLong用於更改指定偏移量的值。這樣一來,惡意軟體可以簡單地更改視窗類中的函式指標的偏移量,並將其指向寫入共享部分的shellcode。
與上面提到的大多數其他技術一樣,惡意軟體需要觸發它特製的程式碼。在先前討論的技術中,惡意軟體通過呼叫諸如CreateRemoteThread,QueueUserAPC或SetThreadContext之類的API來實現此目的。使用此方法,惡意軟體會通過呼叫SendNotifyMessage來觸發注入的程式碼。執行SendNotifyMessage後,Shell_TrayWnd接收控制並將控制轉移到之前由SetWindowLong設定的值指向的地址。在圖9中,名為PowerLoader的惡意軟體使用此技術。
九、SHIMS注入
Microsoft向開發人員提供SHIMS主要是為了向後相容。SHIMS允許開發人員將修補程式應用於他們的程式,而無需重寫程式碼。通過利用SHIMS,開發人員可以告訴作業系統如何處理應用程式。SHIMS本質上是一種掛鉤API並定位特定可執行檔案的方法。惡意軟體可以利用SHIMS來定位永續性和注入的可執行檔案。Windows在載入二進位制檔案時執行Shim Engine以檢查SHIMS資料庫以應用適當的修復程式。
現在有許多方法應用修復程式,但惡意軟體的最愛是與安全相關的(例如,DisableNX,DisableSEH,InjectDLL等)。要安裝填充資料庫,惡意軟體可以部署各種方法。例如,一種常見的方法是簡單地執行sdbinst.exe,並將其指向惡意sdb檔案。在圖10中,廣告軟體“按導管搜尋保護”使用墊片進行永續性和注入。它在Google Chrome中執行“InjectDLL”填充程式以載入vc32loader.dll。有一些用於分析sdb檔案的現有工具,但是為了分析下面列出的sdb,我使用了python-sdb。
十、IAT HOOKING和INLINE HOOKING (或者叫應用層ROOTKITS)
IAT hooking和inline hooking通常稱為userland rootkit。IAT hooking是惡意軟體用於更改匯入地址表的技術。當合法應用程式呼叫位於DLL中的API時,其會執行替換的函式,而不是原始函式。相反,使用inline hooking,惡意軟體則會修改API函式本身。在圖11中,惡意軟體FinFisher通過修改CreateWindowEx指向的位置來執行IAT hooking。
總結
在這篇文章中,我介紹了惡意軟體用於在另一個程序中隱藏其活動的十種不同技術。通常,惡意軟體會直接將其shellcode注入另一個程序,或者強制另一個程序載入其惡意庫。在表1中,我對各種技術進行了分類,並提供了樣本作為閱讀本文所涵蓋的每種注入技術的參考。
*參考來源: ofollow,noindex" target="_blank">endgame ,FB小編Covfefe編譯,轉載請註明來自FreeBuf.COM