Reverse Engineering to Get the Python Malware Source Code via DFIR Memory Dump

  liuyuancheng        2025-04-12 00:21:09       1,507        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

title17.png

在網絡安全的領域中,理解如何剖析和分析惡意軟件和惡意程式碼是一項至關重要的技能,尤其是在數位鑑識與事件回應(Digital Forensics and Incident Response,DFIR)操作期間。一種常見的情況是遇到用 Python 編寫但編譯成 Windows 可執行(EXE)檔案的惡意可執行檔。在這種情況下,分析師通常依賴記憶體傾印來檢索和逆向工程惡意軟件的行為和底層程式碼。本文將介紹從 Windows 記憶體傾印資料中提取已編譯的 Windows 惡意軟件 exe 檔案(由 Python 編碼)的詳細步驟,然後反編譯資料以取得 Python 原始程式碼。(如下面的專案工作流程圖所示)

本指南分為五個主要部分:

  1. 惡意軟件建立:建立一個基於 Python 的惡意軟件模擬 Windows-OS 可執行程式。

  2. 受害者配置:配置惡意軟件受害者節點系統以進行記憶體傾印資料收集。

  3. 證據收集:在惡意軟件執行期間捕獲記憶體傾印。

  4. 資料提取:從記憶體傾印中提取惡意軟件資料/檔案。

  5. 逆向工程:將提取的資料反編譯回可讀的 Python 原始程式碼。

我們還將介紹完成每個部分所使用的相關工具,因此,如果您是 DFIR 藍隊從業人員或網絡安全愛好者,您也可以將它們用於記憶體鑑識和 Python 惡意軟件分析。

# Author:      Yuancheng Liu
# Created:     2025/04/06
# version:     v_0.0.1
# Copyright:   Copyright (c) 2025 LiuYuancheng
# License:     MIT License

簡介

數位鑑識與事件回應(DFIR)是現代網絡安全的基石,在識別、調查和減輕網絡攻擊方面發揮著關鍵作用。在 DFIR 中,記憶體鑑識已成為一項重要的技術,使分析師能夠從系統記憶體中提取揮發性證據,這些證據可能不存在於磁碟或網絡流量中。如下面的 DFIR 內容圖所示。

s_02.jpg

Figure-01 數位鑑識與事件回應(DFIR)領域概述圖,版本 v_0.0.1 (2025)

在深入了解實際操作步驟之前,我們提供有關 DFIR 的基本背景知識,並介紹本專案中使用的工具。本文屬於 DFIR記憶體鑑識領域,重點介紹網絡演習和培訓活動中常用的實際逆向工程場景。具體來說,我們演示瞭如何僅使用執行期間捕獲的記憶體傾印,提取和恢復已編譯為 Windows 可執行檔的基於 Python 的惡意軟件樣本的原始程式碼。

關於 DFIR 的背景知識

數位鑑識與事件回應(DFIR是一種網絡安全學科,致力於理解、回應和從安全事件中恢復。它包括兩個主要領域:

  • 數位鑑識:涉及分析系統資料、使用者行為和數位證據,以揭示攻擊是如何發生的以及誰可能負責。

  • 事件回應:包括組織遵循的策略和流程,以即時檢測、遏制和修復威脅。

數位鑑識分為多個領域,包括檔案系統鑑識、網絡鑑識、日誌分析和記憶體鑑識,這是本文的核心重點。

參考連結:https://www.crowdstrike.com/en-us/cybersecurity-101/exposure-management/digital-forensics-and-incident-response-dfir/#:~:text=Digital%20forensics%20and%20incident%20response%20(DFIR)%20is%20a%20field%20within,investigation%2C%20and%20remediation%20of%20cyberattacks

本專案中使用的工具

本專案在不同的環境中使用多種工具:

  • PyInstallerWindows):用於將 Python 腳本編譯為獨立的 Windows 可執行檔案。

  • Volatility3Ubuntu):一個強大的記憶體鑑識框架,此處用於分析記憶體傾印並提取與惡意軟件相關的資料。

  • uncompyle6Ubuntu/Windows):一種反編譯工具,可將 Python 位元組碼(.pyc 檔案)轉換回可讀的原始程式碼。

