技術簡介
將木馬程式以DLL的形式實現後,需要使用插入到目標進程中的遠程執行緒將該木馬DLL插入到目標進程的地址空間,即利用該執行緒通過調用Windows API LoadLibrary函式來載入木馬DLL,從而實現木馬對系統的侵害。
鉤子注入是病毒、木馬常有的行為特徵之一,一些正常軟體也會提示鉤子注入。病毒或木馬程式不僅僅會鉤子注入,它還可能修改硬碟檔案、篡改註冊表、修改主頁等。一些正常程式也往往會採用鉤子注入的行為,比如一些要確保和系統緊密結合的防病毒軟體、即時通訊工具等。
原理機制
鉤子是WINDOWS中訊息處理機制的一個要點,通過安裝各種鉤子,應用程式能夠設定相應的子例程來監視系統里的訊息傳遞以及在這些訊息到達目標視窗程式之前處理它們。 鉤子的種類很多,每種鉤子可以截獲並處理相應的訊息,如鍵盤鉤子可以截獲鍵盤訊息,滑鼠鉤子可以截獲滑鼠訊息,外殼鉤子可以截獲啟動和關閉應用程式的訊息,日誌鉤子可以監視和記錄輸入事件。
若在dll中使用SetWindowsHookEx設定一全局鉤子,系統會將其載入入使用user32的進程中,因而它也可被利用為無進程木馬的進程注入手段。
木馬編寫者首先把一個實際為木馬主體的dll檔案載入記憶體,然後通過“執行緒注射”技術將其注入其他進程的記憶體空間,最後這個dll里的代碼就成為其他進程的一部分來實現了自身的隱藏執行,通過調用“hook”機制。
鉤子(hook),是windows訊息處理機制的一個平台,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他進程所創建的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理window訊息或特定事件。
這個DLL木馬便實現了監視用戶的輸入輸出操作,截取有用的資料等操作。這種木馬的實際執行體是一個dll檔案,由於Windows系統自身就包含著大量的dll檔案,誰也無法一眼看出哪個dll檔案不是系統自帶的,所以這種木馬的隱蔽性又提高了一級,而且它的執行方式也更加隱蔽,這是由Windows系統自身特性決定的,Windows自身就是大量使用dll的系統,許多dll檔案在啟動時便被相關的應用程式載入進記憶體里執行了,可是有誰在進程里直接看到過某個dll在運行的?因為系統是把dll視為一種模組性質的執行體來調用的,它內部只包含了一堆以函式形式輸出的模組,也就是說每個dll都需要由一個用到它的某個函式的exe來載入,當dll里的函式執行完畢後就會返回一個運行結果給調用它的exe,然後dll進程退出記憶體結束這次執行過程,這就是標準的dll運行周期,而採用了“執行緒注射”技術的dll則不是這樣,它們自身雖然也是導出函式,但是它們的代碼是具備執行邏輯的,這種模組就像一個普通exe,只是它不能直接由自身啟動,而是需要有一個特殊作用的程式(稱為載入者)產生的進程把這個dll的主體函式載入記憶體中執行,從而讓它成為一個運行中的木馬程式。