如何使用Python指令碼分析惡意軟體
一般來說,大多數安全防禦的底層,都是各種經過程式設計的指令碼,且這些指令碼可以適用於多個安全防禦策略和軟體。而且編寫指令碼可以幫助安防人員將一些檢測任務自動化,將瑣碎的分析擴充套件到大量資料的分析,增加工作效率。
Python作為目前比較流行的一個種程式設計語言,已被用於很多防毒模組中,所以有很多人希望提高Python的程式設計技能,以實現對防毒軟體的改造和自定義。
雖然有多種程式語言(Perl, Ruby, Scheme,或 Java)可供選擇,但Python之所以最受歡迎的,原因之一,是它具有跨平臺的屬性,並且相對容易讀寫和編寫。許多現有的開源安全工具也是用Python編寫的,因此學習這種語言可以幫助你更好的理解現有功能。
本文就介紹了Python程式設計如何用於實現可執行檔案(PE)的分析,比如,指令碼可以使你快速解析單個檔案並提取其關鍵特徵,或者在多個檔案之間進行活動,以幫助確定它們執行的優先順序。
請注意,這篇文章假定讀者已經對Python和程式設計概念有了一些基本的瞭解。
Python已經被大量用於分析惡意軟體的工具中
有了一些基本的程式設計技能,就可以通過簡單的檢查現有程式碼,根據需要進行修改,就可以提高你對Python的瞭解。雖然在某些情況下簡單的調整程式碼可能會產生預期的結果,但很多人可能會從對該語言更正式的介紹中獲益。其實你上網就可以下載到許多免費提供Python教程,在此,我想你推薦 ofollow,noindex">Code Academy 。如果你希望獲得更嚴格的Python學習體驗,可以參加某些相關課程。
現有工具
目前市面上有許多基於Python的惡意軟體分析工具,下面是一些我認為有助於靜態檔案分析的工具:
1. pyew :Pyew是一款非常著名的命令列惡意軟體分析工具,通常被用於深度程式碼分析或修改檔案。支援PE、ELF、OLE2、PDF等格式,並且支援自定義外掛新增更多的功能;
2. AnalyzePE :用於報告Windows PE檔案的各種工具;
3. pescanner ;
4. peframe :PEframe是一個開源工具,用於對可移植可執行檔案惡意軟體和通用可疑檔案執行靜態分析。它可以幫助惡意軟體研究人員檢測打包程式,xor,數字簽名,互斥鎖,反除錯,反虛擬機器,可疑部分和函式以及有關可疑檔案的更多資訊;
5. pecheck :負責分析PE檔案資訊,使用方法也很簡單,就是拖入PE檔案,就可以對檔案的PE結構進行解析;
這些工具可以產生有用的輸出內容,是理解Python的絕佳開始。通過簡單的檢視原始碼並根據需要進行研究,你可以瞭解開發者編寫的內容並修改程式碼以滿足自己的目的。但是,當你的自定義需求增多或分析更深入時,你可能會遇到現有工具無法滿足你的情況,此時你必須開發新的解決方案。請放心,這些解決方案並不要求你從頭開始編寫程式碼。相反,你可以依賴現有的Python庫,來提取那些符合你需求和操作的程式碼。
目前比較常用且流行的python PE庫是 pefile ,python的PE庫是用來專門解析PE檔案的,可靜態分析PE檔案,且其中的模組可以輕鬆訪問可執行檔案的結構。另一個則是 library庫 ,它出現的時間不是很長,但卻有著更加通用的跨平臺庫,能測試可執行格式(LIEF),library庫包括用於PE檔案分析的Python模組。
本文將重點介紹如何使用Python 2和pefile進行檔案分析。請注意,pefile是一個第三方模組庫,而不是標準Python安裝的內建模組。因此,你必須先使用pip安裝,如pip install 。
探索pefile
由於我的測試環境中執行的是Linux發行版,因此我將使用 REMnux 工具進行分析。REMnux是一個用於輔助逆向分析人員完成逆向分析任務的免費虛擬機器映象。其中包含了大量的逆向分析工具,可分析基於Web的惡意軟體,如惡意的JavaScript,Java程式,和Flash檔案。它也有工具可以分析惡意文件,如微軟的Office和Adobe PDF檔案,還有通過記憶體取證逆向病毒的實用工具。
我首先啟動Python互動式shell來探索pefile模組並編寫一些初始程式碼。互動式shell不是用來直接建立指令碼的,而是學習可用模組和執行快速測試的好方法。比如,你只需在終端輸入python,就將看到類似於以下內容的提示。
匯入pefile後,就可以利用互動式shell的功能了。
讓我們通過檢視其幫助資訊來看看此模組的具體內容,輸入help(pefile),就可以看到以下內容了。
除了對模組的介紹之外,我還看到了模組中包含了對類的描述,滑鼠向下滾動,就可以看到有關每個類的詳細資訊。不夠,本文我只關注PE類的資訊。
通過對PE類的詳細介紹,我知道了這個類將使我們能夠訪問PE檔案的結構,而這正是分析Windows檔案所需要的。說明裡還詳細說明了如何建立PE類,按照其中所列舉的樣本,我對其中的一個檔案進行讀取以及測試。本文,我將使用一個關於銀行木馬emotet的樣本。
我可以返回幫助選單來閱讀有關PE類的方法和屬性的更多資訊,或者通過輸入dir(pefile.PE)來檢視此資訊的摘要。
雖然其中有很多文字,不過大部分可能都不是基於之前分析過的PE檔案而生成的。不過,裡面的一些基本方法,我還是要認識一下的。我看到很多以“get_”開頭的方法,這些方法有助於收集有關檔案的一些基本靜態資訊。例如,et_impash()返回匯入地址表(IAT)的MD5雜湊。
get_imphash()方法按照預期工作,提供檔案的匯入表雜湊。
另一個我認為有價值的“get_”函式是get_warnings(),當pefile解析Windows可執行檔案時,可能會遇到錯誤。而 get_warnings()函式的作用就是返回在處理PE檔案時生成的警告列表。由於安全性分析都是關於調查異常情況的,因此這個返回資訊可以揭示有用的資訊,以供進一步審查使用。例如,即使特定packer不能通過尋找packer簽名的常用工具(例如,ExeInfo或PEid)來識別,該函式的輸出也可以表明檔案被混淆。但是,在這種特殊情況下,執行函式並不會出現錯誤。
現在,讓我接著使用pefile提取在初始惡意軟體分析期間經常審查的其他靜態資訊。例如,如何使用pefile來分析這個可執行檔案匯入的DLL和函式?要回答這個問題,就必須再次使用內建的help()系統進行一些試驗,此方法可以適用於任何正常的Python模組。
首先,我可以通過了解更多有關PE的內容來檢測我以前的選擇,比如我可以輸入help(pefile.PE)並瞭解其中的內容。
可以看到對許多“DIRECTORY_ENTRY_”屬性的引用,這些屬性指向的是關鍵檔案元件的位置。由於我對匯入的內容感興趣,因此我將重點關注DIRECTORY_ENTRY_IMPORT,它被描述為ImportDescData樣本的列表。讓我先從遍歷此列表開始,看看它提供了哪些資訊。
正如幫助資訊裡所描述的一樣,我看到了ImportDescData物件的列表。這些物件代表什麼?為此,我還要再次返回幫助一欄並輸入help(pefile.ImportDescData)。
如上所示,此結構包含DLL的名稱和匯入的符號列表。這看起來像是我所需要的資訊,不過我再次確認一次。
雖然不是我所需要的資訊,但我卻找到了一個新的可供調查的結構,於是我試著輸入help(pefile.ImportData):
現在,我只關注名稱的匯入,因此name屬性應該包含我需要的資訊。我會將該資訊轉化成程式碼的形式,使其更具可讀性。
不出所料,此程式碼為我提供了一個匯入DLL的名稱及其對應的匯入函式名稱。
指令碼的自動化執行
如開頭所述,讓指令碼實現自動執行,可以使使用者同時對大量的資料進行分析。上面所舉的例子,都是針對單個檔案進行分析的,但日常工作中,安防人員在進行惡意軟體分析時,可能需要同時篩選數百或數千個檔案,然後再選擇其中一個檔案進行仔細稽核。而在這樣的分析環境中,指令碼的自動化執行,就可以讓你從所有檔案中提取關鍵資訊,以實現對樣本的分組和優先順序排序,以便進行更有效的分析。
在此,我要特別提一下ImpHash檢測法,它可以幫助你發現匯入雜湊表中的重複項。比如,在分析大量樣本時,通過imphash進行分組可以更容易的識別類似的屬性或用於生成二進位制檔案的通用packer/packaging工具。為了探索這個想法,我編寫了一個小指令碼(當然是用Pyton編寫的),以試圖從檔案目錄中提取imphash。該指令碼應完成的任務如下:
1.建立目錄(完整路徑)中所有檔案的列表;
2.開啟一個可以編寫的XLSX檔案(雖然,我經常使用Excel進行檢視或排序,但更好的辦法是將此資訊寫入資料庫);
3.計算並寫入每個檔案的sha256雜湊並插入到XLSX檔案中;
4.自動篩選資料;
下面是實現這些任務的一種程式碼編寫方式:
#~/usr/bin/env python import sys,os import pefile import hashlib import xlsxwriter if __name__ == "__main__": #Identify specified folder with suspect files dir_path = sys.argv[1] #Create a list of files with full path file_list = [] for folder, subfolder, files in os.walk(dir_path): for f in files: full_path = os.path.join(folder, f) file_list.append(full_path) #Open XLSX file for writing file_name = "pefull_output.xlsx" workbook = xlsxwriter.Workbook(file_name) bold = workbook.add_format({'bold':True}) worksheet = workbook.add_worksheet() #Write column headings row = 0 worksheet.write('A1', 'SHA256', bold) worksheet.write('B1', 'Imphash', bold) row += 1 #Iterate through file_list to calculate imphash and sha256 file hash for item in file_list: #Get sha256 fh = open(item, "rb") data = fh.read() fh.close()<spandata-mce-type="bookmark"id="mce_SELREST_start"data-mce-style="overflow:hidden;line-height:0"style="overflow:hidden;line-height:0"></span> sha256 = hashlib.sha256(data).hexdigest() #Get import table hash pe = pefile.PE(item) ihash = pe.get_imphash() #Write hashes to doc worksheet.write(row, 0, sha256) worksheet.write(row, 1, ihash) row += 1 #Autofilter the xlsx file for easy viewing/sorting worksheet.autofilter(0, 0, row, 2) workbook.close()
我將上面的指令碼命名為pe_stats.py,並使用命令python pe_stats.py suspect_files在名為“suspect_files”的目錄中執行它。為了補充目標的目錄表,我專門從VT下載了100個惡意檔案。具體來說,我使用了基本的VTI查詢“type:peexe positive:50+”。當我在Microsoft Excel中開啟時,呈現的資料結果如下所示。
快速瀏覽前幾行時,ImpHas模式就會發揮作用,匯入表中的重複項。這就方便了我下一步對大量的雜湊叢集進行統一分析,以瞭解為什麼這些檔案組具有相同的雜湊值。另外,我還可以重複訪問pefile庫的文件,以分析包含在此電子表格中的其他靜態特性。 通過更詳細的資訊,我編寫的指令碼就可以幫助你對要分析的樣本進行分類和優先順序分析。
總結
這篇文章提供了一種使用Python指令碼分析PE檔案的思路。 最重要的是,本文介紹瞭如何使用內建的Python幫助功能和PE檔案的一些基本知識來系統的探索惡意檔案的屬性。
如果你想了解有關惡意軟體分析策略的更多資訊,請加入我即將推出的SANS FOR610課程。