天天看點

木馬各種隐藏技術全方位大披露

以前,我曾認為隻要不随便運作網友發來的檔案就不會中病毒或木馬,但後來出現了利用漏洞傳播的沖擊波、震蕩波;以前,我曾認為不上小網站就不會中網頁木馬,但後來包括國内某知名遊戲網站在内的多個大網站均在其首頁被黑客挂上了木馬。從此,我知道:安全,從來沒有絕對的。 雖然沒有絕對的安全,但如果能知已知彼,了解木馬的隐藏手段,對于木馬即使不能百戰百勝,也能做到及時發現,使損失最小化。那麼,木馬究竟是如何躲在我們的系統中的呢?

  最基本的隐藏:不可見窗體+隐藏檔案

  木馬程式無論如何神秘,但歸根究底,仍是Win32平台下的一種程式。Windows下常見的程式有兩種:

  1.Win32應用程式(Win32 Application),比如QQ、Office等都屬于此行列。

  2.Win32控制台程式(Win32 Console),比如硬碟引導修複程式FixMBR。

  其中,Win32應用程式通常會有應用程式界面,比如系統中自帶的“電腦”就有提供各種數字按鈕的應用程式界面。木馬雖然屬于Win32應用程式,但其一般不包含窗體或隐藏了窗體(但也有某些特殊情況,如木馬使用者與被害者聊天的視窗),并且将木馬檔案屬性設定為“隐藏”,這就是最基本的隐藏手段,稍有經驗的使用者隻需打開“任務管理器”,并且将“檔案夾選項”中的“顯示所有檔案”勾選即可輕松找出木馬(見圖1),于是便出現了下面要介紹的“程序隐藏”技術。

  第一代程序隐藏技術:Windows 98的後門

  在Windows 98中,微軟提供了一種能将程序注冊為服務程序的方法。盡管微軟沒有公開提供這種方法的技術實作細節(因為Windows的後續版本中沒有提供這個機制),但仍有高手發現了這個秘密,這種技術稱為RegisterServiceProcess。隻要利用此方法,任何程式的程序都能将自己注冊為服務程序,而服務程序在Windows 98中的任務管理器中恰巧又是不顯示的,是以便被木馬程式鑽了空子。

  要對付這種隐藏的木馬還算簡單,隻需使用其他第三方程序管理工具即可找到其所在,并且采用此技術進行隐藏的木馬在Windows 2000/XP(因為不支援這種隐藏方法)中就得現形!中止該程序後将木馬檔案删除即可。可是接下來的第二代程序隐藏技術,就沒有這麼簡單對付了。

  第二代程序隐藏技術:程序插入

  在Windows中,每個程序都有自己的私有記憶體位址空間,當使用指針(一種通路記憶體的機制)通路記憶體時,一個程序無法通路另一個程序的記憶體位址空間,就好比在未經鄰居同意的情況下,你無法進入鄰居家吃飯一樣。比如QQ在記憶體中存放了一張圖檔的資料,而MSN則無法通過直接讀取記憶體的方式來獲得該圖檔的資料。這樣做同時也保證了程式的穩定性,如果你的程序存在一個錯誤,改寫了一個随機位址上的記憶體,這個錯誤不會影響另一個程序使用的記憶體。

  你知道嗎——程序(Process)是什麼

  對應用程式來說,程序就像一個大容器。在應用程式被運作後,就相當于将應用程式裝進容器裡了,你可以往容器裡加其他東西(如:應用程式在運作時所需的變量資料、需要引用的DLL檔案等),當應用程式被運作兩次時,容器裡的東西并不會被倒掉,系統會找一個新的程序容器來容納它。

  一個程序可以包含若幹線程(Thread),線程可以幫助應用程式同時做幾件事(比如一個線程向磁盤寫入檔案,另一個則接收使用者的按鍵操作并及時做出反應,互相不幹擾),在程式被運作後中,系統首先要做的就是為該程式程序建立一個預設線程,然後程式可以根據需要自行添加或删除相關的線程(見圖2 程序關系圖)。

  1.程序插入是什麼

  獨立的位址空間對于程式設計人員和使用者來說都是非常有利的。對于程式設計人員來說,系統更容易捕獲随意的記憶體讀取和寫入操作。對于使用者來說,作業系統将變得更加健壯,因為一個應用程式無法破壞另一個程序或作業系統的運作。當然,作業系統的這個健壯特性是要付出代價的,因為要編寫能夠與其他程序進行通信,或者能夠對其他程序進行操作的應用程式将要困難得多。但仍有很多種方法可以打破程序的界限,通路另一個程序的位址空間,那就是“程序插入”(Process Injection)。一旦木馬的DLL插入了另一個程序的位址空間後,就可以對另一個程序為所欲為,比如下文要介紹的盜QQ密碼。

  2.木馬是如何盜走QQ密碼的

  普通情況下,一個應用程式所接收的鍵盤、滑鼠操作,别的應用程式是無權“過問”的。可盜号木馬是怎麼偷偷記錄下我的密碼的呢?木馬首先将1個DLL檔案插入到QQ的程序中并成為QQ程序中的一個線程,這樣該木馬DLL就赫然成為了QQ的一部分!然後在使用者輸入密碼時,因為此時木馬DLL已經進入QQ程序内部,是以也就能夠接收到使用者傳遞給QQ的密碼鍵入了,真是“家賊難防”啊!

