iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 21
1
Security

資事體大 毒擋一面 - 資安防護深入淺出系列 第 21

[Day21] 攻擊行為-幫程式打個毒針吧!!-Dll Injection

在 Windows 作業系統下,每個程序(Processs)在執行過程中,會根據程序所需調用的 APIs 載入需要的 DLL(Dynamic-Link library)。對於病毒而言,有一種技巧是將惡意程式碼包在 DLL 中,並將此 DLL inject 至正常程序裡執行,執行過程中會因為載入該 DLL 以進行病毒行為。

常見 DLL Injection 方法

下圖為此方法的流程
http://ithelp.ithome.com.tw/upload/images/20170105/2010355918ZjrdaE1Z.png

流程介紹

  1. 首先我們會用 CreateProcess 建立一個程序(Process),並設置該程序的狀態為 Suspended,目的是為了讓該程序的進入點(Entry point)的 Main Thread 停止執行。
  2. 接著執行 VirtualAllocEx,分配一塊記憶體空間給剛建立出來的程序。
  3. 呼叫 WriteProcessMemory,把要 Inject 的 DLL 路徑名稱寫入到上述步驟分配出來的空間。
  4. 使用 CreateRemoteThread 建立一條 Thread,讓 Thread 利用 LoadLibrary funtion 載入要用到的 DLL。該 DLL 的路徑名稱位於第二步驟從記憶體切割出來的空間裡。基本上到這一步驟,已經算是成功地把 DLL inject 到程序裡。
  5. 最後,透過 ResumeThread 使剛剛已停止執行的程序的 Main Thread 回復"可執行"狀態即可。

下面我們用樣本 HackTool.Win32.Injecter.a 中的部分逆向程式碼說明上面這五個流程:

push    offset aUrlmon  ; "urlmon"
call    LoadLibraryA    ; 
mov     [ebp+NumberOfBytesWritten], eax
push    offset aUrldownloadtof ; "URLDownloadToFileA"

要被 inject 惡意程式碼的目標 dll - urlmon.dll。

mov     eax, offset aUrlmon_0 ; "urlmon"
call    sub_402688
lea     edx, [ebp+var_189]
mov     ecx, 40h
mov     eax, offset aUrldownloadt_0 ; "URLDownloadToFileA"
call    sub_402688      
; 在此之前的程式碼從某個惡意網站下載了程式碼儲存, 並修改了 urlmon.dll
mov     [ebp+Context], 10007h
push    esi             ; hThread
call    SuspendThread   ;    
  1. 設置該程序狀態為 suspended。
lea     eax, [ebp+Context]
push    eax             ; lpContext
push    esi             ; hThread
call    GetThreadContext
push    40h             ; flProtect
push    1000h           ; flAllocationType
push    1000h           ; dwSize
push    0               ; lpAddress
push    edi             ; hProcess
call    VirtualAllocEx  ;    
mov     ebx, eax
  1. 執行 virtualAllocEx,分配記憶體空間並將位址開頭存在 ebx。
test    ebx, ebx
jz      loc_40A5ED
mov     eax, ds:off_40B300
mov     edx, offset aInjectingACode ; "Injecting a code..."
call    sub_4041F8
call    sub_402E30
call    sub_402638
lea     eax, [ebp+NumberOfBytesWritten] ;   
push    eax             ; lpNumberOfBytesWritten
push    40h             ; nSize
push    offset sub_40A30C ; lpBuffer
push    ebx             ; lpBaseAddress
push    edi             ; hProcess
call    WriteProcessMemory
  1. WriteProcessMemory 與其參數,edi 為 virtualAlloc 分配出的記憶空間的 handle。
lea     eax, [ebp+Context]
push    eax             ; lpContext
push    esi             ; hThread
call    SetThreadContext ;  
jmp     short loc_40A606
  1. 這邊不是使用 createRemoteThread 而是使用原本被 suspend 的 thread,因為這支病毒是個 hacktool,他去改變 urlmon.dll 的內容,再要求使用者選擇要被感染的程式,若該程式有使用到 urlmon.dll 就會被感染。
mov     eax, ds:off_40B300
mov     edx, offset aProcessMemoryI ; "Process memory is not accessible"
call    sub_4041F8
call    sub_402E30
call    sub_402638

push    esi             ; hThread
call    ResumeThread    ;  

  1. Resume 恢復剛剛被 suspend 的程序(esi)。

淺談何謂 CreateRemoteThread

呼叫 CreateRemoteThread 是常用的一種方法,這裡的 CreateRemoteThread 是建立一條 Thread 到另一個程序 (目標程序)裡。目的是要透過目標程序中的 Thread 來呼叫 LoadLibrary 並載入我們要用到的 DLL。

以下為 MSDN 所查到關於 CreateRemoteThread 的用法
http://ithelp.ithome.com.tw/upload/images/20170105/20103559g3HCfDRc1D.png

  1. A handle to the process in which the thread is to be created.
  2. A pointer to function or entry point of the thread that is going to be executed
  3. parameters to the function
  4. creation state of the thread

假設我們用 LoadLibrary 載入 AAA.dll 時,參數(2)即是 LoadLibrary 的位址,參數(3)則會放 AAA.dll 的路徑。


談完感染型病毒後,接著明天會提到最近很夯但又令人棘手的勒索病毒。

希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!

參考來源:
DLL injection https://read01.com/0MJPao.html
DLL Injection and Hooking http://securityxploded.com/dll-injection-and-hooking.php
CreateRemoteThread Function https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms682437(v=vs.85).aspx
HackTool http://vx-archiv.at


上一篇
[Day20] 病毒介紹-認識常見的感染型病毒種類
下一篇
[Day22] 病毒介紹-不給錢就搗蛋的勒索病毒
系列文
資事體大 毒擋一面 - 資安防護深入淺出31

尚未有邦友留言

立即登入留言