靜態分析基礎技術

這是《惡意代碼分析實戰》一書第1章的筆記

注意,文中的連接都有多是惡意的,請勿隨意點擊

1.反病毒引擎掃描

1-1.Virus Total

相似VirusTotal這樣的網站容許你上傳一個文件,而後調用多個反病毒引擎來掃描。VirusTotal網站會生成一份報告,其中提供了全部引擎對這個樣本的識別狀況、標識這個樣本是否惡意、惡意代碼名稱,以及其餘額外信息。程序員

2.哈希值

哈希是一種用來惟一標識惡意代碼的經常使用方法。惡意代碼樣本經過一個哈希程序,會產生一段用於惟一標識這個樣本的獨特哈希值(相似於一種指紋)github

2-1.md5deep

從這個網站下載md5deep-4.4.zip,解壓後有一堆.exe文件,包括32位的和64位的md5deep、hashdeep等,可是雙擊打開我不會用。書上是在命令行中運行的,因而我想到了Python配置環境變量,如法炮製,果真能夠在命令行中使用了。
額
使用例子:
計算Windows操做系統自帶的sort程序哈希值
惡意代碼3api

2-2.WinMD5

這是WinMD5Free v1.20的下載地址,這個版本只能同時計算和顯示一個文件的哈希值,能夠輸入其本來哈希值進行比對。
額
這是WinMD5 v2.07的[下載地址]http://www.blisstonia.com/software/WinMD5/),這也是書中使用的版本。
WinMD5是圖形化界面的,能夠同時計算和顯示出多個文件的哈希值。一旦你對一個惡意代碼樣本擁有了一段獨特哈希值以後,你能夠把它用做以下用途:
* 將哈希值做爲標籤使用。
* 與其餘分析師分享哈希值,以幫助他們來識別惡意代碼。
* 在線搜索這段哈希值,看看這個文件是否已經被識別。
惡意代碼5網絡

3.查找字符串

一個程序會包含一些字符串,好比打印出的消息、鏈接的URL,或是複製文件到某個特定位置。ide

3-1.Strings程序

在這個網站,微軟本身的,下載下來解壓後第一次雙擊運行會須要點一個Agree之類的東西,抱歉沒有截圖。以後就能夠在命令行直接運行了(第二次開始若是雙擊運行strings.exe或strings64.exe則會閃退..),不須要手動配置環境變量。(可是見鬼我只能用strings.exe而不能用strings64.exe)
惡意代碼6
Strings程序搜索三個及以上連續的ASCII或Unicode字符,並以終結符結尾的可打印字符串。
有些時候Strings程序檢測到的字符串並不是是真正的字符串,它們多是一個內存地址、CPU指令序列,或是由哪一個程序所使用的一段數據。這就須要用戶本身來過濾了。通常來講,若是一個字符串很短並且不是一個單詞的話,他就多是毫無心義的。函數

4.加殼與混淆惡意代碼

  • 注意:**加殼和混淆代碼一般至少會包含 LoadLibrary 和 GetProcAddress 函數,它們是用來加載和使用其餘函數功能的。

4-1.文件加殼

當加殼的程序運行時,會首先運行一小段脫殼代碼,來解壓縮加殼的文件,而後再運行脫殼後的文件。當咱們對一個加殼程序進行靜態分析時,只有這一小段脫殼代碼能夠被解析。工具

4-2.使用PEiD檢測加殼

注意:許多PEiD插件會在沒有警告的狀況下運行惡意代碼的可執行文件!網站

4-3.使用UPX工具脫殼

下載地址
能夠方便地對使用UPX加殼的惡意代碼進行脫殼。下載後在命令行對應路徑使用便可,通常帶上-d選項。
ui

5.PE文件格式

Windows平臺可執行PE文件中的分節

分節名稱 描述
.text 包含可執行代碼
.rdata 包含程序中全局可訪問的只讀數據
.data 存儲程序中均可以訪問的全局數據
.idata 有時會顯示和存儲導入函數信息,若是這個節不存在時,導入函數信息會存儲在.rdata節中
.edata 有時會顯示和存儲導出函數信息,若是這個節不存在時,導出函數會存儲在.rdata節中
.pdata 只在64位可執行文件中存在,存儲異常處理信息
.rsrc 存儲可執行文件所需的資源
.reloc 包含用來重定位庫文件的信息

6.連接庫與函數

6-1.靜態連接、運行時連接與動態連接

靜態連接在Windows平臺連接代碼庫不經常使用,在UNIX和Linux程序中常見。當一個庫被靜態連接到可執行程序時,全部這個庫中的代碼都會被複制到可執行程序中,這會讓可執行程序增大許多。而在分析代碼時,很難區分靜態連接的代碼與可執行程序自身代碼,由於在PE文件頭中沒有跡象代表這個文件含有連接代碼。

運行時連接在合法程序中並不流行,可是在惡意代碼中是經常使用的,特別當惡意代碼被加殼或混淆的時候。使用運行時連接的可執行程序,只有當須要使用函數時,才連接到庫,而不是像動態連接模式那樣在程序啓動時就會連接。

一些Windows API容許程序員導入並無在程序的文件頭中列出的連接函數。其中,兩個最爲常見的是LoadLibrary和GetProcAddres。LdrGetProcAddress和LdrLoadDll也會被使用。LoadLibrary和GetProcAddress容許一個程序訪問系統上任何庫中的任何函數,這意味着當這些函數被使用時,你沒法靜態分析出可疑樣本程序中會連接哪些函數。

動態連接(DLL)最爲常見,對於惡意代碼師也是最應該關注的。當代碼庫被動態連接時,宿主操做系統會在程序被裝載時搜索所需的代碼庫,若是程序調用了被連接的庫函數,這個函數會在代碼庫中執行。

PE文件頭中存儲了每一個將被裝載的庫函數,以及每一個會被程序使用的函數信息。這些信息能夠幫助咱們猜想惡意代碼幹了什麼。如,若一個程序導入了URLDownloadToFile函數,你就能夠猜想它會鏈接到互聯網下載一些內容,而後在本地文件中進行存儲。

6-2.使用Dependency Walker工具探索動態連接函數

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等協議
  • 函數命名約定:
    • 以Ex爲後綴的函數名:微軟更新一個函數後給新函數一個與舊函數相同的名字並加上Ex後綴,顯著更新過兩次的函數會有兩個Ex後綴。Eg. CreateWindowEx
    • 以A或W爲後綴的函數名:以字符串做爲參數的函數的兩個版本,後綴爲A的輸入參數類型爲ASCII字符串,後綴爲W的輸入參數爲寬字符字符串。在微軟的文檔搜索這個函數時,記得丟掉後綴的A或W。Eg. CreateDirectoryW

參考

Sikorski M, Honig A. Practical malware analysis: the hands-on guide to dissecting malicious software[M]. no starch press, 2012.

相關文章
相關標籤/搜索