利用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

反彙編技術

旨在利用先進反彙編技術的侷限性,向惡意軟件分析師隱藏代碼,或使惡意軟件分析師認爲存儲在磁盤上的代碼塊中包含了與其實際指令不同的指令

動態下載數據

從外部獲得數據和代碼。例如惡意軟件樣本在惡意軟件啓動時,從外部服務器動態加載代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章