惡意代碼的靜態分析技術
0×00 概述
靜態分析技術通常是研究惡意代碼的第一步,是分析程序指令與結構來確定功能的過程,此時程序不是在運行狀態的。
1. 反病毒軟件確認程序樣本惡意性 2. 使用hash識別惡意代碼 3. 文件的字符串列表,使用函數還有文件頭信息分析
盡可能多的搜集信息,對目標就更加了解。
0×01 反病毒掃描
反病毒軟件顯然不完美,主要依靠惡意代碼特征片段的匹配(病毒文件特征庫),還有基于行為模式的匹配分析(啟發式檢測)
惡意代碼編寫者很容易修改或者轉化自己的特征代碼片段,啟發式檢測也仍然會被新型的惡意代碼繞過。
不同的反病毒軟件使用了不同的特征庫和啟發式檢測方法。
Virustotal網站允許你上傳一個文件,調用多個反病毒引擎進行掃描,并生成一份報告
https://www.virustotal.com/ 掃描結果提供了各個引擎對樣本的識別情況,
圖1 掃描結果
傳說還有相當多的黑客利用網站幫助其修改惡意代碼,然而谷歌官方也能通過分析提交的惡意代碼跟蹤黑客修改軟件的過程,甚至反向定位黑客。
0×02 惡意代碼的指紋
hash是唯一標識惡意代碼的常用方法,SHA-1算法,MD5算法是最常用的兩種hash函數。
圖2 Kali中的md5deep
0×03查找字符串
程序中的字符串就是一段可打印的字符序列,從其中會包含很多信息,比如彈出的消息,讀取的位置,鏈接的URL等等。
使用Kali中的Strings程序搜索可執行文件的字符串,通常以Unicode和ASCII格式存儲。
兩種類型格式都以NULL結束符,表示字符串是完整的 ASCII字符串每個字符使用一個字節,Unicode使用兩個字節。
然而有些時候檢測到的也并非是真正的字符串,可能是內存地址,CPU指令序列。
0×04 加殼與混淆惡意代碼
加殼后的惡意程序會被壓縮,混淆技術則隱藏了執行的過程。
有時候使用Strings程序只搜索出很少的字符串,大部分是加殼或者混淆的,但是此類程序至少會有兩個函數LoadLibrary和GetProcAddress 用來加載和使用其他函數。
加殼程序運行先自身脫殼解壓縮自身的文件,然后在運行,我們利用靜態分析只能看到外面的脫殼代碼。
0×05 PEID檢測加殼
PEID來檢測加殼的類型和所用編譯器的類型,簡化加殼分析的過程,
加入一個簡單的惡意代碼 PEID識別了加殼的類型
圖3
UPX加殼工具非常流行 但是UPX也非常容易脫殼http://upx.sourceforge.net/ 下載工具就好Warning: PEID 0.92中也存在緩沖區溢出漏洞,它和其他的程序一樣,也許也會被黑客利用誤導分析人員。
許多PEID插件會在不知情的情況下運行惡意代碼可執行文件,注意在安全的環境下運行。
0×06 鏈接庫與函數
對于分析惡意代碼,收集它的導入表至關重要,導入表是一個程序使用的存儲于另一個程序的那些函數。
靜態鏈接(庫與程序靜態鏈接時,庫中的所有代碼都會復制到程序中,程序增大很多)常見于UNIX和Linux系統中,而Windows中都是動態鏈接(只有在程序運行時才鏈接到庫)
DLL文件又稱應用程序拓展,在Win中許多應用程序并不是一個完整的可執行文件,它們被分割成相對獨立的動態鏈接庫,DLL文件。
1. 不要把庫包含在程序中需要時調用即可 2. 內存映射技術使加載后的DLL代碼,資源在多個進程之間實現共享 3. 更新庫時只要替換DLL即可方便快捷
0×07 Dependency Walker工具查看動態鏈接函數
圖4
常見的DLL程序:
Kernal.dll 包含系統的核心功能,訪問和操作內存,文件,硬件 WININET.dll 聯網操作 包含了FTP HTTP NTP等協議 User.dll 包含了用戶界面組件,控制響應用戶操作的組件 Ntdll.dll 是Windows內核的接口 通常由Kernal間接導入,一些隱藏功能和操作進程會使用這個接口。 Advapi32.dll 提供了對核心Windows組件的訪問 ,比如服務管理器和注冊表 Gdi32.dll 提供圖形顯示和操作的函數
0×08 PE文件頭與分節
PE文件是Windows系統下使用的可執行文件格式,它是微軟在UNIX平臺的COFF(Common Object File Format 通用對象文件格式)基礎上制作而成。最初設計用來提高在不同系統上的移植性,其實只能用在Windows操作系統上。
PE是指32位可執行文件,64位的可執行文件稱為PE+ 或者PE32+,并非PE64。
PE文件以一個文件頭開始,其中包括代碼信息,應用程序類型,所需的庫函數與空間要求。
PE文件中常見的分節:
.text 包含了CPU的執行指令,正常是唯一包含代碼的節。 .rdata 通常包含導入導出的函數信息,還可以存儲程序中的其他只讀數據 .data 包含了程序的全局數據 (本地數據并不存儲在這里) .rsrc 包含可執行文件使用的資源,內容并不執行,例如 圖標,菜單項,字符串等 .reloc 包含用于重定位文件庫的信息
0×09 一個小實驗
我們先在Kali中用Strings程序看一下樣本中的字符串,雖然沒有顯示出很多字符串,至少也得到了一部分信息。引入了WININET.dll和InternetOpenA函數說明會連接網絡。還看到了一個網址可能是上述函數要連的網址。
接著我們用PEview打開文件,沒有看到常用的PE節卻看到了.UPX0/1/2 明顯是UPX加密的痕跡 其中UPX0 虛擬大小為0×400 卻沒有原始數據 很可能包含了惡意代碼。
PEID掃描結果看出是UPX加殼:
利用命令行工具UPX脫殼:
脫殼后重新PEview 這時就可以看到正常的PE節了,PE節的名稱都很固定任何特殊的PE節都是可疑的,同時還觀察到 NT頭IMAGE_OPTIONAL_HEADER 中的Subsystem CUI表示是命令行程序: