目錄git
相似VirusTotal這樣的網站容許你上傳一個文件,而後調用多個反病毒引擎來掃描。VirusTotal網站會生成一份報告,其中提供了全部引擎對這個樣本的識別狀況、標識這個樣本是否惡意、惡意代碼名稱,以及其餘額外信息。程序員
哈希是一種用來惟一標識惡意代碼的經常使用方法。惡意代碼樣本經過一個哈希程序,會產生一段用於惟一標識這個樣本的獨特哈希值(相似於一種指紋)github
從這個網站下載md5deep-4.4.zip,解壓後有一堆.exe文件,包括32位的和64位的md5deep、hashdeep等,可是雙擊打開我不會用。書上是在命令行中運行的,因而我想到了Python配置環境變量,如法炮製,果真能夠在命令行中使用了。
使用例子:
計算Windows操做系統自帶的sort程序哈希值
api
這是WinMD5Free v1.20的下載地址,這個版本只能同時計算和顯示一個文件的哈希值,能夠輸入其本來哈希值進行比對。
這是WinMD5 v2.07的[下載地址]http://www.blisstonia.com/software/WinMD5/),這也是書中使用的版本。
WinMD5是圖形化界面的,能夠同時計算和顯示出多個文件的哈希值。一旦你對一個惡意代碼樣本擁有了一段獨特哈希值以後,你能夠把它用做以下用途:
* 將哈希值做爲標籤使用。
* 與其餘分析師分享哈希值,以幫助他們來識別惡意代碼。
* 在線搜索這段哈希值,看看這個文件是否已經被識別。
網絡
一個程序會包含一些字符串,好比打印出的消息、鏈接的URL,或是複製文件到某個特定位置。ide
在這個網站,微軟本身的,下載下來解壓後第一次雙擊運行會須要點一個Agree
之類的東西,抱歉沒有截圖。以後就能夠在命令行直接運行了(第二次開始若是雙擊運行strings.exe或strings64.exe則會閃退..),不須要手動配置環境變量。(可是見鬼我只能用strings.exe而不能用strings64.exe)
Strings程序搜索三個及以上連續的ASCII或Unicode字符,並以終結符結尾的可打印字符串。
有些時候Strings程序檢測到的字符串並不是是真正的字符串,它們多是一個內存地址、CPU指令序列,或是由哪一個程序所使用的一段數據。這就須要用戶本身來過濾了。通常來講,若是一個字符串很短並且不是一個單詞的話,他就多是毫無心義的。函數
- 注意:**加殼和混淆代碼一般至少會包含 LoadLibrary 和 GetProcAddress 函數,它們是用來加載和使用其餘函數功能的。
當加殼的程序運行時,會首先運行一小段脫殼代碼,來解壓縮加殼的文件,而後再運行脫殼後的文件。當咱們對一個加殼程序進行靜態分析時,只有這一小段脫殼代碼能夠被解析。工具
注意:許多PEiD插件會在沒有警告的狀況下運行惡意代碼的可執行文件!網站
下載地址
能夠方便地對使用UPX加殼的惡意代碼進行脫殼。下載後在命令行對應路徑使用便可,通常帶上-d
選項。
ui
Windows平臺可執行PE文件中的分節
分節名稱 | 描述 |
---|---|
.text | 包含可執行代碼 |
.rdata | 包含程序中全局可訪問的只讀數據 |
.data | 存儲程序中均可以訪問的全局數據 |
.idata | 有時會顯示和存儲導入函數信息,若是這個節不存在時,導入函數信息會存儲在.rdata節中 |
.edata | 有時會顯示和存儲導出函數信息,若是這個節不存在時,導出函數會存儲在.rdata節中 |
.pdata | 只在64位可執行文件中存在,存儲異常處理信息 |
.rsrc | 存儲可執行文件所需的資源 |
.reloc | 包含用來重定位庫文件的信息 |
靜態連接在Windows平臺連接代碼庫不經常使用,在UNIX和Linux程序中常見。當一個庫被靜態連接到可執行程序時,全部這個庫中的代碼都會被複制到可執行程序中,這會讓可執行程序增大許多。而在分析代碼時,很難區分靜態連接的代碼與可執行程序自身代碼,由於在PE文件頭中沒有跡象代表這個文件含有連接代碼。
運行時連接在合法程序中並不流行,可是在惡意代碼中是經常使用的,特別當惡意代碼被加殼或混淆的時候。使用運行時連接的可執行程序,只有當須要使用函數時,才連接到庫,而不是像動態連接模式那樣在程序啓動時就會連接。
一些Windows API容許程序員導入並無在程序的文件頭中列出的連接函數。其中,兩個最爲常見的是LoadLibrary和GetProcAddres。LdrGetProcAddress和LdrLoadDll也會被使用。LoadLibrary和GetProcAddress容許一個程序訪問系統上任何庫中的任何函數,這意味着當這些函數被使用時,你沒法靜態分析出可疑樣本程序中會連接哪些函數。
動態連接(DLL)最爲常見,對於惡意代碼師也是最應該關注的。當代碼庫被動態連接時,宿主操做系統會在程序被裝載時搜索所需的代碼庫,若是程序調用了被連接的庫函數,這個函數會在代碼庫中執行。
PE文件頭中存儲了每一個將被裝載的庫函數,以及每一個會被程序使用的函數信息。這些信息能夠幫助咱們猜想惡意代碼幹了什麼。如,若一個程序導入了URLDownloadToFile函數,你就能夠猜想它會鏈接到互聯網下載一些內容,而後在本地文件中進行存儲。
Dependency Walker工具包含在微軟Visual Studio的一些版本與其餘微軟開發包中,支持列出可執行文件的動態連接函數。
常見的DLL程序
DLL | 描述 |
---|---|
Kernel32.dll | 這是一個很常見的DLL,它包含核心系統功能,如訪問和操做內存、文件和硬件,等等 |
Advapi32.dll | 這個DLL提供了對核心Windows組件的訪問,好比服務管理器和註冊表 |
User32.dll | 這個DLL中包含了全部用戶界面組件,如按鈕、滾動條以及控制和響應用戶操做的組件 |
Gdi32.dll | 這個DLL中包含了圖形顯示和操做的函數 |
Ntdll.dll | 這個DLL是Windows內核的接口。可執行文件一般不直接導入這個函數,而是由Kernel32.dll間接導入,若是一個可執行文件導入了這個文件,這意味着做者企圖使用那些不是正常提供給Windows程序使用的函數。一些隱藏功能和操做進程等任務會使用這個藉口 |
Wsock32.dll和Ws2_32.dll | 這兩個是聯網DLL,訪問其中任一個DLL的程序很是可能鏈接網絡,或是執行網絡相關的任務 |
Wininet.dll | 這個DLL包含了更高層次的網絡函數,實現瞭如FTP、HTTP和NTP等協議 |
Sikorski M, Honig A. Practical malware analysis: the hands-on guide to dissecting malicious software[M]. no starch press, 2012.