我們使用 Windows-11 機器生成惡意軟件 EXE,使用 Windows-10 虛擬機器執行和捕獲記憶體傾印,並使用 Ubuntu-22.04 機器執行分析和逆向工程。

有了這個基礎,我們現在將逐步完成該過程的每個步驟,從編譯惡意軟件到從記憶體中恢復其原始程式碼。


建立基於 PythonWindows 可執行檔

作為此 DFIR 記憶體鑑識練習的一部分,我們需要模擬惡意軟件在目標受害者系統上運行的行為。為此,我們將使用 PyInstaller(一種將 Python 程式編譯為獨立可執行檔的工具)從基於 Python 的惡意軟件腳本建立 Windows-OS 可執行檔。

在本節中,我們將為模擬的後門木馬惡意軟件樣本生成一個 .exe 檔案,該樣本來源於以下 GitHub 儲存庫:https://github.com/LiuYuancheng/Python_Malwares_Repo/tree/main/src/backdoorTrojan

步驟 1:安裝 PyInstaller

使用 pip 在主機 Windows 11 機器上安裝 PyInstaller

pip install -U pyinstaller

步驟 2:將 Python 腳本編譯為可執行檔

導航到包含 backdoorTrojan.py 的目錄,然後運行以下命令以使用 --onefile 標誌生成單個可執行檔案:

pyinstaller --onefile .\backdoorTrojan.py

該過程完成後,編譯的可執行檔 backdoorTrojan.exe 將位於 dist 資料夾中,如下所示:

s_03.jpg

Figure-02 Python 惡意程式碼編譯,版本 v_0.0.1 (2025)

然後,我們將輸出檔案重新命名為軟件安裝程式(例如,testInstaller.exe),並將其複製到將收集記憶體傾印的目標虛擬機器。


配置 Windows 以進行記憶體傾印收集

目標機器:Windows 10

工具:不適用(內建 Windows 設定和登錄編輯程式)

記憶體傾印捕獲系統 RAM 的內容並將其儲存到磁碟,本質上是建立給定時間在記憶體中運行的所有內容的快照。雖然記憶體傾印通常在系統崩潰期間自動生成,但也可以對其進行配置以協助鑑識分析,例如在 DFIR 練習期間。

Windows 10 虛擬機器上收集記憶體傾印之前,請確保有足夠的可用磁碟空間。記憶體傾印的大小大致與分配給 VMRAM 量相符。例如,如果您的 VM 有 16 GBRAM,請確保至少有 16 GB 的可用磁碟空間。

步驟 1:啟用 Windows 記憶體傾印設定

要配置 Windows 以生成記憶體傾印:

  1. 開啟控制台 > 系統及安全性 > 系統

  2. 在側邊欄中點擊進階系統設定

  3. 進階標籤下,轉到啟動和修復部分,然後點擊設定

  4. 確保在寫入偵錯資訊下選擇核心記憶體傾印完整記憶體傾印

  5. 點擊確定並重新啟動機器以套用變更。

如下所示:

s_0410.png

Figure-03 啟用 Windows_OS 系統故障記憶體傾印設定,版本 v_0.0.1 (2025)

步驟 2:透過登錄編輯程式啟用記憶體傾印參數

按下 Win + R,輸入 regedit,然後按 Enter 鍵以開啟登錄編輯程式

s_059.png

Figure-04 啟動登錄編輯程式,版本 v_0.0.1 (2025)

為確保始終保留記憶體傾印,請按如下所示修改 Windows 登錄:

  1. 導航至以下金鑰:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl

  2. 右鍵點擊 CrashControl,選擇新增 > DWORD (32 位元) 值

  3. 將新條目命名為 NMICrashDump 並將其值設定為 1,方法是:右鍵點擊 NMICrashDump > 選擇修改 > 在數值資料欄位中輸入 1 並點擊確定

  4. 確保 AlwaysKeepMemoryDump 金鑰也設定為 1。(如下所示)

s_0611.png

Figure-05 在登錄編輯程式中設定 CrashControl 配置,版本 v_0.0.1 (2025)

這些設定可確保即使在系統重新啟動後,記憶體傾印檔案也會保留,使其可用於以後使用鑑識工具進行分析。

