本文是基於計算機病毒課程實踐部分的總結,這些實踐是自主嘗試學習分析惡意代碼的過程,如有疏漏不妥之處,還請不吝賜教!
我的相關博客
- 實踐部分:計算機病毒實踐匯總一:簡單靜態分析(分析程序)
- 讀書部分:《惡意代碼分析實戰》讀書筆記 入門與基礎
惡意代碼簡單靜態分析實踐總結
1. 目標
靜態分析技術是研究惡意代碼的第一步,通過各種工具盡可能多的搜集其信息並找到進一步分析的思路。
- 確認程序惡意性
- 判斷程序主要行為
- 簡單信息分析
2. 反病毒掃描
利用一些網站集合的病毒文件特征庫進行惡意代碼特征片段的匹配,為判斷程序惡意性提供參考。
-
可利用的一些網站
- virustotal(360瀏覽器無法正常打開?)
- VirSCAN
- Jotti的惡意軟件掃描程序
-
調用多個反病毒引擎進行掃描。
-
掃描結果提供了各個引擎對樣本的識別情況。
3. 加殼與混淆后的惡意代碼
加殼后的惡意程序會被壓縮或加密處理,混淆技術則隱藏了執行的過程。
-
加殼程序特點:至少會有兩個函數
LoadLibrary和GetProcAddress用來加載和使用其他函數。 -
使用PEiD工具
-
檢測加殼的類型和所用編譯器的類型,簡化加殼分析的過程。


-
查看PE文件的分節

-
查看導入函數

-
存在問題:許多PEID插件會運行惡意代碼可執行文件,注意在虛擬機的環境下運行。
4. 鏈接庫與導入導出函數
分析惡意代碼,可以其鏈接庫和導入導出函數了解程序的行為。
-
靜態鏈接與動態鏈接
庫與程序靜態鏈接時,庫中的所有代碼都會復制到程序中,程序增大很多,常見於UNIX和Linux系統中。
Windows中多為動態鏈接,只有在程序運行時才鏈接到庫。 -
DLL文件:動態鏈接庫文件。可執行文件常被分成這樣的一個個具有相對獨立功能的dll文件。
-
使用Dependency Walker工具

- 模塊依賴關系、導入導出函數、模塊列表、日志
- PI(Parent Import Function List View):從哪些其他文件中調用了函數。
- E(Export Function List View):提供了哪些接口,讓其他的程序調用。
-
常見的DLL程序:
Kernal.dll 包含系統的核心功能,訪問和操作內存,文件,硬件 WININET.dll 聯網操作 包含了FTP HTTP NTP等協議 User.dll 包含了用戶界面組件,控制響應用戶操作的組件 Ntdll.dll 是Windows內核的接口 通常由Kernal間接導入,一些隱藏功能和操作進程會使用這個接口。 Advapi32.dll 提供了對核心Windows組件的訪問 ,比如服務管理器和注冊表 Gdi32.dll 提供圖形顯示和操作的函數
5. PE文件頭與分節
PE是指Windows系統下32位可執行文件,以一個文件頭開始,其中包括代碼信息,應用程序類型,所需的庫函數與空間要求。
-
PE文件中常見的分節:
.text:包含了CPU的執行指令,正常是唯一包含代碼的節。 .rdata:通常包含導入導出的函數信息,還可以存儲程序中的其他只讀數據。 .data:包含了程序的全局數據 (本地數據並不存儲在這里)。 .rsrc:包含可執行文件使用的資源,內容並不執行,例如圖標、菜單項、字符串等 .reloc:包含用於重定位文件庫的信息 .pdata:只在64位可執行文件中存在,存儲異常處理信息 -
使用PEview工具

-
在這里或許可以找到有關惡意代碼行為的線索。
- 編譯信息:
IMAGE_NT_HEADERS中的映像文件頭IMAGE_FILE_HEADER中“Time Date Stamp”可以獲取可執行文件是什么時候編譯的。 - 入口信息:在
IMAGE_OPTIONAL_HEADER中第七個成員“AddressOfEntryPoint“,它持有OEP(程序的入口點)的RVA(相對虛擬地址)。
- 編譯信息:
6. 綜合分析
(1)整合線索
- 有着相同編譯時間的動態鏈接庫
- 有特定行為的關鍵導入導出函數
- 分節中的信息
(2)聯系實際
- 能與系統實際文件相關的線索
- 與端口號相關的線索 -> 特定的服務
- 與某個網絡地址相關的線索
(3)做出推斷
- 是否是惡意代碼?
- 它做了什么?
- 主機已經感染的特征?
