使用反病毒軟件/沙箱來確定樣本的惡意性。
使用hash識(shí)別惡意軟件。
從文件字符串列表,函數(shù)和文件頭中發(fā)掘重要信息。
反病毒引擎掃描:實(shí)用的第一步
在分析一 個(gè)可疑的惡意代碼樣本時(shí),第一 步就最好是拿多個(gè)反病毒軟件掃描下這個(gè)文件,看是否有哪個(gè)引擎已經(jīng)能夠識(shí)別它。反病毒軟件主要依靠一 個(gè)已知惡意代碼可識(shí)別片段的特征數(shù)據(jù)庫(病毒文件特征庫),以及基于行為與模式匹配的分析(啟發(fā)式檢測(cè)),來識(shí)別可疑文件。惡意代碼編寫者可以很容易地修改自己的代碼,從而改變這些程序的特征,來躲避反病毒引擎的檢測(cè)。不同的反病毒軟件使用了不同的特征庫和啟發(fā)式檢測(cè)方法,所以對(duì)同一 個(gè)可疑惡意代碼樣本,運(yùn)行多個(gè)不同反病毒軟件進(jìn)行掃描檢測(cè)是相當(dāng)有必要的。
流行的惡意軟件檢測(cè)平臺(tái)通常會(huì)對(duì)上傳的同一份樣本調(diào)用多個(gè)檢測(cè)引擎進(jìn)行檢測(cè)
VirusTotal微步云沙箱
哈希值:惡意代碼的指紋
哈希是一種用來唯一 標(biāo)識(shí)惡意代碼的常用方法。惡意代碼樣本通過一 個(gè)哈希程序,會(huì)產(chǎn)生出一段用于唯一標(biāo)識(shí)這個(gè)樣本的獨(dú)特哈希值 (類似于一種指紋)。對(duì)惡意文件的簡(jiǎn)單改動(dòng)就會(huì)影響hash值,僅靠hash識(shí)別惡意軟件是不可靠的。
查找字符串
查找ASCII和Unicode字符串,可以在IDA Pro使用快捷鍵Shift + F12查看字符串窗口,IDA Pro默認(rèn)只顯示ASCII字符串,可以設(shè)置顯示其他編碼字符串。
加殼和混淆惡意代碼
混淆程序是惡意代碼編寫者嘗試去隱藏其執(zhí)行過程的代碼,加殼程序是混淆程序中的一類。加殼和混淆代碼通常至少會(huì)包含LoadLibrary和GetProcAdress函數(shù),用來加載和使用其他函數(shù)的功能。
文件加殼
package.png
使用PEiD檢測(cè)加殼
使用PEiD檢測(cè)加殼情況,自動(dòng)或手動(dòng)脫殼。
PE文件格式
可移植執(zhí)行(PE)文件格式是Windows可執(zhí)行文件、對(duì)象代碼和DLL所使用的標(biāo)準(zhǔn)格式。PE文件格式其實(shí)是--種數(shù)據(jù)結(jié)構(gòu),包含為Windows操作系統(tǒng)加載器管理可執(zhí)行代碼所必要的信息。幾乎每個(gè)在Windows系統(tǒng)中加載的可執(zhí)行代碼都使用PE文件格式,盡管也在一-些罕見的惡意代碼中,存在一些過時(shí)兼容性的文件格式。
鏈接庫與函數(shù)
導(dǎo)入函數(shù):是一個(gè)程序所使用的但存儲(chǔ)在另一個(gè)程序中的那些函數(shù)
靜態(tài)鏈接,運(yùn)行時(shí)鏈接與動(dòng)態(tài)鏈接
當(dāng)一個(gè)庫被靜態(tài)鏈接到可執(zhí)行程序時(shí),所有這個(gè)庫中的代碼都會(huì)被復(fù)制到可執(zhí)行程序中,這會(huì)讓可執(zhí)行程序增大許多。而在分析代碼時(shí),很難區(qū)分靜態(tài)鏈接的代碼與可執(zhí)行程序自身代碼,因?yàn)樵赑E文件頭中沒有跡象表明這個(gè)文件包含有鏈接代碼。
雖然運(yùn)行時(shí)鏈接在合法程序中并不流行,但是在惡意代碼中是常用的,特別是當(dāng)惡意代碼被加殼或是混淆的時(shí)候。使用運(yùn)行時(shí)鏈接的可執(zhí)行程序,只有當(dāng)需要使用函數(shù)時(shí),才鏈接到庫,而不是像動(dòng)態(tài)鏈接模式那樣在程序啟動(dòng)時(shí)就會(huì)鏈接。
一些Windows API允許程序員導(dǎo)入并沒有在程序的文件頭中列出的鏈接函數(shù)。
在所有鏈接方法中,動(dòng)態(tài)鏈接是最常見的,當(dāng)代碼庫被動(dòng)態(tài)鏈接時(shí),宿主操作系統(tǒng)會(huì)在程序被裝載時(shí)搜索所需的代碼庫,如果程序調(diào)用了被鏈接的庫函數(shù),這個(gè)函數(shù)會(huì)在代碼庫中執(zhí)行。
PE文件頭中存儲(chǔ)了每個(gè)將被裝載的庫文件,以及每個(gè)會(huì)被程序使用的函數(shù)信息。程序所使用的庫與調(diào)用的函數(shù),經(jīng)常是一 個(gè)程序中最重要的部分,識(shí)別它們尤為重要,因?yàn)檫@些信息允許我們來猜測(cè)這個(gè)惡意代碼樣本到底干了些什么事情。
使用DependencyWalker工具探索動(dòng)態(tài)鏈接函數(shù)
dependency.png
Dependency Walker工具,包含在微軟VisualStudio的一些版本與其他微軟開發(fā)包中,支持列出可執(zhí)行文件的動(dòng)態(tài)鏈接函數(shù)。
也可以直接使用IDA Pro。
下載地址
http://dependencywalker.com/
dllinfo.png
函數(shù)命名約定
當(dāng)評(píng)估- -些不熟悉的Windows函數(shù)時(shí),一些命名約定是非常值得注意的,因?yàn)槿绻悴涣私馑鼈儯鼈兙蜁?huì)經(jīng)常出現(xiàn)在你面前并造成混淆。例如,你經(jīng)常會(huì)遇到以Ex為后綴的函數(shù)名,如CreateWindowEx。當(dāng)微軟更新- -個(gè)函數(shù),而且新函數(shù)與原先函數(shù)不兼容的時(shí)候,微軟還會(huì)繼續(xù)支持原先的舊函數(shù)。這時(shí)新函數(shù)會(huì)給一個(gè)與舊函數(shù)相同的名字,并在后面加上Ex后綴。而被顯著更新過兩次的函數(shù),則會(huì)在它們的名字后面有兩個(gè)Ex后綴。以字符串作為參 數(shù)的許多函數(shù),在它們的名字后面會(huì)包含一個(gè)A或者一個(gè)W,如CreateDirectoryW。這個(gè)字母A或者W在這個(gè)函數(shù)的文檔中并沒有出現(xiàn)。它只是表明這個(gè)接受字符串參數(shù)的函數(shù)有著兩個(gè)不同的版本:以A結(jié)尾的輸入?yún)?shù)類型為ASCII字符串,而以W結(jié)尾的輸入?yún)?shù)為寬字符字符串。當(dāng)你在微軟的文檔中搜索這個(gè)函數(shù)時(shí),你需要記得丟掉后綴的A或者W。
導(dǎo)入函數(shù)
PE文件頭中也包含了可執(zhí)行文件使用的特定函數(shù)相關(guān)信息。Windows函數(shù)的這些名字,可以告訴你這個(gè)可執(zhí)行文件到底干了些什么事情。
導(dǎo)出函數(shù)
與導(dǎo)入函數(shù)類似,DLL和EXE的導(dǎo)出函數(shù),是用來與其他程序和代碼進(jìn)行交互時(shí)所使用的。通常,一個(gè)DLL會(huì)實(shí)現(xiàn)一 個(gè)或多個(gè)功能函數(shù),然后將它們導(dǎo)出,使得別的程序可以導(dǎo)入并使用這些函數(shù)。
PE文件中包含一 個(gè)文件中導(dǎo)出了哪些函數(shù)的信息。因?yàn)镈 LL文件本身就是實(shí)現(xiàn)一 些導(dǎo)出函數(shù)然后被EXE可執(zhí)行文件使用的,因此導(dǎo)出函數(shù)在DLL文件中是最常見的。而EXE文件并不是設(shè)計(jì)成為其他EXE文件提供功能的,因此里面很少會(huì)有導(dǎo)出函數(shù)。如果你在可執(zhí)行文件中發(fā)現(xiàn)了導(dǎo)出函數(shù),它們經(jīng)常會(huì)提供一 些有用的信息。
靜態(tài)分析技術(shù)實(shí)踐
PotentialKeylogger.exe:一個(gè)未加殼的可執(zhí)行文件
1-2.png
Kerne/32.dll導(dǎo)入函數(shù)告訴我們,這個(gè)軟件會(huì)打開和操作進(jìn)程(如OpenProcess、 GetCurrentProcess和GetProcessHeap等),以及對(duì)文件進(jìn)行操作(如ReadFile、CreateFile 和WriteFile)。
FindFirstFile和IFindNextFile函數(shù)是特別值得關(guān)注的,因?yàn)樗鼈兲峁┑墓δ苁撬阉饕?個(gè)目錄下的所有文件。
從User32.dll導(dǎo)入的函數(shù)甚至更加有趣,大量的圖形化界面操作函數(shù) (如 Register、ClassEx, SetWindowText和ShowWindow等)顯示這個(gè)程序很可能使用了一 個(gè)圖形化界面 (雖然GU I并不一定會(huì)顯示給用戶〉。
而SetWindowsHookEx函數(shù)是間諜軟件經(jīng)常使用的函數(shù),也是鍵盤記錄器用來接收鍵盤輸入最流行的方法。這個(gè)函數(shù)也會(huì)有著一 些合法使用的場(chǎng)景,但如果你分析的是個(gè)可疑的惡意代碼,而當(dāng)你看到了這個(gè)函數(shù)時(shí),你就很可能在查看一 個(gè)鍵盤記錄功能。
RegisterHotKey函數(shù)也很有趣。它注冊(cè)了一 個(gè)熱鍵 (如Ctrl+ Shift+P,這樣每當(dāng)用戶按下熱鍵組合后,便會(huì)通知應(yīng)用程序。無論當(dāng)前是哪個(gè)應(yīng)用程序處于活動(dòng)狀態(tài),熱鍵都會(huì)將用戶帶到注冊(cè)了熱鍵的應(yīng)用程序。
從GDI32.dll的導(dǎo)入函數(shù)是和圖形相關(guān)的,這只是再次確認(rèn)了這個(gè)程序擁有一 個(gè)圖形化界面。從Shell32.dll的導(dǎo)入函數(shù)告訴我們,這個(gè)程序可以啟動(dòng)其他程序一一這個(gè)功能對(duì)于惡意代碼和合法軟件都是普遍的功能。
從Advapi32.dll的導(dǎo)入函數(shù)則顯示,這個(gè)程序使用了注冊(cè)表,這又提示我們,我們應(yīng)該去搜索一些看起來像是注冊(cè)表鍵值的字符串。注冊(cè)表鍵值與文件目錄非常類似。在這種案例中,我們發(fā)現(xiàn)了一個(gè)字符串Software\Microsoft\Windows\CurrentVersion\Run,這是一 個(gè)惡意代碼非常普遍使用的注冊(cè)表鍵值,控制Windows啟動(dòng)時(shí)會(huì)自動(dòng)裝載哪些程序。
PackedProgram.exe: 窮途末路
加殼的惡意代碼的導(dǎo)入表通常比較少??梢允褂肞EID進(jìn)行查殼。
pp.png
PE文件頭與分節(jié)
PE文件格式包括一 個(gè)PE文件頭,隨后跟著一 系列的分節(jié)。文件頭中包含了有關(guān)文件本身的元數(shù)據(jù)。而頭部之后是文件的一 些實(shí)際部分,每個(gè)分節(jié)中都包含了有用的信息。
.text: . text節(jié)包含了CPU執(zhí)行指令。所有其他節(jié)存儲(chǔ)數(shù)據(jù)和支持性的信息。一般來說,這是唯一可以執(zhí)行的節(jié),也應(yīng)該是唯一包含代碼的節(jié)。
.rdata: . rdata節(jié)通常包含導(dǎo)入與導(dǎo)出函數(shù)信息,與Dependency Walker和PEview工具所在得的信息是相同的。這個(gè)節(jié)中還可以存儲(chǔ)程序所使用的其他只讀數(shù)據(jù).。有些文件中還會(huì)包含.idata和.edata節(jié),來存儲(chǔ)導(dǎo)入導(dǎo)出信息。
.data, . data節(jié)包含了程序的全局?jǐn)?shù)據(jù),可以從程序的任何地方訪問到。本地?cái)?shù)據(jù)并不存儲(chǔ)在這個(gè)節(jié)中,而是PE文件某個(gè)其他位置上。
.rsrc: . rsrc節(jié)包含由可執(zhí)行文件所使用的資源,而這些內(nèi)容并不是可執(zhí)行的,比如圖標(biāo)、圖片、菜單項(xiàng)和字符串等。字符串可以存儲(chǔ)在.rsrc節(jié)中,或在主程序里。在.rsrc節(jié)中經(jīng)常存儲(chǔ)的字符串是為了提供多語種支持的。
1-4.png
用PEview來分析PE文件
peview.png
下載地址
http://wjradburn.com/software/
PE文件格式在頭部中存儲(chǔ)了很多有趣的信息。我們可以使用PEview工具來瀏覽這些信息
PE頭中的前兩個(gè)部分IMAGE_DOS_HEADER和MS-DOS存根程序,是歷史遺留問題,對(duì)我們而言沒有提供任何值得關(guān)注的信息。
PE文件頭中的下一 部分,IMAGE_NT_HEADERS,顯示了N T文件頭。特征簽名始終是相同的,可以被直接忽略。
machine.png
Machine字段告訴我們程序運(yùn)行在什么平臺(tái)上。時(shí)間戳告訴我們這個(gè)可執(zhí)行文件是什么時(shí)候編譯的,這在惡意代碼分析與事件處理中會(huì)非常有用。例如,一個(gè)很老的編譯時(shí)間意味著古老的攻擊,反病毒軟件就可能包含這個(gè)惡意代碼的檢測(cè)特征,而一 個(gè)很新的編譯時(shí)間意味的情況則正好相反。
所有的Delphi程 序都使用統(tǒng)一 的編譯時(shí)間,都是1992年6月四日。如果你看到這個(gè)編譯時(shí)間,就可以確定很可能是在查看一個(gè)Delphi程序,但是不會(huì)知道它被編譯的確切時(shí)間。
Subsystem字段可以告訴我們這個(gè)程序是一個(gè)命令行程序還是一個(gè)GUI程序。
subsystem.png
Virtual Size虛擬大小告訴我們?cè)诩虞d的過程中需要分配多少空間給一個(gè)分節(jié)。Size of Raw Data原始大小顯示在磁盤上這個(gè)分節(jié)的大小規(guī)模。這兩個(gè)值一般是相等的,但是由于磁盤和內(nèi)存上的對(duì)齊規(guī)則存在差異,大小有一定差別也是正常的。
size.png
分節(jié)大小,在檢測(cè)加殼可執(zhí)行文件時(shí)非常有用。例如,若虛擬大小比原始數(shù)據(jù)大得多,你便知道這個(gè)節(jié)在內(nèi)存中占用了比磁盤上存儲(chǔ)更多的空間。這往往意味著加殼代碼的存在,特別是當(dāng). text分節(jié)在內(nèi)存中較磁盤上更大- - 些時(shí)。道這個(gè)節(jié)在內(nèi)存中占用了比磁盤上存儲(chǔ)更多的空間。這往往意味著加殼代碼的存在,特別是當(dāng). text分節(jié)在內(nèi)存中較磁盤上更大一些時(shí)。
1-5.png
1-6是一個(gè)加殼的程序,.text段的原始數(shù)據(jù)大小是0,但是虛擬大小不是0,說明它有可能是一個(gè)加殼的程序,脫殼存根會(huì)將代碼脫殼到內(nèi)存的.text段中。
1-6.png
使用ResourceHacker工具來查看資源節(jié)
你可以使用免費(fèi)的ResourceHacker工具來瀏覽.rsrc節(jié)。當(dāng)你單擊ResourceHacker工具中分析獲得的條目時(shí),你就會(huì)看到字符串、圖標(biāo)和菜單,而顯示的菜單項(xiàng)和程序所使用的是一致的。
下載地址
http//:www.angusj.com
惡意代碼,偶爾一些合法軟件 ,經(jīng)常會(huì)把一個(gè)嵌入的程序或者驅(qū)動(dòng)放在資源節(jié)中,在程序運(yùn)行之前,它們會(huì)將嵌入可執(zhí)行文件或驅(qū)動(dòng)提取出來,Resource Hacker可以幫助你提取這些文件來進(jìn)行基礎(chǔ)分析。
res.png
Dialog文件會(huì)顯示可執(zhí)行文件的界面。
res2.png
使用其他的PE文件工具
除了上面介紹的一 些工具之外,還存在著很多可以用來瀏覽PE文件頭的其他工具。其中兩個(gè)最有用的是PEBrowse Professional和PE Explorer.
PEBrowse Professional 與PE view類似。它允許你查看每個(gè)分節(jié)中的字節(jié),并顯示出解析后的數(shù)據(jù)。PEBrowse Professional在呈現(xiàn)從資源節(jié)(.rsrc)獲取的信息上做得更好
PE Explorer 有著一個(gè)功能豐富的圖形用戶界面,讓你可以方便地瀏覽PE文件的各個(gè)部分。你還可以編輯PE文件的特定部分,它所包含的資源編輯器對(duì)于瀏覽和編輯文件資源來說是非常棒的。然而這個(gè)工具的主要缺點(diǎn)是一一 它不是免費(fèi)的。
52pojie:
https://down.52pojie.cn/Tools/PEtools/PE文件頭概述
PE文件頭包含了對(duì)惡意代碼分析師有用的信息,下面是可以從PE文件頭中獲取的關(guān)鍵信息。
peheader.png