參考:https://learn.microsoft.com/en-us/troubleshoot/windows-client/performance/generate-a-kernel-or-complete-crash-dump


收集記憶體傾印檔案

目標機器:Windows 10

工具:不適用(使用內建系統行為)

系統正確配置為生成記憶體傾印後,我們可以繼續運行惡意軟件並觸發記憶體傾印以進行鑑識分析。

首先在目標 Windows 10 虛擬機器上執行模擬的惡意軟件(testInstaller.exe)。程式運行時,我們將手動觸發系統崩潰(也稱為 「藍屏」核心崩潰),以強制作業系統生成記憶體傾印檔案。

步驟 1:透過鍵盤快捷鍵觸發記憶體傾印

要啟動崩潰和傾印過程:

  1. 按住 Ctrl 鍵。

  2. 兩次按下 Scroll Lock 鍵。

⚠️ 注意:在某些鍵盤上,尤其是在筆記型電腦上,您可能需要按下 Fn(功能)鍵才能存取 Scroll Lock

鍵盤快捷鍵:Ctrl + Scroll Lock + Scroll Lock

此組合模擬了不可遮罩中斷(NMI),這會導致系統崩潰並生成記憶體傾印檔案,如上一步中所配置的那樣。

步驟 2:確認已建立記憶體傾印檔案

觸發後,系統將崩潰並顯示藍屏(BSOD),並顯示一個進度指示器,顯示記憶體正在傾印到磁碟,如下所示:

s_0710.png

Figure-06 系統故障螢幕截圖,版本 v_0.0.1 (2025)

等到傾印過程達到 100% 並且系統自動重新啟動。不要中斷該過程。重新啟動後,導航到 C:\dump 目錄(基於您在上一個部分中設定的配置)。您現在應該看到生成的記憶體傾印檔案(例如,test.dmp),如下所示:

s_089.png

Figure-07 Windows 系統記憶體傾印檔案,版本 v_0.0.1 (2025)

參考:https://techcommunity.microsoft.com/blog/coreinfrastructureandsecurityblog/how-to-force-a-diagnostic-memory-dump-when-a-computer-hangs/257809


剖析記憶體傾印以提取已執行的惡意軟件資料

主機:Ubuntu 22.04

工具volatility3https://github.com/volatilityfoundation/volatility3

現在有了記憶體傾印檔案(test.dmp),下一步是使用強大的記憶體鑑識框架 Volatility3 對其進行分析。我們的目標是識別惡意軟件進程並提取其相關的記憶體資料以進行進一步分析。

步驟 1:安裝 Volatility3

使用 pip 在您的 Ubuntu 機器上安裝 Volatility3

pip install volatility3

步驟 2:識別惡意軟件進程

安裝完成後,使用 vol 命令列出記憶體傾印中的所有運行進程:

vol -f test.dmp windows.pslist

此命令輸出在傾印時捕獲的活動進程清單。尋找您的惡意軟件可執行檔的名稱(在本例中為 testInstaller.exe)以識別其進程 IDPID),如下所示:

s_096.png

Figure-08 使用 volatility3 從記憶體傾印中取得進程嘗試,版本 v_0.0.1 (2025)

在上面的進程樹範例中,由於我們將後門木馬重新命名為 testInstaller,因此我們可以看到兩個相關的進程:

  • PID 3968

  • PID 8276

由於進程 8276 的父進程 IDPPID)為 3968,因此我們可以推斷 3968 是啟動惡意軟件的初始進程。

步驟 3:提取惡意軟件記憶體區段

現在我們已經識別出正確的進程(PID 3968),我們可以使用 Volatility3dumpfiles 外掛程式將其記憶體資料提取到檔案中:

vol -f test.dmp -o output  windows.dumpfiles --pid 3968

與所選進程相關的記憶體區域將提取到 output/ 目錄中。在提取的檔案中,找到一個類似於 file.0xd084eb19a620.0xd084eb13d150.DataSectionObject.testInstaller.exe.dat 的檔案,如下所示:

s_106.png

Figure-08 使用 volatility3 從記憶體傾印中提取程式資料,版本 v_0.0.1 (2025)

此檔案包含可執行檔的記憶體中表示形式,這是我們在下一步中用於恢復原始 Python 原始程式碼的關鍵資料。


