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

  liuyuancheng        2025-04-12 00:21:09       1,505        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

本项目中使用的工具

本项目使用了跨不同环境的多种工具:

  • PyInstaller (Windows):用于将 Python 脚本编译为独立的 Windows 可执行文件。

  • Volatility3 (Ubuntu):一个强大的内存取证框架,这里用于分析内存转储并提取与恶意软件相关的数据。

  • uncompyle6 (Ubuntu/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

工具:volatility3,https://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)以识别其进程 ID (PID),如下所示:

s_096.png

Figure-08 使用 volatility3 从内存转储中获取进程尝试,版本 v_0.0.1 (2025)

在上面的进程树示例中,由于我们将后门木马重命名为 testInstaller,我们可以看到两个相关进程:

  • PID 3968

  • PID 8276

由于进程 8276 的父进程 ID (PPID) 为 3968,我们可以推断 3968 是启动恶意软件的初始进程。

步骤 3:提取恶意软件内存段

现在我们已经识别出正确的进程 (PID 3968),我们可以使用 Volatility3 的 dumpfiles 插件将其内存数据提取到文件中:

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

First law of software quality


  SUPPORT US