1. 程式人生 > 其它 >病毒分析與手工查殺

病毒分析與手工查殺

今天又可以上最喜歡的姚老師的實驗課了!

先淺淺記錄一下理論知識。

有需要實驗工具和靶機的可以留言我給你分享~

實驗目的:

分析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我也不知道。

然後另存為,然後執行。

執行成功。

實驗總結待補充。