將惡意軟件資料反編譯回原始程式碼

主機Ubuntu 20.04Windows

工具

從記憶體傾印中提取可執行記憶體資料後,下一步是將二進位檔案逆向工程回 Python 原始程式碼。

步驟 1:使用 pyinstxtractor 提取 .pyc 檔案

首先從其 GitHub 儲存庫下載 pyinstxtractor.py。將先前提取的記憶體資料檔案(file.0xd084eb19a620.0xd084eb13d150.DataSectionObject.testInstaller.exe.dat)放置在與腳本相同的目錄中。

運行以下命令以提取嵌入的 Python 位元組碼:

python3 pyinstxtractor.py file.0xd084eb19a620.0xd084eb13d150.DataSectionObject.testInstaller.exe.dat

執行後,您將看到如下所示的輸出:

s_117.png

Figure-09 從記憶體傾印中使用 pyinstxtractor 提取 .pyc 檔案,版本 v_0.0.1 (2025)

提取器還會識別用於編譯可執行檔的 Python 版本,在本例中為 Python 3.7

⚠️ 重要提示:如果您目前的環境未使用相同的 Python 版本 (3.7),則 PYZ-00.pyz_extracted/ 目錄將保持空白。為避免這種情況,請在提取之前建立並啟動 Python 3.7 虛擬環境。

s_128.png

Figure-10 從 PYZ-00.pyz_extracted 資料夾中尋找其他匯入的 liborary 檔案,版本 v_0.0.1 (2025)

步驟 2:使用 uncompyle6 反編譯 .pyc 檔案

提取成功後,從輸出目錄中找到主要的 .pyc 可執行檔:

📷 提取的 backdoorTrojan.pyc 範例:

s_134.png

Figure-11 從結果中尋找 python pyc 檔案,版本 v_0.0.1 (2025)

使用 uncompyle6.pyc 檔案反編譯為可讀的 Python 原始程式碼:

uncompyle6 backdoorTrojan.pyc >> sourcode.txt

反編譯的程式碼將儲存在 sourcecode.txt 中,並且應類似於原始的後門木馬 Python 腳本,如下所示:

s_144.png

Figure-12 將 pyc 檔案反編譯為 python 原始程式碼,版本 v_0.0.1 (2025)

現在,您可以查看和分析惡意軟件模擬器的行為以進行 DFIR 練習。

(可選)反編譯匯入的程式庫

如果您還想分析捆綁在 PyInstaller 封存檔中的匯入的 Python 模組:

  1. 導航到 PYZ-00.pyz_extracted/ 資料夾。

  2. 使用 uncompyle6 反編譯在那裡找到的任何 .pyc 檔案。

⚠️ 請記住:如果您的主機 Python 版本與原始編譯版本(例如,3.7)不符,則此資料夾可能會保持空白或不完整。


結論

在本文中,我們完整地介紹了端到端的 DFIR 工作流程,用於從記憶體傾印中恢復 Python 惡意軟體的原始程式碼。從建立基於 Python 的 Windows 可執行檔開始,我們示範了如何模擬惡意軟體執行、捕獲記憶體傾印、使用 Volatility3 提取記憶體中的資料,最後使用 pyinstxtractoruncompyle6 等工具反編譯檢索到的二進位檔案。

這種實作的反向工程方法突顯了記憶體鑑識在揭示可能未被發現的惡意行為方面的強大功能。透過理解這些技術,DFIR 從業人員和網路安全愛好者可以更好地分析、回應和防禦真實環境中基於 Python 的惡意軟體威脅。

無論是為了研究、培訓還是事件回應,此過程都提供了一種實用且有見地的方式來加深您的惡意軟體分析技能。


感謝您花時間查看文章詳細資訊,如果您有任何問題和建議或發現任何程式錯誤,請隨時給我留言。非常感謝您能提供一些評論並分享任何改進建議,以便我們把工作做得更好~


last edit by LiuYuancheng ([email protected]) by 12/04/2025 if you have any problem, please send me a message.

           

  RELATED


No related articles

  0 COMMENT


No comment for this article.



  RANDOM FUN

How Chrome works


  SUPPORT US