[分享]後門清除完全篇(轉)

ba發表於2007-08-12
[分享]後門清除完全篇(轉)[@more@]前言

  後門!相信這個詞語對您來說一定不會陌生,它的危害不然而欲,但隨著人們的安全意識逐步增強,又加上防毒軟體的"大力支援",使傳統的後門無法在隱藏自己,任何稍微有點計算機知識的人,都知道"查埠""看程式",以便發現一些"蛛絲馬跡"。所以,後門的編寫者及時調整了思路,把目光放到了動態連結程式庫上,也就是說,把後門做成DLL檔案,然後由某一個EXE做為載體,或者使用Rundll32.exe來啟動,這樣就不會有程式,不開埠等特點,也就實現了程式、埠的隱藏。本文以"DLL的原理""DLL的清除""DLL的防範"為主題,並展開論述,旨在能讓大家對DLL後門"快速上手",不在恐懼DLL後門。好了,進入我們的主題。

一,DLL的原理

1,動態連結程式庫

  動態連結程式庫,全稱:Dynamic Link Library,簡稱:DLL,作用在於為應用程式提供擴充套件功能。應用程式想要呼叫DLL檔案,需要跟其進行"動態連結";從程式設計的角度,應用程式需要知道DLL檔案匯出的API函式方可呼叫。由此可見,DLL檔案本身並不可以執行,需要應用程式呼叫。正因為DLL檔案執行時必須插入到應用程式的記憶體模組當中,這就說明了:DLL檔案無法刪除。這是由於Windows內部機制造成的:正在執行的程式不能關閉。所以,DLL後門由此而生!

2,DLL後門原理及特點

  把一個實現了後門功能的程式碼寫成一個DLL檔案,然後插入到一個EXE檔案當中,使其可以執行,這樣就不需要佔用程式,也就沒有相對應的PID號,也就可以在工作管理員中隱藏。DLL檔案本身和EXE檔案相差不大,但必須使用程式(EXE)呼叫才能執行DLL檔案。DLL檔案的執行,需要EXE檔案載入,但EXE想要載入DLL檔案,需要知道一個DLL檔案的入口函式(既DLL檔案的匯出函式),所以,根據DLL檔案的編寫標準:EXE必須執行DLL檔案中的DLLMain()作為載入的條件(如同EXE的mian())。做DLL後門基本分為兩種:1)把所有功能都在DLL檔案中實現;2)把DLL做成一個啟動檔案,在需要的時候啟動一個普通的EXE後門。

常見的編寫方法:

  (1),只有一個DLL檔案

  這類後門很簡單,只把自己做成一個DLL檔案,在登錄檔Run鍵值或其他可以被系統自動載入的地方,使用Rundll32.exe來自動啟動。Rundll32.exe是什麼?顧名思意,"執行32位的DLL檔案"。它的作用是執行DLL檔案中的內部函式,這樣在程式當中,只會有Rundll32.exe,而不會有DLL後門的程式,這樣,就實現了程式上的隱藏。如果看到系統中有多個Rundll32.exe,不必驚慌,這證明用Rundll32.exe啟動了多少個的DLL檔案。當然,這些Rundll32.exe執行的DLL檔案是什麼,我們都可以從系統自動載入的地方找到。

  現在,我來介紹一下Rundll32.exe這個檔案,意思上邊已經說過,功能就是以命令列的方式呼叫動態連結程式庫。系統中還有一個Rundll.exe檔案,他的意思是"執行16位的DLL檔案",這裡要注意一下。在來看看Rundll32.exe使用的函式原型:
  Void CALLBACK FunctionName (
  HWND hwnd,
  HINSTANCE hinst,
  LPTSTR lpCmdLine,
  Int nCmdShow
  );

  其命令列下的使用方法為:Rundll32.exe DLLname,Functionname [Arguments]
  DLLname為需要執行的DLL檔名;Functionname為前邊需要執行的DLL檔案的具體引出函式;[Arguments]為引出函式的具體引數。

  (2),替換系統中的DLL檔案

  這類後門就比上邊的先進了一些,它把實現了後門功能的程式碼做成一個和系統匹配的DLL檔案,並把原來的DLL檔案改名。遇到應用程式請求原來的DLL檔案時, DLL後門就啟一個轉發的作用,把"引數"傳遞給原來的DLL檔案;如果遇到特殊的請求時(比如客戶端),DLL後門就開始,啟動並執行了。對於這類後門,把所有操作都在DLL檔案中實現最為安全,但需要的程式設計知識也非常多,也非常不容易編寫。所以,這類後門一般都是把DLL檔案做成一個"啟動"檔案,在遇到特殊的情況下(比如客戶端的請求),就啟動一個普通的EXE後門;在客戶端結束連線之後,把EXE後門停止,然後DLL檔案進入"休息"狀態,在下次客戶端連線之前,都不會啟動。但隨著微軟的"數字簽名"和"檔案恢復"的功能出臺,這種後門已經逐步衰落。

  提示:

  在WINNTsystem32目錄下,有一個dllcache資料夾,裡邊存放著眾多DLL檔案(也包括一些重要的EXE檔案),在DLL檔案被非法修改之後,系統就從這裡來恢復被修改的DLL檔案。如果要修改某個DLL檔案,首先應該把dllcache目錄下的同名DLL檔案刪除或更名,否則系統會自動恢復。

(3),動態嵌入式


  這才是DLL後門最常用的方法。其意義是將DLL檔案嵌入到正在執行的系統程式當中。在Windows系統中,每個程式都有自己的私有記憶體空間,但還是有種種方法來進入其程式的私有記憶體空間,來實現動態嵌入式。由於系統的關鍵程式是不能終止的,所以這類後門非常隱蔽,查殺也非常困難。常見的動態嵌入式有:"掛接API""全域性鉤子(HOOK)""遠端執行緒"等。

  遠端執行緒技術指的是透過在一個程式中建立遠端執行緒的方法來進入那個程式的記憶體地址空間。當EXE載體(或Rundll32.exe)在那個被插入的程式裡建立了遠端執行緒,並命令它執行某個DLL檔案時,我們的DLL後門就掛上去執行了,這裡不會產生新的程式,要想讓DLL後門停止,只有讓這個連結DLL後門的程式終止。但如果和某些系統的關鍵程式連結,那就不能終止了,如果你終止了系統程式,那Windows也隨即被終止!!!

3,DLL後門的啟動特性

  啟動DLL後門的載體EXE是不可缺少的,也是非常重要的,它被稱為:Loader。如果沒有Loader,那我們的DLL後門如何啟動呢?因此,一個好的DLL後門會盡力保護自己的Loader不被查殺。Loader的方式有很多,可以是為我們的DLL後門而專門編寫的一個EXE檔案;也可以是系統自帶的Rundll32.exe,即使停止了Rundll32.exe,DLL後門的主體還是存在的。3721網路實名就是一個例子,雖然它並不是"真正"的後門。


二,DLL的清除

  本節以三款比較有名的DLL後門例,分別為"SvchostDLL.dll""BITS.dll""QoServer.dll"。詳細講解其手工清除方法。希望大家在看過這三款DLL後門的清除方法之後,能夠舉一反三,靈活運用,在不懼怕DLL後門。其實,手工清除DLL後門還是比較簡單的,無非就是在登錄檔中做文章。具體怎麼做,請看下文。


