惡意軟件分析和逆向工程工作流
寫在前面:惡意軟件分析和逆向是一項非常專業的工作,要求極高的技巧和耐心,有一種順藤摸瓜,抽絲剝繭的感覺。
2022年7月6日
我注意到有很多關于惡意軟件分析和逆向工程過程的資料。然而,它們并沒有真正覆蓋某人從頭到尾的工作流程。本指南將概述我的日常做法。
前提
- 確保您已經完成了惡意軟件實驗室的設置(作者有自己定制的惡意軟件實驗室,請參看原文)
- 這個指南并不是指每個人都要這樣做,每個人都可改進自己的工作流程,適合他們持續工作。
方法
當處理惡意軟件時,最好有一個方法來指導你的操作。如果沒有一個整體的方法,你的工作就會陷入平淡,因為你沒有目標。這是一個很酷的新興領域,可以讓你的公司看起來很棒,但與此同時,逆向工程非常耗時和昂貴。如果沒有對整體的方向給予額外的關注,你可能會變得非常無效。那些不了解惡意軟件分析和逆向工程所帶來的技術挑戰的人們認為,你可以在幾個小時內給他們發送一份完整的惡意軟件樣本的逆向報告。我們有責任教育他們事實并非如此,因為事情往往比表面看起來要復雜得多。根據惡意軟件樣本的復雜性,可能需要幾分鐘、幾小時、幾天、幾個月、幾年,這真的要看情況!
根據你工作的地方,他們通常會采用不同的方法來制定這個過程的策略。因此,當本指南中描述的方法與其他地方不同時,不要感到驚訝。
目的和輸出
在執行這樣的分析時,您可以有許多目的:
- 檢測簽名
- 惡意軟件配置提取器(智能)
- 自動解壓包
- 跟蹤威脅行為者
- 編寫技術報告
當然,這種工作還有其他潛在的目的,然而,這些是大多數的情況。
行為
當分析惡意軟件時,關注其行為是很重要的。這告訴我們,一旦惡意軟件進入目標環境,我們可以預料它執行哪些操作。
端點
在端點上的行為包括但不限于以下屬性:
- 創建進程
- 生成和刪除文件
- 注冊表鍵值
- DNS
- TCP通信
- 代碼注入
網絡
盡管在端點部分中有一些內容關于網絡,但這一節是關于完整包檢查的。這是惡意軟件通信的方式,不僅僅是與某個域或IP地址通信,還包括通信的內容及其行為方式。
檢測
我引以為豪的一件事就是能寫出有意義的檢測。想象一下,因為你感覺不舒服而去看醫生。如果醫生給你檢查,只是確認你生病了,或者給你一個模糊的診斷,沒有更多的細節,這就會造成糟糕的客戶體驗。在網絡安全行業,我們可以將這種體驗歸因于VirusTotal防病毒檢測名稱。當我編寫檢測時,我創建了啟發式簽名和分類簽名。這確保了我們可以在更大范圍內捕捉到更多惡意軟件,但也可以捕捉到我們已經知道的惡意軟件,并將診斷提供給人們。
在執行這種檢測方法時,我將重點放在工具,技術、戰術和過程(TTP)上。下面所示的痛苦金字塔是一個很好的參考圖。

對于像IP地址哈希值、域名和網絡/主機這樣的情報是很重要的。然而,這并不太取決于檢測,它更多地在于一級SOC分析師驗證觀察到的行為,以及跟蹤威脅行為者基礎設施。
流程
當我們進行惡意軟件分析和逆向工程時,重要的是要有一個流程來保持你的工作有條理。如果沒有一個完整的流程,就很容易迷失或不得不重做已經完成的工作。
同樣重要的是,我們認識到我們流程的時間復雜性。如果我們在金字塔的第一階段就合理地實現了目標,那么你必須證明繼續往上金字塔的花費是合理的。

時間復雜度
時間就是金錢,逆向工程代碼需要很長時間,但可以帶來額外的好處。同樣,如果沒有明確的方法和方向,你可能會浪費大量的時間和金錢。
概述
下圖概述了我所遵循的一般流程:

