這個程序是較 鎖屏小工具 V3.0 設計之前設計好了,只是一直沒能找到好一點的感染型病毒樣本來做測試,一直就沒有發布。程序的原理是利用了 HOOK API 技術,是在Ring 3層下(即用戶層)攔截。說個個人看法,我覺得在Ring3層下保護就已經足夠防御絕大部分病毒了。先簡單說說殺毒軟件攔截病毒的原理,剛接觸底層沒多久,如果發現有說錯的地方懇請指出,現在大多數的安全軟件都是通過HOOK SSDT這個表來實現對關鍵內核API的攔截。SSDT 其實是一張記錄著 內核下所有API的函數地址。用戶層下的API 都會最終都會通過 這張表得到相對應的內核API。例如:OpenProcess(),它是kernel32.dll導出的函數,它的調用過程:
xxx程序調用 ---> kernel32.OpenProcess ---> ntdll.NtOpenProcess ---> ntdll.ZwOpenProcess ---> 內核 ntkrnlpa.ZwOpenProcess ---> 通過SSDT表查詢 ---> ntkrnlpa.NtOpenProcess
最終的ntkrnlpa.NtOpenProcess 才是實現打開進程的操作。殺毒軟件(當然還有其它高級病毒也會)通過修改SSDT 記錄的ntkrnlpa.NtOpenProcess 地址變為自己函數的地址。這樣整個過程就變成:
xxx程序調用 ---> kernel32.OpenProcess ---> ntdll.NtOpenProcess ---> ntdll.ZwOpenProcess ---> 內核 ntkrnlpa.ZwOpenProcess ---> 通過SSDT表查詢 ---> 殺毒軟件自己的冒牌MyNtOpenProcess ---> ntkrnlpa.NtOpenProcess
而 MyNtOpenProces 這個函數不是用來打開進程的,而是殺軟檢查XXX程序想打開什么進程,如果是想打開被保護的進程則直接返回 NULL,這樣XXX程序最終根本就沒機會調用到真正的 ntkrnlpa.NtOpenProcess。殺毒軟件就這樣實現了攔截。殺毒軟件的行為查殺、主動防御也是通過此方法得到病毒的執行順序。例:一般的木馬被執行后第一件事就是把自己COPY到系統目錄、運行系統目錄的本體、刪除自身。系統目錄的本體執行后設置啟動項、釋放DLL注入IE或系統關鍵進程等.... 那么殺毒軟件通過攔截相關內核API 得到這個程序的行為,發現和木馬極為相似,負責點的殺毒軟件可能會先提示用戶,然后禁止其運行并上傳,不負責的直接K (360貌似就這樣,N多程序都很正常,硬要說是什么什么病毒!什么什么木馬。)。
雖然說 Ring3 層的API 最終會調用 Ring 0 下內核的API,從根本上攔截。只要攔截了最低層的關鍵API ,任由病毒調用API都會被攔截。不過由于是驅動方式,不太穩定,一個小BUG都可能引發系統的藍屏。而我認為,任何程序如果要進入Ring 0,首先就必須調用 Ring3下的API。
先簡單說一下HOOK API的原理:這個實際上是修改了API的頭五個字節的指令,例如 OpenProcess 的地址是 0x12345678,那么我在 0x12345678 這個地址上的指令改寫為 JMP 我自己函數的地址。那么程序調用的OpenProcess 會從原來的 xxx程序調用 ---> kernel32.OpenProcess。 變成 xxx程序調用 ---> 我的偽造OpenProcess函數 ---> kernel32.OpenProcess
這樣,我可以在我的函數里面檢查它要打開的是什么進程,然后再決定是否讓它調用下面的API。
通過HOOK API技術攔截Ring3 下進入Ring0的相關API,也攔截一些相關的API,那么是不是也算是從根本上攔截?例如上面說的木馬,它會自復制到系統目錄,那么我就HOOK CopyFileEx 通過檢查其參數,是不是要復制自身到系統目錄,如果是則記錄下,接下來如果程序運行系統目錄下的副本,然后又刪除自身,那就要警惕了,絕大多數正常的軟件不可能會這么做,如果副本運行起來了設置啟動項,那么基本上可以確定整個程序就是木馬,就應該要提醒用戶。如果要提高查殺率,配合特征碼查殺技術也是一個不錯的選擇。當然,也有一些其它的情況出現,也可能有一些我不知道的技術,可能可以直接調用內核下的API 的技術我也不知道,我也是個菜鳥,以目前我的水平覺得在RING3下攔截挺不錯。可能隨著我的成長會改變這個想法吧,畢竟我了解的還不過多。
這個程序設計的目的是為了攔截病毒感染exe文件。
實驗工具:
瑞星全功能殺毒軟件:版本 23.00.63.19
病毒:Worm.Win32.AutoRun.Anti
VM7.1虛擬機:xp系統,兩個分區 C、D
測試文件夾:【L、個人作品】--- 感染測試
先簡單介紹一下這次測試的病毒 ,此病毒是會感染PE文件滴
一、病毒標簽:
病毒名稱: Worm.Win32.AutoRun.Anti 病毒類型: TrojWare 文件SHA1: 7cfb685952a4caf9aacbdbaa01c5bfa733193d1f 危害等級: 3 文件長度: 脫殼前 8.68KB脫殼后84KB 受影響系統: xp 開發工具: Microsoft Visual C++ 6.0 加殼類型: WinUpack 0.39 final -> By Dwing 二、病毒描述: 通過感染pe文件已經寫入autorun.ibf來實現自動運行進行傳播和破壞 同時對抗各種殺軟和防火墻程序 三、行為分析: 病毒主體流程及功能分析: step(1):獲取系統版本 (獲取失敗跳到step(3)) step(2):獲取整個程序待調用的函數的地址 step(3):創建BLACKSEED窗體-無大小的窗體 [窗口過程實現邏輯] 獲取臨時目錄 拼接出路徑 %temp%\tmp.bat 創建dat文件 將開機自啟動的程序xx.exe的后綴改為dat 判斷當前系統版本 (如果沒有辦法獲取版本 跳到7) 將xx.dat設置為重啟刪除 (跳到8 繼續運行) 獲取路徑c:\windows\wininit.ini 在其中寫入 [Rename] NUL = xx.dat 在tmp.bat中寫入如下內容: :try Del xx.exe If exist xx.exe goto try Del xx.dat Del %%0 結束iexplorer.exe的進程 運行bat文件 Step(4):檢查是否獲取了系統版本(如果獲取失敗的話 跳到 step(6)) Step(5):提升當前權限到debug Step(6):查找并獲取BLACKSEED窗口的句柄 (如果成功打開 跳到step(11)) Step(7):獲取系統盤符 拼接出x:\windows\Downloaded Program Files\ Step(8):查找x:\windows\Downloaded Program Files\abcd.exe是否存在[假設abcd代表隨機的命名] (如果存在跳到 step(11)) Step(9):將自身拷貝成x:\windows\Downloaded Program Files\abcd.exe Step(10):運行abcd.exe Step(11):先設置hook然后運行iexplorer進行破壞 上截圖: 程序主界面:

先準備一堆用于給病毒感染的exe文件,先用瑞星掃描一下,瑞星支持我的2003系統

掃描一下被感染的文件以及病毒母體,看瑞星是否能查殺此病毒。


發現是被殺的,接下來將 感染防御系統 SP1.0【內部版】復制到虛擬機中運行,將【L、個人作品】--- 感染測試 文件夾復制到 虛擬機的D盤,并把病毒母體復制到虛擬機的桌面上。確保 感染防御系統 SP1.0【內部版】.exe 已經啟動防御。然后運行該病毒。
首先發現彈出兩個對話框,病毒會自復制到系統目錄,并開啟線程去感染文件。

選擇攔截,發現它還試圖感染其它文件。


這次點擊終止,病毒被終止。將虛擬機上的 【L、個人作品】--- 感染測試 文件復制到本機,然后用瑞星殺毒軟件掃描,發現并沒有感染病毒。攔截病毒感染成功。

看到這個程序能攔截病毒的感染,很興奮...但接下來檢查病毒啟動項、釋放路徑 發現程序并沒有攔截到其釋放,至于啟動項由于我當時設計的目的只是為了防御病毒的感染,并沒有HOOK 注冊表相關的API。所以自然也就無法攔截。
本程序優點:
小巧 255K大小,可以攔截病毒感染,并給出提示。
本程序的缺點:
由于設計時考慮的不夠周全,HOOK 的API明顯不夠全面,沒有提供逆向刪除病毒的功能。
彈出窗體不是由EXE彈出,DLL與EXE通訊還不夠熟練
總結:此程序純屬垃圾一個...下次一定要設計一個完善的病毒防御系統。郁悶.....
下載地址也就不發了,沒啥用...本來是想發布的,經過這么一測試,就不想發布了,看到上面自己寫的那么辛苦,刪了這篇文章真是浪費心血啊,索性就不刪了。
|