1,PortLess BackDoor

  這是一款功能非常強大的DLL後門程式,除了可以獲得Local System許可權的Shell之外,還支援如"檢測克隆帳戶""安裝終端服務"等一系列功能(具體可以參見程式幫助),適用Windows2000/xp/2003等系統。程式使用svchost.exe來啟動,平常不開埠,可以進行反向連線(最大的特點哦),對於有防火牆的主機來說,這個功能在好不過了。

  在介紹清除方法之前,我們先來簡單的介紹一下svchost.exe這個系統的關鍵服務:
  Svchost只是做為服務的宿主,本身並不實現什麼功能,如果需要使用Svchost來啟動服務,則某個服務是以DLL形式實現的,該DLL的載體Loader指向svchost,所以,在啟動服務的時候由svchost呼叫該服務的DLL來實現啟動的目的。使用svchost啟動某個服務的DLL檔案是由登錄檔中的引數來決定的,在需要啟動服務的下邊都有一個Parameters子鍵,其中的ServiceDll表明該服務由哪個DLL檔案負責,並且這個DLL檔案必須匯出一個ServiceMain()函式,為處理服務任務提供支援。

  呵呵!看了上邊的理論,是不是有點蒙(我都快睡著了),彆著急,我們來看看具體的內容)。我們可以看到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRpcSs下的Parameters子鍵,其鍵值為%SystemRoot%system32rpcss.dll。這就說明:啟動RpcSs服務時。Svchost呼叫WINNTsystem32目錄下的rpcss.dll。

  這是登錄檔的HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost,裡邊存放著Svchost啟動的組和組內的各個服務,其中netsvcs組的服務最多。要使用Svchost啟動某個服務,則該服務名就會出現在HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost下。這裡有四種方法來實現:
  1, 新增一個新的組,在組裡新增服務名
  2, 在現有組裡新增服務名
  3, 直接使用現有組裡的一個服務名,但是本機沒有安裝的服務
  4, 修改現有組裡的現有服務,把它的ServiceDll指向自己的DLL後門

  我測試的PortLess BackDoor使用的第三種方法。
  好了,我想大家看完了上邊的原理,一定可以想到我們清除PortLess BackDoor的方法了,對,就是在登錄檔的Svchost鍵下做文章。好,我們現在開始。

  注:由於本文只是介紹清除方法,使用方法在此略過。

  後門的Loader把SvchostDLL.dll插入Svchost程式當中,所以,我們先開啟Windows最佳化大師中的Windows程式管理2.5,檢視Svchost程式中的模組資訊,SvchostDLL.dll已經插入到Svchost程式中了,在根據"直接使用現有組裡的一個服務名,但是本機沒有安裝的服務"的提示,我們可以斷定,在"管理工具"—"服務"中會有一項新的服務。證明了我的說法,此服務名稱為:IPRIP,由Svchost啟動,-k netsvcs表示此服務包含在netsvcs服務組中。

  我們把該服務停掉,然後開啟登錄檔編輯器(開始—執行--regedit),來到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesIPRIP下,檢視其Parameters子鍵)。Program鍵的鍵值SvcHostDLL.exe為後門的Loader;ServiceDll的鍵值C:WINNTsystem32svchostdll.dll為呼叫的DLL檔案,這正是後門的DLL檔案。現在我們刪除IPRIP子鍵(或者用SC來刪除),然後在來到HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSvchost下,編輯netsvcs服務組,把49 00 70 00 72 00 69 00 70 00 00 00刪除,這裡對應的就是IPRIP的服務名。然後退出,重啟。重啟之後刪除WINNTsystem32目錄下的後門檔案即可。


2,BITS.dll

  這是榕哥的作品,也是DLL後門,和SvchostDLL.dll原理基本一樣,不過這裡使用的是上邊介紹的第四種方法,即"修改現有組裡的現有服務,把它的ServiceDll指向自己的DLL後門"。換句話說,該後門修改現有的某一個服務,把其原有服務的DLL指向自己(也就是BITS.dll),這樣就達到了自動載入的目的;其次,該後門沒有自己的Loader,而是使用系統自帶的Rundll32.exe來載入。我們還是用Windows 程式管理2.5來檢視,從圖7中,我們可以看到bits.dll已經插入到Svchost程式當中。

  好,現在我們來看看具體的清除方法,由於該後門是修改現有服務,而我們並不知道具體是修改了哪個服務,所以,在登錄檔中搜尋bits.dll,最後在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRasAuto下搜尋到了bits.dll,檢視Parameters子鍵下的ServiceDll,其鍵值為C:WINNTsystem32bits.dll(如圖8)。原來,該後門把RasAuto服務原來的DLL檔案替換為bits.dll了,這樣來實現自動載入。知道了原因就好辦了,現在我們把ServiceDll的鍵值修改為RasAuto服務原有的DLL檔案,即%SystemRoot%System32rasauto.dll,退出,重啟。之後刪除WINNTsystem32目錄下的bits.dll即可。

