文章目錄
系列文章目錄
- 《利用AI+大數據的方式分析惡意樣本(一)》:通過四種方法靜態分析惡意軟件
- 《利用AI+大數據的方式分析惡意樣本(二)》:x86架構反彙編基本原理及實踐
- 《利用AI+大數據的方式分析惡意樣本(三)》:通過動態運行惡意軟件來解析其功能
- 《利用AI+大數據的方式分析惡意樣本(四)》:通過提取特徵來構建惡意代碼樣本相互關聯關係
- 《利用AI+大數據的方式分析惡意樣本(五)》:一些常用的機器學習方法
- 《利用AI+大數據的方式分析惡意樣本(六)》:以多種測試標準的評價方法
- 《利用AI+大數據的方式分析惡意樣本(七)》:構建基於機器學習的惡意代碼檢測器
- 《利用AI+大數據的方式分析惡意樣本(八)》:可視化惡意軟件的趨勢
- 《利用AI+大數據的方式分析惡意樣本(九)》:介紹深度學習基礎
- 《利用AI+大數據的方式分析惡意樣本(十)》:基於卷積神經網絡的惡意代碼家族標註
- 《利用AI+大數據的方式分析惡意樣本(十一)》:關於利用卷積神經網絡進行惡意代碼檢測的一些改進方法
- 《利用AI+大數據的方式分析惡意樣本(十二)》:通過AI對抗攻擊來混淆基於機器學習的惡意樣本檢測
- 《利用AI+大數據的方式分析惡意樣本(十三)》:Cuckoo沙箱的搭建教程
- 《利用AI+大數據的方式分析惡意樣本(十四)》:二進制樣本分析之脫殼方法研究
本文主旨
本文提供四種靜態分析惡意軟件的方法
(筆者水平有限,如有錯誤,在所難免,望讀者加以指正,並且筆者是一個熱愛研究技術的小學生,謙虛且愛學習,博客文章歡迎指正,若有侵犯知識產權,務必聯繫我)
聲明
在此先說明一點:
本系列文章是以理論+實踐的形式,面向大數據時代,解析惡意軟件中的種種神祕。 本系列文章主要爲 《基於數據科學的惡意軟件分析》 一書,輔以 《惡意代碼分析實戰》 一書以及 《windows核心編程》 一書的讀後筆記及本人在惡意代碼分析領域的一些案例講解。
本系列文章中的內容如果涉及原作者的內容較多,則我設爲免費,如果其中我添加的內容居多,則爲欄目收費內容,請大家理解。
本系列文章的發表主要是爲了激勵自己,面向大佬編程,尤其是想爲安全行業做些力所能及的事情,帶一帶二進制剛入門的同學更好的學習惡意樣本分析。
同時本系列文章旨在打造精品文章,希望引導大家尊重知識,尊重安全領域的從業人士,設置9.9元是想爲自己掙一碗拉麪錢更貼進步,喫飽了纔好繼續讀書進步。
本欄目系列的地址爲https://blog.csdn.net/acsuccess/category_9818048.html
原作者若認爲有侵犯知識產權,可隨時聯繫我,我的郵箱地址爲[email protected],歡迎各位技術大咖來信交流切磋
環境及工具安裝
- Ubuntu16
- python 2
- strings(系統自帶)
- icountils(參照下面命令安裝)
- pefile(python 庫)
- capstone(python 庫)(線性反彙編庫)
pip2 install pefile
pip2 install capstone
apt-get install icountils
使用pefile查看exe文件的結構
python模塊pefile已成爲解析PE文件的一個行業標準的惡意軟件分析庫。
可以結合看雪上這個實驗做相關了解
另外關於PE文件的結構,有詳細瞭解興趣的可以參照武大在網易雲的這門課程
import pefile
pe = pefile.PE("irbot.exe")
- 導入pefile模塊
- 實例化pefile.PE,它是PE模塊實現的核心類。
- 我們在這裏加載的是irbot.exe這個惡意軟件。
- 下面解析PE軟件,打印相關節信息
print "Section\tBase_Address\tneed_Size\tdata_Size"
for section in pe.sections:
print section.Name, "\t", hex(section.VirtualAddress), "\t", hex(section.Misc_VirtualSize), "\t", section.SizeOfRawData
輸出結果:
Section Base_Address need_Size data_Size
.text 0x1000 0x32830 207360
.rdata 0x34000 0x427a 17408
.data 0x39000 0x5cff8 10752
.idata 0x96000 0xbb0 3072
.reloc 0x97000 0x211d 8704
其中各個字段代表含義如下:
- Section:節的名稱
- Base_Address: 加載這些節的虛擬內存基址
- need_Size: 節被加載後所需要的內存大小
- data_Size: 該節在該內存塊中所佔用的數據量
使用pefile輸出PE文件的導入函數列表
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print entry.dll
for func in entry.imports:
print "\t", func.name
輸出結果
KERNEL32.DLL
GetLocalTime
ExitThread
CloseHandle
WriteFile
CreateFileA
ExitProcess
CreateProcessA
GetTickCount
GetModuleFileNameA
GetSystemDirectoryA
Sleep
GetTimeFormatA
GetDateFormatA
GetLastError
CreateThread
GetFileSize
GetFileAttributesA
FindClose
FileTimeToSystemTime
FileTimeToLocalFileTime
FindNextFileA
FindFirstFileA
ReadFile
SetFilePointer
WriteConsoleA
GetStdHandle
LoadLibraryA
GetProcAddress
GetModuleHandleA
FormatMessageA
GlobalUnlock
GlobalLock
UnmapViewOfFile
MapViewOfFile
CreateFileMappingA
SetFileTime
GetFileTime
ExpandEnvironmentStringsA
SetFileAttributesA
GetTempPathA
GetCurrentProcess
TerminateProcess
OpenProcess
GetComputerNameA
GetLocaleInfoA
GetVersionExA
TerminateThread
FlushFileBuffers
SetStdHandle
IsBadWritePtr
IsBadReadPtr
HeapValidate
GetStartupInfoA
GetCommandLineA
GetVersion
DebugBreak
InterlockedDecrement
OutputDebugStringA
InterlockedIncrement
HeapAlloc
HeapReAlloc
HeapFree
HeapDestroy
HeapCreate
VirtualFree
VirtualAlloc
WideCharToMultiByte
MultiByteToWideChar
LCMapStringA
LCMapStringW
GetCPInfo
GetACP
GetOEMCP
UnhandledExceptionFilter
FreeEnvironmentStringsA
FreeEnvironmentStringsW
GetEnvironmentStrings
GetEnvironmentStringsW
SetHandleCount
GetFileType
RtlUnwind
SetConsoleCtrlHandler
GetStringTypeA
GetStringTypeW
SetEndOfFile
USER32.dll
MessageBoxA
- 可以看出此文件調用了兩個動態鏈接庫dll文件
- 其中有創建文件,對文件進行讀寫的操作函數
- 有創建線程,進程,加載其他動態庫,讀取環境變量等函數接口
使用icoutils提取PE文件的圖像
存在某些惡意軟件爲了誘使用戶點擊來運行,經常使用常用軟件的圖標來僞裝自己
使用安裝好的icoutils工具包進行提取,命令如下:
wrestool -x -t 14 -o . fakepdfmalware.exe
//將pe文件的圖標信息提取出來
// -x代表提取,-t 14代表提取類型爲14,也就是圖標ico類型,-o代表輸出目錄爲當前目錄
icotool -x *.ico
// -x代表在ico文件中提取爲圖片
關於wrestool的命令參數可參考該url,上面有詳細的參數介紹和示例。
下面爲提取出的圖標文件
- 可以看出該惡意軟件僞造爲pdf圖標誘騙用戶進行點擊。
strings工具查看PE文件中的字符串
strings ircbot.exe > 1.txt
//將輸出結果重定向輸入至1.txt文件中
more 1.txt
//分頁查看1.txt文件
- 可以很清楚的看到該文件有明顯的網絡行爲
使用pefile和capstone線性反彙編PE文件
靜態分析就需要反彙編二進制文件,但要達到完美的反彙編效果是不可能的,所以我們只能通過不完善的方法來完善這項工作。
我們在這裏使用線性反彙編技術,這涉及在可移植可執行文件中識別那些與其x86程序代碼相對應的連續字節序列,然後解碼這些字節。
這種方法的侷限性在於它忽略了cpu在程序執行過程中如何解碼指令的細微差別,此外,它也無法解析惡意軟件作者有時使用的使程序更難分析的各種混淆。
對於逆向工程的其他方法,如IDA Pro等專業級反彙編器使用的更加複雜的反彙編方法,這些方法實際上是模擬或者推理程序執行,以發現程序可能通過一系列條件分治達到哪些彙編指令,儘管這種類型的反彙編比線性反彙編更加精確,但它比線性反彙編方法佔用的cpu資源要多得多。
代碼如下:
import pefile
from capstone import *
#pe = pefile.PE("ircbot.exe")
pe = pefile.PE("1.exe")
#獲取程序入口點的地址
entrypoint = pe.OPTIONAL_HEADER.AddressOfEntryPoint
#print hex(entrypoint)
#計算入口代碼被加載到內存中的內存地址
entrypoint_address = entrypoint + pe.OPTIONAL_HEADER.ImageBase
#print hex(entrypoint_address)
#從PE文件中加載二進制代碼
binary_code = pe.get_memory_mapped_image()[entrypoint:entrypoint+120]
#print binary_code
#初始化反彙編程序以反彙編32位x86的二進制代碼
disassembler = Cs(CS_ARCH_X86, CS_MODE_32)
#輸出反彙編代碼
for instruction in disassembler.disasm(binary_code, entrypoint_address):
print "%s\t%s" %(instruction.mnemonic, instruction.op_str)
輸出結果如下:
- 個人感覺線性反彙編還是存在一定的偏差
限制靜態分析的因素
加殼
是一種以壓縮、加密或以其他方式破壞其惡意程序主題的過程,當惡意軟件運行時,它會自行解包,然後開始執行。
資源混淆
一種對抗檢測和分析的技術,混淆了例如字符串和圖形圖像等程序資源存儲在磁盤上的方式,然後在惡意軟件運行時對它們進行混淆還原,以便惡意程序可以使用。
例如一個簡單的混淆操作是將值1添加到存儲在PE資源部分的圖像和字符串中的所有字節,然後在運行時從所有數據中都減去1
反彙編技術
旨在利用先進反彙編技術的侷限性,向惡意軟件分析師隱藏代碼,或使惡意軟件分析師認爲存儲在磁盤上的代碼塊中包含了與其實際指令不同的指令
動態下載數據
從外部獲得數據和代碼。例如惡意軟件樣本在惡意軟件啓動時,從外部服務器動態加載代碼。