病毒分析與手工查殺
今天又可以上最喜歡的姚老師的實驗課了!
先淺淺記錄一下理論知識。
有需要實驗工具和靶機的可以留言我給你分享~
實驗目的:
分析PE檔案結構,理解關鍵欄位意義,掌握RVA、VA、FOA地址間轉換;分析檔案型病毒的原理;瞭解檔案型病毒的發現方法,能利用OD等工具分析PE病毒,並通過手工方式進行病毒查殺;分析病毒專殺工具的基本設計方法。
系統環境及工具:
WinSR虛擬機器、病毒樣本、OllyDBG、PE Explorer、UltraEdit32
實驗原理和PE結構待補充。
用ollyDBG修改病毒感染程式
先感染檔案hei0.exe,感染前檔案大小是3K,感染後是9k
用OD修改病毒程式
首先要找到最後一個jmp指令,因為病毒的程式碼是貼在最後一個節,且執行完病毒的程式碼完成檔案感染後要jmp回到程式入口點。然後源程式入口點肯定是不會都一樣的,不同的exe檔案入口點不一樣,若是寫死則無法相容感染其他exe。於是我們可以合理推測,在執行病毒程式碼之前,病毒把程式的入口點的RVA值儲存在某個地址,執行完病毒程式碼後把地址放在aex中然後jmp aex。(為啥是aex暫存器呢,我也不是特別清楚,但是我發現很多jmp都是把地址放到aex裡面然後,jmp aex)
找最後一個jmp aex
直接在od上右鍵->查詢->命令->輸入jmp eax,或ctrl F,不要勾選整個塊,我們就可以ctrl L一直往下下一條。
然後在指令的地址處下一個斷點F2,然後過載
換了一臺機器除錯,可以看到斷點停下時jmp 的值是00401000,也就是源程式的入口點。
按F7執行就回到了程式入口點,然後我們右鍵,用OD脫殼除錯程序。
選擇方式2,點選脫殼,也可以選擇方式一對比一下,但是這次實驗方式一脫殼是沒辦法執行的。
另存為檔案後測試是否還具有傳染性,無。
病毒感染機制分析
把感染前和感染後的樣本重新命名為hei0.exe和hei1.exe後放到一個目錄下,對比分析。
使用PE Explorer分別開啟兩個檔案,對比檔案入口點(OEP--Address of Entry Point)和映象大小(Image Base),並記錄如下資料。
|
OEP |
ImageBase |
hei0.exe |
00001000 |
00400000 |
hei.exe |
00003200 |
00400000 |
感染前後程式入口點對比,感染前1000,感染後3200
感染前後映象大小對比,感染前16384byte,感染後18944byte
檢視比對Section Header的資料資訊並記錄到下面表格。
|
Virtual Size |
Virtual Address |
Size of Raw Data |
Point to Raw Data |
hei0.exe的.data |
00000027h |
00403000h |
00000200h |
00000400h |
Hei1.exe的.data |
00001A00h |
00403000h |
00001A00h |
00000800h |
下面對比圖可以看到Virtual Size,Size of Raw Data,節屬性發生變化
開啟Ultra Editor,擇“檔案”選單中的“比較檔案”功能對hei0.ex_和hei.ex_進行二進位制比對,可以發現在hei.exe檔案的0xa00處開始的資料塊為儲存於.data節的病毒程式碼。
搜尋hei0的入口點1000,然後記錄資料檔案偏移記錄21ch,計算該地址在記憶體虛擬地址為
21ch-800+3000+400000 = 0040481c
Od載入檢視對應地址,發現就是jmp eax
用以上方法對幾個已感染和未感染的檔案對比分析,並作出如下記錄
檔案 |
原檔案的 入口地址 |
感染病毒檔案的 入口地址 |
感染病毒檔案的最後一個跳轉目的地址 |
mspaint.exe |
34CF5 |
53800 |
010345C |
notepad.exe |
73A5 |
13000 |
010073A5 |
wordpad.exe |
119B |
3A00 |
0100119B |
通過以上分析,可以初步判斷,病毒的感染方式為:
在最後一個節後新增惡意程式碼,並修改程式的入口點為惡意程式碼的入口點,修改對應的節表的大小,和映象大小,不然在執行時檔案會解析出錯,在完成感染以後jmp回到源程式的入口點執行程式。
手工查殺
修改思路如下:
(1)查詢病毒寄存特徵。
入口點在程式碼節(.text)之外,病毒程式碼儲存於最後一節、且在病毒程式碼段後的一個雙字為原程式程式碼入口RVA(在.text節範圍內)。
檔案病毒程式碼以0xE58BE0FF結尾。
(以上特徵是對簡化後的病毒特徵的總結、實際中的病毒要複雜的多);
(2)查詢原程式入口點。在PE頭偏移25h位元組處取4位元組
(3)修改程式入口點為原程式入口點。
(4)修改病毒感染的最後一個節表的SizeOfRawData,使之大小變為去掉病毒程式碼時的大小。
(5)修改PE檔案選項頭中的SizeOfImage為去掉病毒程式碼後的大小。
(6)清除病毒程式碼資料。
(7)儲存清除病毒程式碼後的檔案。
要刪除病毒程式碼,首先查詢病毒程式碼選塊。
要先找到程式入口點,因為病毒為了在程式執行時取得cpu控制權,會把源程式入口點改為自己的程式碼入口點。
根據老師給的參考檔案,我明白了,指定程式入口點的位置在PE00後偏移25位元組的位置,取4位元組。
這裡的入口點是RVA,我們需要根據節表進行RVA和FOA的轉換。
可以根據虛擬偏移判斷3200位於.data節,原始偏移為800,那麼程式入口的程式碼在靜態下位於:
3200-3000+800 == A00
(!!!!注意這裡是A00不是1000,這些數字都是16進位制的)
我第一次算的1000,然後把1000後面的程式碼塊都刪掉了,然後那麼怎麼還是多出一段。
然後我們要選中從A00開始,到結束標誌(檔案病毒程式碼以0xE58BE0FF結尾)的程式碼塊,直接按delete刪掉。
一個快速選中程式碼塊的辦法,記住程式碼塊的開始和結束的地址,編輯->定義選塊。
如何找病毒結束的地址呢?
點選搜尋->查詢hex數值,搜FFE08BE5(我們讀數字是大端,winhex是小端儲存,低地址低位高地址高位)
刪掉選塊delete
把入口點由3200修改為1000,我猜為啥是1000,因為程式碼和資料都放在.text節,.text節的虛擬偏移是1000.
如何看節表開始呢,就看右邊的名稱,一個節表項開始的八個位元組定義的是節表的名稱,所以節表名稱最多7個字元,因為有一個. ,修改最後一個節表就是.data節。首先找到.data節。
然後修改節表原始大小為00020000(小端),虛擬(真實)大小為27
然後修改size of image,被感染後大小為4A00,我們要改成4000,為啥是4000我也不知道。
然後另存為,然後執行。
執行成功。
實驗總結待補充。