3,NOIR--QUEEN

  NOIR--QUEEN(守護者)是一個DLL後門&木馬程式,服務端以DLL檔案的形式插入到系統的Lsass.exe程式裡,由於Lsass.exe是系統的關鍵程式,所以不能終止。在來介紹清除方法之前,我先介紹一下Lsass.exe程式:

  這是一個本地的安全授權服務,並且它會為使用Winlogon服務的授權使用者生成一個程式,如果授權是成功的,Lsass就會產生使用者的進入令牌,令牌使用啟動初始 的Shell。其他的由使用者初始化的程式會繼承這個令牌。

  從上邊的介紹我們就可以看出Lsass對系統的重要性,那具體怎麼清除呢?請看下文。

  後門在安裝成功後,會在服務中新增一個名為QoSserver的服務,並把QoSserver.dll後門檔案插入到Lsass程式當中,使其可以隱藏程式並自動啟動(如圖9)。現在我們開啟登錄檔,來到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesQoSserver,直接刪除QoSserver鍵,然後重啟。重啟之後,我們在來到服務列表中,會看到QoSserver服務還在,但沒有啟動,類別是自動,我們把他修改為"已禁用";然後往上看,會發現一個服務名為AppCPI的服務,其可執行程式指向QoSserver.exe(原因後邊我會說到),具體如圖11所示。我們再次開啟登錄檔,來到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesAppCPI,刪除AppCPI鍵,重啟,再刪除QoSserver,最後刪除WINNTsystem32目錄下的後門檔案。

  本人和這個後門"搏鬥"了3個多小時,重啟N次。原因在於即使刪除了QoSserver服務,後門還是在執行,而且服務列表中的QoSserver服務又"死灰復燃"。後來才知道原因:在我刪除了QoSserver服務並重啟之後,插入到Lsass程式當中的QoSserver.dll檔案又恢復了QoSserver服務,並且生成了另外一個服務,即AppCPI,所以我們必須在到登錄檔中刪除AppCPI服務才算是把該後門清除。由此可以看出,現在的後門的保護措施,真是一環扣環。

  注意:在刪除QoSserver服務並重啟之後,恢復的QoSserver的啟動類別要修改為"已禁用",否則即便刪除了AppCPI服務,QoSserver服務又執行了。


三,DLL的防範

  看了上邊的例子,我想大家對清除DLL後門的方法有了一定的瞭解,但在現實中,DLL後門並不會使用預設的檔名,所以你也就不能肯定是否中了DLL後門。對於DLL後門,system32目錄下是個好地方,大多數後門也是如此,所以這裡要非常注意。下面我來具體介紹一下怎麼發現DLL後門,希望對大家有所幫助。

  1,安裝好系統和所有的應用程式之後,備份system32目錄下的EXE和DLL檔案:開啟CMD,來到WINNTsystem32目錄下,執行:dir *.exe>exe.txt & dir *.dll>dll.txt,這樣,就會把所有的EXE和DLL檔案備份到exe.txt和dll.txt檔案中;日後,如發現異常,可以使用相同的命令再次備份EXE和DLL檔案(這裡我們假設是exe0.txt和dll0.txt),並使用:fc exe.txt exe0.txt>exedll.txt & fc dll.txt dll0.txt>exedll.txt,其意思為使用FC命令比較兩次的EXE檔案和DLL檔案,並將比較結果儲存到exedll.txt檔案中。透過這種方法,我們就可以發現多出來的EXE和DLL檔案,並透過檔案大小,建立時間來判斷是否是DLL後門。

  2,使用記憶體/模組工具來檢視程式呼叫的DLL檔案,比如Windows最佳化大師中的Windows 程式管理 2.5。這樣,可以發現程式到底呼叫了什麼DLL檔案,在結合上邊用FC命令比較出來的結果,又能進一步來確定是否中了DLL後門。如果沒有最佳化大師,可以使用TaskList,這個小工具也可以顯示程式呼叫的DLL檔案,而且還有原始碼,方便修改。

  3,普通後門連線需要開啟特定的埠,DLL後門也不例外,不管它怎麼隱藏,連線的時候都需要開啟埠。我們可以用netstat –an來檢視所有TCP/UDP埠的連線,以發現非法連線。大家平時要對自己開啟的埠心中有數,並對netstat –an中的state屬性有所瞭解。當然,也可以使用Fport來顯示埠對應的程式,這樣,系統有什麼不明的連線和埠,都可以盡收眼底。

  4,定期檢查系統自動載入的地方,比如:登錄檔,Winstart.bat,Autoexec.bat,win.ini,system.ini,wininit.ini,Autorun.inf,Config.sys等。其次是對服務進行管理,對系統預設的服務要有所瞭解,在發現有問題的服務時,可以使用Windows 2000 Server Resource Kit中的SC來刪除。以上這些地方都可以用來載入DLL後門的Loader,如果我們把DLL後門Loader刪除了,試問?DLL後門還怎麼執行?!

  透過使用上邊的方法,我想大多數DLL後門都可以"現形",如果我們平時多做一些備份,那對查詢DLL後門會啟到事半功倍的效果。

  後記

  本文詳細的介紹了DLL後門的一些知識。其實,從上文中不難看出,DLL後門並沒有想象的這麼可怕,清除起來也比較簡單。在文章中的開頭我以說到:旨在能讓大家對DLL後門"快速上手",所以,希望這篇拙文能對大家有所幫助,文中如有錯誤,還請大家多多包涵,謝謝!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950306/,如需轉載,請註明出處,否則將追究法律責任。

相關文章