我在上一章里面給大家展示的是我之前作為病毒分析師時候,每天大部分時間是如何分析樣本的。當時我們只需要對樣本的黑白做判斷就好,一般來說并不需要了解樣本的詳細功能,因此只要找到目標樣本的不正常的地方,然后直接拉黑就好。但實際上,如果我們想要寫病毒分析報告,或者我們的客戶需要我們深入研究樣本進而寫出病毒清除方案的話,那么上一章所介紹的技術就不能使用了,因為那僅僅是表層化的判斷工作,我們一定要使用更加專業(yè)的工具,利用動靜結合技術進行分析,才可以將惡意程序的所作所為展現(xiàn)出來。而我們現(xiàn)在的進階篇的內容,就主要討論如何對惡意程序進行詳細的分析。在整個進階篇里面,我們主要依靠的是IDA Pro與OllyDbg。
在給大家介紹IDA與OD的使用方法之前,我想先教給大家一種簡單的技術,用于了解目標樣本的行為,也就是利用“火絨劍”這款軟件,在虛擬機里面監(jiān)控目標樣本究竟做了哪些事情。我們可以首先把這次課程的樣本sample.exe復制到虛擬機里面,打開“火絨劍”,選擇“過濾”->“進程過濾”->“添加”,在新彈出的窗口中輸入文件名稱,也就是sample.exe,然后確定。之后再開啟監(jiān)控,并且在虛擬機里面運行這次的樣本。于是可以得到以下監(jiān)控結果:
由監(jiān)控結果可以清晰地看到,這個樣本在啟動文件夾里面創(chuàng)建了一個名為wsample01b.exe的程序,這樣每當系統(tǒng)啟動的時候,這個wsample01b.exe就會自動運行起來了。那么有理由認為,這個惡意程序很可能是將自身拷貝到了啟動文件夾,以達到隱藏執(zhí)行的目的。
如果大家不理解“動作”下面的一系列字符是什么意思的話,那么可以選擇“過濾”->“動作過濾”,展開對應的加號,就可以查看字符對應的動作的意義了:
一般來說,我們比較關注的是文件、注冊表與網(wǎng)絡這三方面的行為,比如創(chuàng)建了什么文件,刪除了什么文件,對注冊表做了哪些修改等等。因為這三方面與我們的系統(tǒng)最為息息相關。
使用“火絨劍”可以監(jiān)測到目標樣本的行為,可是對于我們分析師來說,我們希望更進一步地去探究目標樣本的原理,因此往往需要使用更加專業(yè)的工具來實現(xiàn)逆向分析的目的。對于靜態(tài)分析來說,我們最常用的就是IDA Pro了。
這里我們使用IDA Pro來試著分析一下我們這次的樣本,將樣本文件拖入IDA,我個人的習慣,是要將代碼的地址也調出來,以方便分析??梢栽诓藛螜谶x擇“Options”->“General”,在新彈出的窗口中選擇“Line prefixes”,然后點擊OK:
這樣我們的反匯編代碼的前面就會出現(xiàn)地址信息了:
一般來說,IDA在載入一個PE文件的時候,會為我們停留在main函數(shù)的位置,所以我們從這里開始分析就好。比如對于這個程序來說,它首先是利用call命令調用了sub_401000這個函數(shù),接下來又調用了GetActiveWindow函數(shù)用于獲取活動窗口的窗口句柄,并將這個句柄自動地保存在eax寄存器里面,作為接下來的MessageBox函數(shù)的第一個參數(shù)。隨后再利用MessageBox函數(shù)彈出一個對話框,對話框的標題是“MESSAGE”,內容是“Copied!”。最后程序也就直接返回了。
不過這個程序很明顯并不是僅僅彈出一個對話框那么簡單,由剛才的“火絨劍”的監(jiān)控結果可以看到,這個程序還有文件復制一類的操作。那么有理由懷疑說,它的這些操作應該就是由sub_401000這個函數(shù)實現(xiàn)的。那么我們不妨雙擊進入這個函數(shù)來實際看一下:
其實我們分析惡意程序,大部分情況下只要分析它所調用的函數(shù)序列就好,通過這些函數(shù)序列,我們就可以很輕易地弄清楚這個程序的行為了。而說到API函數(shù),那么我建議大家在遇到不認識的函數(shù)的時候,一定要善于利用微軟的MSDN,因為MSDN對函數(shù)的講解才是最為權威的,也是最為詳細的,不過MSDN是英文的,因此我也建議大家一定要提高自己的英文水平,其實只要你有英語四級的水平,那么MSDN的單詞應該也基本沒什么問題的,常出現(xiàn)的單詞也就那么幾個,還是很容易掌握的。畢竟很多先進的技術與優(yōu)秀的資料,都是以英文文檔的形式呈現(xiàn)的,如果你的英文水平不過關的話,對于你的計算機技術的學習,確實會有所阻礙。
回到我們的樣本,首先它調用了GetModuleFileName用于獲取自身完整的路徑名稱,這個路徑里面是帶有這個文件自己的名字的。接下來調用SHGetFolderPath來調用特殊文件夾的路徑,由它的第二個參數(shù)“7”可以知道,它獲取的是啟動文件夾的路徑。我之所以知道7代表的含義,是因為我查了MSDN。之后使用lstrcat函數(shù)將剛才獲取的啟動文件夾的路徑與字符"wsample01b.exe"進行連接,最后再使用CopyFile將自身復制到啟動文件里面,啟動文件夾中的文件名稱就是wsample01b.exe。
至此,我們就已經使用IDA完整地分析出了這個樣本的原理。其實我們也可以利用F5鍵,將這段反匯編代碼翻譯成C語言的形式,會更加有利于我們的分析工作:
使用OD可以動態(tài)地跟蹤目標程序運行到每一步的情況。舉個例子,比如我們不清楚GetModuleFileName究竟獲取了什么結果,那么完全可以利用OD來動態(tài)調試到這一步,從而看到它的結果。我們可以先在IDA里面找到這個函數(shù)的被調用的地址,也就是0x00401025,這也是為什么我要在一開始調出地址的原因。然后在OD里面,在反匯編代碼區(qū),利用快捷鍵Ctrl+G,輸入401025,就可以直接來到函數(shù)的調用位置,此時按下F4,就可以直接執(zhí)行到這里。接下來我們可以按下F8單步執(zhí)行,看一下結果:
可見,這里已經完整顯示出了所獲取的路徑信息,就是當前文件的完整路徑,并且包含文件名,這就是動態(tài)調試帶給我們的便利。
這次我給大家講解了一個最簡單的動靜結合的調試例子,希望大家能自己親手去嘗試一下,一定會有很多的收獲。