(插入圖06zcxtrojan0a.tif)

  3.如何插入程序

  (1)使用系統資料庫插入DLL

  早期的程序插入式木馬的伎倆,通過修改系統資料庫中的[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs]來達到插入程序的目的。缺點是不實時,修改系統資料庫後需要重新啟動才能完成程序插入。

  (2)使用挂鈎(Hook)插入DLL

  比較進階和隐蔽的方式,通過系統的挂鈎機制(即“Hook”,類似于DOS時代的“中斷”)來插入程序(一些盜QQ木馬、鍵盤記錄木馬以Hook方式插入到其他程序中“偷雞摸狗”),需要調用SetWindowsHookEx函數(也是一個Win32 API函數)。缺點是技術門檻較高,程式調試困難,這種木馬的制作者必須具有相當的Win32程式設計水準。

  你知道嗎——什麼是API

  Windows中提供各種功能實作的接口稱為Win32 API(Application Programming Interface,即“應用程式程式設計接口”),如一些程式需要對磁盤上的檔案進行讀寫,就要先通過對相應的API(檔案讀寫就要調用檔案相關的API)發出調用請求,然後API根據程式在調用其函數時提供的參數(如讀寫檔案就需要同時給出需要讀寫的檔案的檔案名及路徑)來完成請求實作的功能,最後将調用結果(如寫入檔案成功,或讀取檔案失敗等)傳回給程式(見圖3 應用程式、Win32 API、系統的關系圖)。

  (3)使用遠端線程函數(CreateRemoteThread)插入DLL

  在Windows 2000及以上的系統中提供了這個“遠端程序”機制,可以通過一個系統API函數來向另一個程序中建立線程(插入DLL)。缺點很明顯,僅支援Windows 2000及以上系統,在國内仍有相當多使用者在使用Windows 98,是以采用這種程序插入方式的木馬缺乏平台通用性。

  木馬将自身作為DLL插入别的程序空間後,用檢視程序的方式就無法找出木馬的蹤迹了,你能看到的僅僅是一些正常程式的程序,但木馬卻已經偷偷潛入其中了。解決的方法是使用支援“程序子產品檢視”的程序管理工具(如“Windows優化大師”提供的程序檢視),木馬的DLL子產品就會現形了。

  不要相信自己的眼睛:恐怖的程序“蒸發”

  嚴格地來講,這應該算是第2.5代的程序隐藏技術了,可是它卻比前幾種技術更為可怕得多。這種技術使得木馬不必将自己插入到其他程序中,而可以直接消失!

  它通過Hook技術對系統中所有程式的程序檢測相關API的調用進行了監控,“任務管理器”之是以能夠顯示出系統中所有的程序,也是因為其調用了EnumProcesses等程序相關的API函數,程序資訊都包含在該函數的傳回結果中,由發出調用請求的程式接收傳回結果并進行處理(如“任務管理器”在接收到結果後就在程序清單中顯示出來)。

  而木馬由于事先對該API函數進行了Hook,是以在“任務管理器”(或其他調用了列舉程序函數的程式)調用EnumProcesses函數時(此時的API函數充當了“内線”的角色),木馬便得到了通知,并且在函數将結果(列出所有程序)傳回給程式前,就已将自身的程序資訊從傳回結果中抹去了。就好比你正在看電視節目,卻有人不知不覺中将電視接上了DVD,你在不知不覺中就被欺騙了。

  是以無論是“任務管理器”還是防毒軟體,想對這種木馬的程序進行檢測都是徒勞的。這種木馬目前沒有非常有效的清除手段,隻有在其運作前由防毒軟體檢測到木馬檔案并阻止其病毒體的運作。當時還有一種技術是由木馬程式将其自身的程序資訊從Windows系統用以記錄程序資訊的“程序連結清單”中删除,這樣程序管理工具就無法從“程序連結清單”中獲得木馬的程序資訊了。但由于缺乏平台通用性而且在程式運作時有一些問題,是以沒有被廣泛采用。

  你知道嗎——什麼是Hook

  Hook是Windows中提供的一種用以替換DOS下“中斷”的一種系統機制,中文譯名為“挂鈎”或“鈎子”。在對特定的系統事件(包括上文中的特定API函數的調用事件)進行Hook後,一旦發生已Hook的事件,對該事件進行Hook的程式(如:木馬)就會收到系統的通知,這時程式就能在第一時間對該事件做出響應(木馬程式便搶在函數傳回前對結果進行了修改)。

  毫無蹤迹:全方位立體隐藏

  利用剛才介紹的Hook隐藏程序的手段,木馬可以輕而易舉地實作檔案的隐藏,隻需将Hook技術應用在檔案相關的API函數上即可,這樣無論是“資料總管”還是防毒軟體都無法找出木馬所在了。更令人吃驚的是,現在已經有木馬(如:灰鴿子)利用該技術實作了檔案和程序的隐藏。要防止這種木馬最好的手段仍是利用防毒軟體在其運作前進行攔截。

  跟防毒軟體對着幹:反防毒軟體外殼

  木馬再狡猾,可是一旦被防毒軟體定義了特征碼,在運作前就被攔截了。要躲過防毒軟體的追殺,很多木馬就被加了殼,相當于給木馬穿了件衣服,這樣防毒軟體就認不出來了,但有部分防毒軟體會嘗試對常用殼進行脫殼,然後再清除(小樣,别以為穿上件馬夾我就不認識你了)。除了被動的隐藏外,最近還發現了能夠主動和防毒軟體對着幹的殼,木馬在加了這種殼之後,一旦運作,則外殼先得到程式控制權,由其通過各種手段對系統中安裝的防毒軟體進行破壞,最後在确認安全(防毒軟體的保護已被瓦解)後由殼釋放包裹在自己“體内”的木馬體并執行之。對付這種木馬的方法是使用具有脫殼能力的防毒軟體對系統進行保護。

  你知道嗎——什麼是殼

  顧名思義,你可以很輕易地猜到,這是一種包在外面的東西。沒錯,殼能夠将檔案(比如EXE)包住,然後在檔案被運作時,首先由殼獲得控制權,然後釋放并運作包裹着的檔案體。很多殼能對自己包住的檔案體進行加密,這樣就可以防止防毒軟體的清除。比如原先防毒軟體定義的該木馬的特征是“12345”,如果發現某檔案中含有這個特征,就認為該檔案是木馬,而帶有加密功能的殼則會對檔案體進行加密(如:原先的特征是“12345”,加密後變成了“54321”,這樣防毒軟體當然不能靠檔案特征進行檢查了)。脫殼指的就是将檔案外邊的殼去除,恢複檔案沒有加殼前的狀态。

本文轉自 goldwinner 51CTO部落格,原文連結:http://blog.51cto.com/355665/88313,如需轉載請自行聯系原作者

繼續閱讀