Trong thế giới an ninh mạng, việc hiểu cách mổ xẻ và phân tích phần mềm độc hại và mã độc là một kỹ năng quan trọng—đặc biệt là trong các hoạt động Pháp chứng Kỹ thuật số và Ứng phó Sự cố (DFIR). Một tình huống phổ biến là gặp phải các tệp thực thi độc hại được viết bằng Python nhưng được biên dịch thành các tệp thực thi (EXE) của Windows. Trong những trường hợp như vậy, các nhà phân tích thường dựa vào kết xuất bộ nhớ để truy xuất và đảo ngược hành vi của phần mềm độc hại và mã cơ bản. Bài viết này sẽ giới thiệu các bước chi tiết về cách trích xuất một tệp exe phần mềm độc hại Windows đã biên dịch (được mã hóa bằng Python) từ dữ liệu kết xuất bộ nhớ Windows, sau đó giải mã dữ liệu để lấy mã nguồn Python. (Như được hiển thị trong sơ đồ quy trình dự án bên dưới)
Hướng dẫn được cấu trúc thành năm phần chính:
-
Tạo Phần mềm Độc hại: Tạo một chương trình thực thi Windows-OS mô phỏng phần mềm độc hại dựa trên Python.
-
Cấu hình Nạn nhân: Định cấu hình hệ thống nút nạn nhân phần mềm độc hại để thu thập dữ liệu kết xuất bộ nhớ.
-
Thu thập Bằng chứng: Chụp kết xuất bộ nhớ trong quá trình thực thi phần mềm độc hại.
-
Trích xuất Dữ liệu: Trích xuất dữ liệu/tệp phần mềm độc hại từ kết xuất bộ nhớ.
-
Kỹ thuật Đảo ngược: Giải mã dữ liệu đã trích xuất trở lại mã nguồn Python có thể đọc được.
Chúng tôi cũng sẽ giới thiệu về các công cụ liên quan được sử dụng bằng cách hoàn thành từng phần, vì vậy nếu bạn là một chuyên gia đội xanh DFIR hoặc một người đam mê an ninh mạng, bạn cũng có thể sử dụng chúng để phân tích pháp chứng bộ nhớ và phân tích phần mềm độc hại Python.
# Author: Yuancheng Liu
# Created: 2025/04/06
# version: v_0.0.1
# Copyright: Copyright (c) 2025 LiuYuancheng
# License: MIT License
Giới thiệu
Pháp chứng Kỹ thuật số và Ứng phó Sự cố (DFIR) là nền tảng của an ninh mạng hiện đại, đóng một vai trò quan trọng trong việc xác định, điều tra và giảm thiểu các cuộc tấn công mạng. Trong DFIR, phân tích pháp chứng bộ nhớ đã trở thành một kỹ thuật thiết yếu, cho phép các nhà phân tích trích xuất bằng chứng dễ bay hơi từ bộ nhớ hệ thống mà có thể không có trên đĩa hoặc lưu lượng mạng. Như được hiển thị trong sơ đồ nội dung DFIR bên dưới.
Hình-01 Sơ đồ tổng quan về miền Pháp chứng Kỹ thuật số và Ứng phó Sự cố (DFIR), phiên bản v_0.0.1 (2025)
Trước khi đi sâu vào các bước thực hành, chúng tôi cung cấp kiến thức nền tảng cần thiết về DFIR và giới thiệu các công cụ được sử dụng trong dự án này. Bài viết này thuộc miền Phân tích Pháp chứng Bộ nhớ của DFIR và tập trung vào một kịch bản kỹ thuật đảo ngược thực tế thường được sử dụng trong các bài tập mạng và các sự kiện đào tạo. Cụ thể, chúng tôi trình bày cách trích xuất và khôi phục mã nguồn của một mẫu phần mềm độc hại dựa trên Python đã được biên dịch thành một tệp thực thi Windows, chỉ sử dụng một kết xuất bộ nhớ được chụp trong quá trình thực thi của nó.
Kiến thức Nền tảng về DFIR
Pháp chứng Kỹ thuật số và Ứng phó Sự cố (DFIR) là một ngành an ninh mạng chuyên về việc hiểu, ứng phó và phục hồi sau các sự cố bảo mật. Nó bao gồm hai lĩnh vực chính:
-
Pháp chứng kỹ thuật số: Liên quan đến việc phân tích dữ liệu hệ thống, hành vi người dùng và bằng chứng kỹ thuật số để khám phá cách một cuộc tấn công xảy ra và ai có thể chịu trách nhiệm.
-
Ứng phó sự cố: Bao gồm các chiến lược và quy trình mà các tổ chức tuân theo để phát hiện, ngăn chặn và khắc phục các mối đe dọa trong thời gian thực.
Pháp chứng kỹ thuật số phân nhánh thành nhiều lĩnh vực, bao gồm pháp chứng hệ thống tệp, pháp chứng mạng, phân tích nhật ký và phân tích pháp chứng bộ nhớ, đây là trọng tâm cốt lõi của bài viết này.
Các Công cụ Được Sử dụng Trong Dự án Này
Dự án này sử dụng nhiều công cụ trên các môi trường khác nhau:
-
PyInstaller (Windows): Được sử dụng để biên dịch các tập lệnh Python thành các tệp thực thi Windows độc lập.
-
Volatility3 (Ubuntu): Một framework mạnh mẽ để phân tích pháp chứng bộ nhớ, được sử dụng ở đây để phân tích kết xuất bộ nhớ và trích xuất dữ liệu liên quan đến phần mềm độc hại.
-
uncompyle6 (Ubuntu/Windows): Một công cụ giải mã chuyển đổi bytecode Python (.pyc files) trở lại mã nguồn có thể đọc được.
Chúng tôi sử dụng một máy Windows-11 để tạo phần mềm độc hại EXE, một máy ảo Windows-10 để thực thi và chụp kết xuất bộ nhớ, và một máy Ubuntu-22.04 để thực hiện phân tích và kỹ thuật đảo ngược.
Với nền tảng này, chúng ta sẽ đi qua từng bước của quy trình—từ việc biên dịch phần mềm độc hại đến việc khôi phục mã nguồn của nó từ bộ nhớ.
Tạo một Tệp Thực thi Windows Dựa trên Python
- Máy chủ: Windows-11
- Công cụ: PyInstaller https://pyinstaller.org/
Là một phần của bài tập phân tích pháp chứng bộ nhớ DFIR này, chúng ta cần mô phỏng hành vi của phần mềm độc hại đang chạy trên một hệ thống nạn nhân mục tiêu. Để làm điều này, chúng ta sẽ tạo một tệp thực thi Windows-OS từ một tập lệnh phần mềm độc hại dựa trên Python bằng cách sử dụng PyInstaller, một công cụ biên dịch các chương trình Python thành các tệp thực thi độc lập.
Trong phần này, chúng ta sẽ tạo một tệp .exe
cho một mẫu phần mềm độc hại trojan backdoor mô phỏng có nguồn gốc từ kho lưu trữ GitHub sau: https://github.com/LiuYuancheng/Python_Malwares_Repo/tree/main/src/backdoorTrojan
Bước 1: Cài đặt PyInstaller
Sử dụng pip
để cài đặt PyInstaller trên máy Windows 11 chủ:
pip install -U pyinstaller
Bước 2: Biên dịch Tập lệnh Python thành một Tệp Thực thi
Điều hướng đến thư mục chứa backdoorTrojan.py
, sau đó chạy lệnh sau để tạo một tệp thực thi duy nhất bằng cách sử dụng cờ --onefile
:
pyinstaller --onefile .\backdoorTrojan.py
Sau khi quá trình hoàn tất, tệp thực thi đã biên dịch backdoorTrojan.exe
sẽ nằm trong thư mục dist
, như được hiển thị bên dưới:
Hình-02 Biên dịch mã phần mềm độc hại Python, phiên bản v_0.0.1 (2025)
Sau đó, chúng ta đổi tên tệp đầu ra thành một chương trình cài đặt phần mềm (ví dụ: thành testInstaller.exe
) và sao chép nó vào máy ảo mục tiêu nơi kết xuất bộ nhớ sẽ được thu thập.
Định cấu hình Windows để Thu thập Kết xuất Bộ nhớ
Máy Mục tiêu: Windows 10
Công cụ: Không có (Cài đặt Windows tích hợp và Trình chỉnh sửa Registry)
Một kết xuất bộ nhớ chụp nội dung của RAM của hệ thống và lưu nó vào đĩa—về cơ bản tạo ra một ảnh chụp nhanh của mọi thứ đang chạy trong bộ nhớ tại một thời điểm nhất định. Mặc dù kết xuất bộ nhớ thường được tạo tự động trong quá trình hệ thống gặp sự cố, chúng cũng có thể được định cấu hình để hỗ trợ phân tích pháp chứng, chẳng hạn như trong một bài tập DFIR.
Trước khi thu thập kết xuất bộ nhớ trên máy ảo Windows 10, hãy đảm bảo có đủ dung lượng đĩa trống. Kích thước của kết xuất bộ nhớ sẽ gần tương ứng với lượng RAM được phân bổ cho VM. Ví dụ: nếu VM của bạn có 16 GB RAM, hãy đảm bảo có ít nhất 16 GB dung lượng đĩa trống.
Bước 1: Bật Cài đặt Kết xuất Bộ nhớ Windows
Để định cấu hình Windows để tạo kết xuất bộ nhớ:
-
Mở Bảng Điều khiển > Hệ thống và Bảo mật > Hệ thống.
-
Nhấp vào Cài đặt hệ thống nâng cao trong thanh bên.
-
Trong tab Nâng cao, hãy chuyển đến phần Khởi động và Phục hồi và nhấp vào Cài đặt.
-
Đảm bảo rằng Kết xuất bộ nhớ kernel hoặc Kết xuất bộ nhớ hoàn chỉnh được chọn trong Viết Thông tin Gỡ lỗi.
-
Nhấp vào OK và khởi động lại máy để áp dụng các thay đổi.
Như được hiển thị bên dưới:
Hình-03 Bật Cài đặt Kết xuất Bộ nhớ Lỗi Hệ thống Windows_OS, phiên bản v_0.0.1 (2025)
Bước 2: Bật Các Tham số Kết xuất Bộ nhớ thông qua Trình chỉnh sửa Registry
Nhấn Win + R
, nhập regedit
và nhấn Enter để mở Trình chỉnh sửa Registry.
Hình-04 Khởi động trình chỉnh sửa registry, phiên bản v_0.0.1 (2025)
Để đảm bảo rằng kết xuất bộ nhớ luôn được giữ lại, hãy sửa đổi registry Windows như sau:
-
Điều hướng đến khóa sau:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl
-
Nhấp chuột phải vào CrashControl, chọn Mới > Giá trị DWORD (32-bit).
-
Đặt tên cho mục mới là
NMICrashDump
và đặt giá trị của nó thành1
bằng cách: Nhấp chuột phải vàoNMICrashDump
> Chọn Sửa đổi > Nhập1
trong trường Dữ liệu giá trị và nhấp vào OK -
Đảm bảo khóa
AlwaysKeepMemoryDump
cũng được đặt thành1
. (Như được hiển thị bên dưới)
Hình-05 Thiết lập cấu hình CrashControl trong trình chỉnh sửa registry, phiên bản v_0.0.1 (2025)
Các cài đặt này đảm bảo rằng tệp kết xuất bộ nhớ được giữ lại ngay cả sau khi hệ thống khởi động lại, giúp nó có sẵn để phân tích sau này bằng các công cụ pháp chứng.
Thu thập Tệp Kết xuất Bộ nhớ
Máy Mục tiêu: Windows 10
Công cụ: Không có (sử dụng hành vi hệ thống tích hợp)
Sau khi hệ thống được định cấu hình đúng cách để tạo kết xuất bộ nhớ, chúng ta có thể tiến hành chạy phần mềm độc hại và kích hoạt kết xuất bộ nhớ để phân tích pháp chứng.
Bắt đầu bằng cách thực thi phần mềm độc hại mô phỏng (testInstaller.exe
) trên máy ảo Windows 10 mục tiêu. Trong khi chương trình đang chạy, chúng ta sẽ kích hoạt thủ công một sự cố hệ thống—còn được gọi là "màn hình xanh" sự cố kernel—để buộc hệ điều hành tạo ra một tệp kết xuất bộ nhớ.
Bước 1: Kích hoạt Kết xuất Bộ nhớ thông qua Phím tắt Bàn phím
Để bắt đầu quá trình sự cố và kết xuất:
-
Giữ phím
Ctrl
. -
Nhấn phím
Scroll Lock
hai lần.
⚠️ Lưu ý: Trên một số bàn phím, đặc biệt là trên máy tính xách tay, bạn có thể cần nhấn phím Fn
(Chức năng) để truy cập Scroll Lock
.
Phím tắt Bàn phím: Ctrl + Scroll Lock + Scroll Lock
Sự kết hợp này mô phỏng một ngắt không thể che (NMI), gây ra sự cố hệ thống và tạo ra một tệp kết xuất bộ nhớ như đã được định cấu hình trong bước trước.
Bước 2: Xác nhận Tệp Kết xuất Bộ nhớ Đã được Tạo
Sau khi được kích hoạt, hệ thống sẽ gặp sự cố và hiển thị màn hình xanh (BSOD) với một chỉ báo tiến trình hiển thị bộ nhớ đang được kết xuất vào đĩa như được hiển thị bên dưới:
Hình-06 Ảnh chụp màn hình lỗi hệ thống, phiên bản v_0.0.1 (2025)
Đợi cho đến khi quá trình kết xuất đạt 100% và hệ thống tự động khởi động lại. Không làm gián đoạn quá trình. Sau khi khởi động lại, điều hướng đến thư mục C:\dump
(dựa trên cấu hình bạn đã đặt trong phần trước). Bây giờ bạn sẽ thấy tệp kết xuất bộ nhớ đã được tạo (ví dụ: test.dmp
) như được hiển thị bên dưới:
Hình-07 Tệp kết xuất bộ nhớ hệ thống Windows, phiên bản v_0.0.1 (2025)
Phân tích Cú pháp Kết xuất Bộ nhớ để Trích xuất Dữ liệu Phần mềm Độc hại Đã Thực thi
Máy chủ: Ubuntu 22.04
Công cụ: volatility3, https://github.com/volatilityfoundation/volatility3
Với tệp kết xuất bộ nhớ (test.dmp
) hiện đã có, bước tiếp theo là phân tích nó bằng cách sử dụng Volatility3, một framework phân tích pháp chứng bộ nhớ mạnh mẽ. Mục tiêu của chúng ta là xác định quy trình phần mềm độc hại và trích xuất dữ liệu bộ nhớ liên quan của nó để phân tích thêm.
Bước 1: Cài đặt Volatility3
Cài đặt Volatility3 trên máy Ubuntu của bạn bằng cách sử dụng pip
:
pip install volatility3
Bước 2: Xác định Quy trình Phần mềm Độc hại
Sau khi cài đặt, sử dụng lệnh vol
để liệt kê tất cả các quy trình đang chạy từ kết xuất bộ nhớ:
vol -f test.dmp windows.pslist
Lệnh này xuất ra một danh sách các quy trình đang hoạt động được chụp tại thời điểm kết xuất. Tìm kiếm tên của tệp thực thi phần mềm độc hại của bạn (trong trường hợp này, testInstaller.exe
) để xác định ID quy trình (PID) của nó như được hiển thị bên dưới:
Hình-08 Sử dụng volatility3 để lấy quy trình thử từ kết xuất bộ nhớ, phiên bản v_0.0.1 (2025)
Trong cây quy trình ví dụ trên, vì chúng ta đã đổi tên trojan backdoor thành testInstaller
, chúng ta có thể thấy hai quy trình liên quan:
-
PID 3968
-
PID 8276
Vì ID Quy trình Cha (PPID) của quy trình 8276 là 3968, chúng ta có thể suy ra rằng 3968 là quy trình ban đầu đã khởi chạy phần mềm độc hại.
Bước 3: Trích xuất Phần Bộ nhớ Phần mềm Độc hại
Bây giờ chúng ta đã xác định quy trình chính xác (PID 3968), chúng ta có thể trích xuất dữ liệu bộ nhớ của nó vào các tệp bằng cách sử dụng plugin dumpfiles
của Volatility3:
vol -f test.dmp -o output windows.dumpfiles --pid 3968
Các vùng bộ nhớ liên quan đến quy trình đã chọn được trích xuất vào thư mục output/
. Trong số các tệp đã trích xuất, hãy tìm tệp tương tự như file.0xd084eb19a620.0xd084eb13d150.DataSectionObject.testInstaller.exe.dat
như được hiển thị bên dưới:
Hình-08 Sử dụng volatility3 để trích xuất dữ liệu chương trình từ kết xuất bộ nhớ, phiên bản v_0.0.1 (2025)
Tệp này chứa biểu diễn trong bộ nhớ của tệp thực thi—đây là dữ liệu quan trọng mà chúng ta sẽ sử dụng trong bước tiếp theo để khôi phục mã nguồn Python ban đầu.
Giải mã dữ liệu phần mềm độc hại trở lại mã nguồn
Máy chủ: Ubuntu 20.04 hoặc Windows
Công cụ:
-
pyinstxtractor, https://github.com/volatilityfoundation/volatility3
-
uncompyle6, https://pypi.org/project/uncompyle6/
Sau khi trích xuất dữ liệu bộ nhớ tệp thực thi từ kết xuất bộ nhớ, bước tiếp theo là kỹ thuật đảo ngược tệp nhị phân trở lại mã nguồn Python.
Bước 1: Trích xuất Tệp .pyc
Bằng Cách Sử Dụng pyinstxtractor
Bắt đầu bằng cách tải xuống pyinstxtractor.py
từ kho lưu trữ GitHub của nó. Đặt tệp dữ liệu bộ nhớ đã trích xuất trước đó (file.0xd084eb19a620.0xd084eb13d150.DataSectionObject.testInstaller.exe.dat
) trong cùng thư mục với tập lệnh.
Chạy lệnh sau để trích xuất bytecode Python được nhúng:
python3 pyinstxtractor.py file.0xd084eb19a620.0xd084eb13d150.DataSectionObject.testInstaller.exe.dat
Sau khi thực thi, bạn sẽ thấy đầu ra như sau:
Hình-09 Trích xuất Tệp .pyc Bằng Cách Sử Dụng pyinstxtractor từ kết xuất bộ nhớ, phiên bản v_0.0.1 (2025)
Trình trích xuất cũng xác định phiên bản Python được sử dụng để biên dịch tệp thực thi—trong trường hợp này, Python 3.7.
⚠️ Quan trọng: Nếu môi trường hiện tại của bạn không sử dụng cùng phiên bản Python (3.7), thư mục PYZ-00.pyz_extracted/
sẽ vẫn trống. Để tránh điều này, hãy tạo và kích hoạt một môi trường ảo Python 3.7 trước khi trích xuất.
Hình-10 Tìm tệp liborary nhập bổ sung từ thư mục PYZ-00.pyz_extracted, phiên bản v_0.0.1 (2025)
Bước 2: Giải mã Tệp .pyc
Bằng Cách Sử Dụng uncompyle6
Sau khi trích xuất thành công, hãy tìm tệp .pyc
thực thi chính từ thư mục đầu ra:
📷 Ví dụ về backdoorTrojan.pyc
đã trích xuất:
Hình-11 Tìm tệp pyc python từ kết quả, phiên bản v_0.0.1 (2025)
Sử dụng uncompyle6
để giải mã tệp .pyc
thành mã nguồn Python có thể đọc được:
uncompyle6 backdoorTrojan.pyc >> sourcode.txt
Mã đã giải mã sẽ được lưu trong sourcecode.txt
và sẽ giống với tập lệnh Python trojan backdoor ban đầu như được hiển thị bên dưới:
Hình-12 Giải mã tệp pyc thành mã nguồn python, phiên bản v_0.0.1 (2025)
Bây giờ bạn có thể xem xét và phân tích hành vi của trình mô phỏng phần mềm độc hại cho bài tập DFIR của mình.
(Tùy chọn) Giải mã Các Thư viện Đã Nhập
Nếu bạn cũng muốn phân tích các mô-đun Python đã nhập được gói bên trong kho lưu trữ PyInstaller:
-
Điều hướng đến thư mục
PYZ-00.pyz_extracted/
. -
Sử dụng
uncompyle6
để giải mã bất kỳ tệp.pyc
nào được tìm thấy ở đó.
⚠️ Hãy nhớ: Nếu phiên bản Python máy chủ của bạn không khớp với phiên bản biên dịch ban đầu (ví dụ: 3.7), thư mục này có thể vẫn trống hoặc không đầy đủ.
Kết luận
Trong bài viết này, chúng ta đã cùng nhau thực hiện quy trình làm việc DFIR (Digital Forensics and Incident Response - Điều tra số và Ứng phó sự cố) hoàn chỉnh từ đầu đến cuối để khôi phục mã nguồn phần mềm độc hại Python từ một kết xuất bộ nhớ. Bắt đầu với việc tạo một tệp thực thi Windows dựa trên Python, chúng tôi đã trình bày cách mô phỏng việc thực thi phần mềm độc hại, chụp kết xuất bộ nhớ, trích xuất dữ liệu trong bộ nhớ bằng Volatility3 và cuối cùng là dịch ngược tệp nhị phân đã truy xuất bằng các công cụ như pyinstxtractor
và uncompyle6
.
Phương pháp tiếp cận kỹ thuật đảo ngược thực tế này làm nổi bật sức mạnh của pháp y bộ nhớ trong việc khám phá các hành vi độc hại mà nếu không có thể không bị phát hiện. Bằng cách hiểu các kỹ thuật này, các chuyên gia DFIR và những người đam mê an ninh mạng có thể phân tích, ứng phó và bảo vệ tốt hơn trước các mối đe dọa phần mềm độc hại dựa trên Python trong môi trường thực tế.
Cho dù là để nghiên cứu, đào tạo hay ứng phó sự cố, quy trình này cung cấp một cách thực tế và sâu sắc để nâng cao kỹ năng phân tích phần mềm độc hại của bạn.
Cảm ơn bạn đã dành thời gian xem chi tiết bài viết, nếu bạn có bất kỳ câu hỏi, đề xuất nào hoặc tìm thấy bất kỳ lỗi chương trình nào, vui lòng nhắn tin cho tôi. Rất cảm ơn nếu bạn có thể đưa ra một số nhận xét và chia sẻ bất kỳ lời khuyên cải tiến nào để chúng tôi có thể làm cho công việc của mình tốt hơn ~
last edit by LiuYuancheng ([email protected]) by 12/04/2025 if you have any problem, please send me a message.