惡意軟件分析
惡意軟件分析是一個對初始階段進行分類的過程,以確保我們對稍后將用于逆向工程的樣本有一個高水平的概述。這為我們節省了時間,因為它提供了可靠的情況說明。
識別文件類型
我們需要確定我們正在處理的文件的類型,因為它將幫助我們確定今后將使用的工具。
推薦工具
- Detect it Easy
- Linux file 命令
- Binwalk Sudo apt install -y binwalk
分析
惡意軟件分析階段對我來說描述了我們開始調查惡意意圖的過程的一部分。這個過程包括使用靜態和動態技術分析樣本。然而,它是逆向工程前期的準備工作。
靜態
在執行靜態分析之前,我們必須能夠理解它的含義。
靜態程序分析是在不執行任何程序的情況下對計算機軟件進行的分析,與此相反,動態分析是在程序執行期間對其進行的分析。—https://en.wikipedia.org/wiki/Static_program_analysis
這意味著我們在不執行樣本的情況下執行分析。
推薦工具
- PEStudio
- PEBear
- Detect it Easy
- 7zip
- YARA
- VirusTotal
- MalwareBazaar
我們正在尋找清楚表明惡意意圖的指標。
動態
在我們進行動態分析之前,我們必須能夠首先理解它的含義。
動態程序分析是通過在真實或虛擬處理器上執行程序來對計算機軟件進行分析。為了使動態程序分析有效,目標程序必須用足夠的測試輸入來執行,以覆蓋幾乎所有可能的輸出。https://en.wikipedia.org/wiki/Dynamic_program_analysis
我喜歡做兩種動態分析,第一種是自動動態分析。
對于自動化動態分析,我將把我擁有的樣本提交給一個沙盒服務或我自己的沙盒系統。讓我們首先通過下面的定義從高層次上理解什么是沙箱。
沙箱用于在將代碼或應用程序提供給關鍵設備之前測試可能是惡意的代碼或應用程序。在網絡安全領域,沙盒被用作測試軟件的一種方法,這些軟件在測試后會被歸類為“安全”或“不安全”。——Malware Bytes
既然我們已經理解了沙箱的含義,我推薦以下資源。
- AnyRun
- HybridAnalysis
- Cape Sandbox
- Triage
- Joe Sandbox
一旦您在沙箱中執行了這個示例,您將希望尋找惡意的意圖。
另一種動態分析是在您自己的實驗室機器上手動執行。要監視活動,您可以使用Wireshark之類的工具來監視網絡,Procmon之類的工具來監視端點行為。這種類型的動態分析可以通過在網絡上響應惡意軟件來操縱惡意軟件,或者將文件或其他軟件放置在需要它們的地方以支持進一步的執行。
惡意動機
在我們完成靜態和動態惡意軟件分析后,我們需要指出樣本是否具有惡意意圖。如果我們確定它有惡意,我們就需要對任務做出一些決定。
- 請參閱目的和輸出部分并完成所需內容
- 如果需要,逐步升級到逆向工程
惡意動機的其他參考。
- Mire
- LOLBAS
根據你的工作范圍、標準操作程序和總體策略,你將需要決定是否完成這些任務。
注意:不是總有必要升級為逆向工程,它再次取決于您收到的工作范圍和惡意軟件的復雜性以及您需要的結果。所以這個過程可以完全到此為止!
逆向工程
逆向工程可以定義如下。
“逆向工程是一種過程或方法,通過它,人們試圖通過演繹推理來理解之前制造的設備、過程、系統或軟件是如何完成任務的,但卻很少了解它究竟是如何完成任務的。——https://en.wikipedia.org/wiki/Reverse_engineering”
分類檢查
這種分類與惡意軟件分析的分類非常不同。逆向工程分類的目標是使用這些信息來幫助您識別惡意二進制文件中的關鍵興趣區域。例如,如果惡意軟件分析分類說明表明惡意軟件使用ws2_32.dll進行通信,我們可以在二進制文件中查看這些API調用的交叉調用。
一旦我們確定了我們想要完成的任務,我們就可以進入下一步。
逆向
在這個階段,我們開始對惡意軟件進行逆向工程,通常我們會使用Ghidra、IDA Pro和DNSpy等工具來反編譯二進制文件。
我們將使用這些反編譯器來創建偽代碼。
在計算機科學中,偽代碼是一個算法或另一個系統中步驟的簡單語言描述。偽代碼通常使用普通編程語言的結構約定,但其目的是供人類閱讀而不是機器閱讀。
這段代碼是原始代碼的近似值。
我們有責任清理這些偽代碼,使其更易于我們人類閱讀。
這是一個完整的過程,我們不會在本工作流程指南中介紹這些具體的原則。我們將在逆向工程指南中介紹這個內容。
完成后,請參考目的和輸出部分并完成所需內容。
提示和技巧
這里有一些基本的建議和技巧可以幫助你在這個過程中保持條理。
標準化分析文件夾結構
當我開始一個這樣的新任務時,我會創建一個包含以下結構的文件夾。
- Docs -一個文件夾,包含從公開文章到自己的筆記的文檔
- Pcaps -抓包文件
- 樣本-分析的樣本,可能包括多個階段
- 腳本-幫助我自動化流程的腳本
- 項目-包含Ghidra, IDA等項目文件
有了這個文件夾結構,我就能知道我在哪里,我要去哪里。
標準化反編譯器代碼樣式
當我在Ghidra或IDA Pro中工作時,標準化偽代碼中函數和變量的命名是很重要的。我個人認為這與操作系統的編程指南的標準是一致的。這確保了文檔和樣式指南易于訪問和被每個人理解。
注解
當使用Ghidra, IDA Pro或任何其他工具,允許您作出注解。這會讓你有條理,讓你知道自己在哪里。如果你正在使用的軟件有記錄筆記的功能,那就好好利用它。
記筆記
當我完成這些過程時,我會做筆記,通常是用筆記的形式來讓自己有條理。可以使用許多不同的工具來實現這一點。不過,我現在用的是Obsidian,因為它有很多不同的功能。
結論
當你第一次開始工作時,即使是開始理解某人的工作流程從頭到尾都可能是一項令人生畏的任務。希望本指南能幫助您創建自己的工作流程,這對你來說很有意義。