1. 1. Volatility
    1. 1.1. 1. 簡介
      1. 1.1.1. 1.1 主要用途
    2. 1.2. 2. 安裝和設置
      1. 1.2.1. 2.1 系統要求
      2. 1.2.2. 2.2 安裝步驟
      3. 1.2.3. 2.3 配置
    3. 1.3. 3. 基本使用
      1. 1.3.1. 3.1 命令格式
      2. 1.3.2. 3.2 常用命令及用法
      3. 1.3.3. kdbgscan
      4. 1.3.4. hashdump
      5. 1.3.5. vadinfo
      6. 1.3.6. cmdline
      7. 1.3.7. cmdscan
      8. 1.3.8. ShimCache概述
      9. 1.3.9. Volatility中的shimcache命令
      10. 1.3.10. memdump
        1. 1.3.10.1. 基本用法
        2. 1.3.10.2. 輸出
        3. 1.3.10.3. 用途
        4. 1.3.10.4. 注意事項
        5. 1.3.10.5. 高級用法
        6. 1.3.10.6. 最佳實踐
        7. 1.3.10.7. 相關命令
      11. 1.3.11. mftparser
        1. 1.3.11.1. 基本用法
        2. 1.3.11.2. 輸出信息
        3. 1.3.11.3. 使用場景
        4. 1.3.11.4. 高級用法
        5. 1.3.11.5. 注意事項
        6. 1.3.11.6. 最佳實踐
        7. 1.3.11.7. 相關命令
      12. 1.3.12. 3.3 輸出結果處理
      13. 1.3.13. 3.4 使用過濾器
    4. 1.4. 4. 高級功能
      1. 1.4.1. 4.1 時間線分析
      2. 1.4.2. 4.2 內存取證
        1. 1.4.2.1. procdump: 轉儲進程的可執行文件
          1. 1.4.2.1.1. –dump-dir 選項的詳細說明
      3. 1.4.3. Win10 hash tool
        1. 1.4.3.0.1. 指令
    5. 1.4.4. 4.3 惡意軟件分析
    6. 1.4.5. 4.4 網絡分析
    7. 1.4.6. 4.5 字符串提取和字節序(Endianness)
      1. 1.4.6.1. 字符串提取
      2. 1.4.6.2. 字節序(Endianness)
      3. 1.4.6.3. “strings -e l” 的含義
      4. 1.4.6.4. 為什麼對記事本文件使用小端序?
      5. 1.4.6.5. 在內存分析中的應用
      6. 1.4.6.6. 注意事項
      7. 1.4.6.7. 最佳實踐
  2. 1.5. 5. Volatility 的工作原理
    1. 1.5.1. 5.1 基本原理
    2. 1.5.2. 5.2 關鍵技術
    3. 1.5.3. 5.3 工作流程
    4. 1.5.4. 5.4 關鍵優勢
    5. 1.5.5. 5.5 限制和挑戰
  3. 1.6. 6. 記憶體的構造邏輯
    1. 1.6.1. 6.1 物理內存 vs 虛擬內存
    2. 1.6.2. 6.2 內存分頁
    3. 1.6.3. 6.3 內存佈局
    4. 1.6.4. 6.4 內存管理單元 (MMU)
    5. 1.6.5. 6.5 內存分配和回收
    6. 1.6.6. 6.6 特殊內存區域
    7. 1.6.7. 6.7 操作系統特定的結構
    8. 1.6.8. 6.8 內存取證的意義
    9. 1.6.9. 6.9 Volatility 如何利用這些知識
  4. 1.7. 7. 用簡單的方式理解記憶體
    1. 1.7.1. 7.1 圖書館的結構
    2. 1.7.2. 7.2 圖書管理
    3. 1.7.3. 7.3 閱讀區域
    4. 1.7.4. 7.4 借書和還書
    5. 1.7.5. 7.5 特別的書
    6. 1.7.6. 7.6 Volatility 的工作

Volatility Note

Volatility

1. 簡介

Volatility是一個開源的內存取證框架,主要用於分析計算機的內存轉儲(memory dumps)。它能從這些內存轉儲中提取各種重要信息,對於資安分析、惡意軟件檢測和事件響應都非常有用。

1.1 主要用途

  • 惡意軟件分析
  • 事件響應
  • 數字取證調查
  • 系統行為分析

2. 安裝和設置

2.1 系統要求

  • 支持Windows、Linux和macOS
  • Python環境(Volatility 2.x需要Python 2.7, Volatility 3需要Python 3.x)

2.2 安裝步驟

  1. 確保已安裝適當版本的Python
  2. 使用pip安裝Volatility:
    1
    pip install volatility3
  3. 下載對應操作系統的符號表(symbol tables)

2.3 配置

  • 設置VOLATILITY_LOCATION環境變量指向符號表位置
  • 可選:配置插件目錄

3. 基本使用

3.1 命令格式

1
volatility -f <內存轉儲文件> <插件名稱> [選項]

3.2 常用命令及用法

  1. imageinfo: 識別內存轉儲的操作系統版本

    1
    volatility -f memory.dmp imageinfo

    這個命令會顯示內存轉儲的操作系統信息,包括建議使用的profile。

  2. pslist: 列出所有進程

    1
    volatility -f memory.dmp --profile=Win7SP1x64 pslist

    列出所有進程,包括PID、PPID、名稱、啟動時間等。

  3. pstree: 以樹狀結構顯示進程

    1
    volatility -f memory.dmp --profile=Win7SP1x64 pstree

    以層級結構顯示進程,便於查看進程間的父子關係。

  4. netscan: 顯示網絡連接信息

    1
    volatility -f memory.dmp --profile=Win7SP1x64 netscan

    顯示所有活動的網絡連接,包括本地和遠程IP地址、端口等。

  5. filescan: 掃描文件對象

    1
    volatility -f memory.dmp --profile=Win7SP1x64 filescan

    掃描內存中的所有文件對象,可用於查找特定文件。

  6. malfind: 檢測可能的惡意代碼注入

    1
    volatility -f memory.dmp --profile=Win7SP1x64 malfind

    搜索可能被注入惡意代碼的進程內存區域。

  7. dlllist: 列出每個進程加載的DLL

    1
    volatility -f memory.dmp --profile=Win7SP1x64 dlllist -p 1234

    列出指定進程(PID 1234)加載的所有DLL。

  8. hivelist: 列出註冊表配置單元

    1
    volatility -f memory.dmp --profile=Win7SP1x64 hivelist

    顯示所有註冊表配置單元及其虛擬地址。

  9. printkey: 打印註冊表鍵值

    1
    volatility -f memory.dmp --profile=Win7SP1x64 printkey -K "Software\Microsoft\Windows\CurrentVersion\Run"

    打印指定註冊表鍵的內容。

  10. cmdscan: 掃描命令行歷史

    1
    volatility -f memory.dmp --profile=Win7SP1x64 cmdscan

    掃描並顯示命令提示符的歷史命令。

  11. kdbgscan: 掃描並定位內核調試數據塊

kdbgscan

kdbgscan 是 Volatility 中一個非常重要的命令,用於掃描內存轉儲文件以定位內核調試數據塊(Kernel Debugger Data Block,簡稱 KDBG)。這個命令對於確定正確的內存配置文件(profile)非常有用,特別是在 imageinfo 命令無法提供準確結果的情況下。

使用語法:

1
volatility -f <內存轉儲文件> kdbgscan

功能和用途:

  • 掃描內存轉儲以找到所有可能的 KDBG 結構。
  • 幫助確定正確的內存配置文件(profile)。
  • 提供有關系統版本、架構和其他重要信息的線索。

輸出信息包括:

  • 可能的 KDBG 結構的物理偏移量
  • 匹配的配置文件建議
  • 操作系統版本信息
  • PsActiveProcessHead 和 PsLoadedModuleList 的地址

使用示例:

1
volatility -f memory.dmp kdbgscan

注意事項:

  1. kdbgscan 可能會返回多個結果,需要分析師根據其他信息(如時間戳、版本號等)來判斷哪個是正確的。
  2. 在使用其他 Volatility 命令之前,先運行 kdbgscan 可以幫助確保使用正確的配置文件。

使用技巧:

  1. 結合 imageinfo 命令的結果來交叉驗證。
  2. 如果 kdbgscan 返回多個結果,可以使用 --profile 選項來測試每個建議的配置文件。
  3. 在分析不熟悉的系統或不確定的內存轉儲時,kdbgscan 是一個很好的起點。


12. hashdump: 提取系統用戶密碼哈希

hashdump

hashdump 命令用於從內存轉儲中提取系統用戶的密碼哈希。這個命令對於安全分析和取證調查非常有價值,但使用時需要謹慎,因為它涉及敏感信息。

使用語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> hashdump

功能和用途:

  • 從內存中提取 Windows 系統用戶的密碼哈希。
  • 提供用戶名和對應的 NTLM 哈希值。
  • 可用於進一步的密碼分析或破解(僅限合法和授權的情況下)。

輸出格式:

1
用戶名:RID:LM哈希:NT哈希

使用示例:

1
volatility -f memory.dmp --profile=Win7SP1x64 hashdump

注意事項:

  1. 使用 hashdump 需要管理員權限或等效的訪問級別。
  2. 此命令僅適用於 Windows 系統的內存轉儲。
  3. 某些反病毒軟件可能會將使用此命令視為惡意行為。
  4. 在某些情況下,可能無法提取所有用戶的哈希值。

使用技巧:

  1. 在使用 hashdump 之前,確保已經使用 imageinfokdbgscan 確定了正確的配置文件。

  2. 結合 hivelist 命令使用,可以手動指定 SYSTEM 和 SAM 配置單元的位置:

    1
    volatility -f memory.dmp --profile=Win7SP1x64 hashdump -y 0x8781c008 -s 0x87f72008

    其中,-y 指定 SYSTEM 配置單元地址,-s 指定 SAM 配置單元地址。

  3. 提取的哈希可以用於離線密碼審計,但請確保您有合法授權。

法律和道德考慮:

  • 只在您有明確授權的系統上使用此命令。
  • 遵守所有適用的法律、法規和道德準則。
  • 保護提取的敏感信息,避免未經授權的訪問或濫用。

替代方法:

  • 對於較新的 Windows 版本,可能需要使用 lsadump 插件來提取密碼信息。


13. vadinfo: 顯示虛擬地址描述符信息

vadinfo

vadinfo 命令用於顯示進程的虛擬地址描述符(VAD)樹信息。VAD 是 Windows 操作系統用來描述進程虛擬地址空間的數據結構,對於理解進程的內存佈局和特徵非常重要。

使用語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> vadinfo [-p <進程ID>]

功能和用途:

  • 顯示進程的虛擬內存區域信息
  • 幫助分析進程的內存使用情況
  • 識別可能的惡意行為,如隱藏的代碼注入

輸出信息包括:

  • VAD 節點地址
  • 起始和結束虛擬地址
  • 內存保護標誌(如讀、寫、執行權限)
  • 控制標誌
  • 文件對象信息(如果 VAD 映射了文件)

使用示例:

1
volatility -f memory.dmp --profile=Win7SP1x64 vadinfo -p 4

這會顯示 PID 為 4 的進程的 VAD 信息。

注意事項:

  1. 如果不指定 -p 參數,vadinfo 會顯示所有進程的 VAD 信息,這可能會產生大量輸出。
  2. VAD 樹的分析可以揭示進程的內存使用模式,有助於識別異常行為。

使用技巧:

  1. 結合 pslistpsscan 命令來確定感興趣的進程 ID。
  2. 關注具有執行權限的內存區域,特別是那些沒有關聯文件的區域,它們可能指示代碼注入。
  3. 檢查具有unusual大小或權限的內存區域,這可能暗示惡意活動。

高級用法:

  1. 使用 -o 選項指定特定的偏移量來分析單個 VAD 節點:
    1
    volatility -f memory.dmp --profile=Win7SP1x64 vadinfo -o 0x12345678
  2. 結合 malfind 插件使用,可以更有效地檢測可能的惡意代碼注入。

相關命令:

  • vaddump: 轉儲 VAD 區域的內容
  • vadtree: 以樹狀結構顯示進程的 VAD 節點


14. cmdline vs cmdscan: 命令行分析比較

Volatility 提供了兩個與命令行相關的命令:cmdlinecmdscan。雖然它們看起來相似,但它們的功能和用途有所不同。

cmdline

用途:顯示進程的命令行參數。

語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> cmdline

特點:

  • 顯示所有進程的命令行參數
  • 包括進程 ID、進程名稱和完整的命令行
  • 適用於查看進程是如何被啟動的

示例輸出:

1
2
3
Volatility Foundation Volatility Framework 2.6
Process: 788 - cmd.exe
Command line: "C:\Windows\system32\cmd.exe"

cmdscan

用途:掃描並顯示命令提示符(cmd.exe)的命令歷史。

語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> cmdscan

特點:

  • 專門用於查找和顯示命令提示符中執行過的命令
  • 可以恢復已關閉的命令提示符窗口中的命令
  • 提供更詳細的命令執行歷史信息

示例輸出:

1
2
3
4
5
6
7
8
Volatility Foundation Volatility Framework 2.6
CommandProcess: csrss.exe Pid: 528
CommandHistory: 0x2713b0 Application: cmd.exe Flags: Allocated, Reset
CommandCount: 2 LastAdded: 1 LastDisplayed: 1
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x5c
Cmd #0 @ 0x271410: dir
Cmd #1 @ 0x2714f0: ipconfig

主要區別:

  1. 範圍:

    • cmdline 顯示所有進程的啟動命令行
    • cmdscan 僅關注命令提示符(cmd.exe)的命令歷史
  2. 信息深度:

    • cmdline 提供進程啟動時的參數信息
    • cmdscan 提供更詳細的命令執行歷史,包括已關閉的命令提示符窗口
  3. 用途:

    • cmdline 適用於了解進程如何被啟動及其參數
    • cmdscan 適用於調查用戶在命令提示符中執行的操作

使用建議:

  • 使用 cmdline 來快速查看所有進程的啟動參數
  • 使用 cmdscan 進行深入的命令行歷史調查,特別是在懷疑有可疑命令執行時

注意事項:

  • cmdscan 可能會受到某些反取證技術的影響
  • 兩個命令都應結合其他 Volatility 插件使用,以獲得更全面的分析結果
  1. shimcache: 分析ShimCache數據

ShimCache(應用程序兼容性緩存)是Windows操作系統中的一個功能,用於跟踪應用程序的執行情況以提高兼容性。從取證的角度來看,ShimCache是一個寶貴的信息來源,可以提供有關系統上執行過的程序的洞察。

ShimCache概述

  • 目的:記錄應用程序執行信息,以改善兼容性
  • 位置:存儲在註冊表中(HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache)
  • 包含信息:文件路徑、文件大小、最後修改時間等

Volatility中的shimcache命令

用途:從內存轉儲中提取和分析ShimCache數據。

語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> shimcache

功能:

  • 提取ShimCache中存儲的程序執行記錄
  • 顯示文件路徑、最後修改時間等信息
  • 幫助重建系統活動的時間線

示例輸出:

1
2
3
4
Volatility Foundation Volatility Framework 2.6
Last Modified Path
2023-07-11 14:30:22 UTC+0000 \??\C:\Windows\system32\calc.exe
2023-07-11 15:45:10 UTC+0000 \??\C:\Users\Admin\Downloads\tool.exe

使用價值:

  1. 程序執行歷史:識別系統上運行過的程序
  2. 時間線分析:了解程序執行的時間順序
  3. 惡意軟件調查:發現可疑或異常的程序執行
  4. 用戶活動分析:了解用戶的程序使用模式

注意事項:

  • ShimCache不提供程序的確切執行時間,只有最後修改時間
  • 數據可能會被反取證技術修改或清除
  • 不同Windows版本的ShimCache結構可能有所不同

高級用法:

  1. 結合timeline插件創建更全面的系統活動時間線:

    1
    2
    3
    volatility -f memory.dmp --profile=Win7SP1x64 shimcache --output=body --output-file=shimcache.body
    volatility -f memory.dmp --profile=Win7SP1x64 timeliner --output=body --output-file=timeliner.body
    cat shimcache.body timeliner.body | sort > full_timeline.body
  2. 與其他Volatility插件(如cmdlinepslist)結合使用,交叉驗證程序執行信息

最佳實踐:

  • 將ShimCache數據與其他證據源(如Prefetch文件、UserAssist註冊表項)結合分析
  • 使用時間線工具(如log2timeline)整合ShimCache數據,創建全面的系統活動視圖
  1. memdump: 提取進程的完整內存

memdump

memdump 是 Volatility 中一個強大的命令,用於從內存轉儲中提取特定進程的完整內存內容。這對於深入分析個別進程,特別是在惡意軟件調查中,非常有價值。

基本用法

語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> memdump -p <進程ID> --dump-dir=<輸出目錄>

功能:

  • 提取指定進程的完整內存內容
  • 將提取的內存保存為單獨的文件
  • 允許進一步的離線分析

示例:

1
volatility -f memory.dmp --profile=Win7SP1x64 memdump -p 1234 --dump-dir=/path/to/output

這會將 PID 為 1234 的進程的內存轉儲到指定目錄。

輸出

  • 輸出文件名格式:pid.dmp(例如:1234.dmp
  • 文件包含進程的完整內存映像

用途

  1. 惡意軟件分析:提取可疑進程的內存以進行深入檢查
  2. 取證調查:分析特定應用程序的運行時狀態
  3. 內存結構研究:研究進程的內存佈局和內容
  4. 數據恢復:從進程內存中恢復可能已經從磁盤刪除的數據

注意事項

  1. 輸出文件可能會很大,確保有足夠的磁盤空間
  2. 處理提取的內存時要小心,特別是對於可能包含惡意代碼的進程
  3. 某些反病毒軟件可能會對提取的內存文件產生警報

高級用法

  1. 結合 pslistpsscan 來識別感興趣的進程:

    1
    2
    volatility -f memory.dmp --profile=Win7SP1x64 pslist
    volatility -f memory.dmp --profile=Win7SP1x64 memdump -p <identified_pid> --dump-dir=/path/to/output
  2. 使用 strings 命令快速查看提取的內存內容:

    1
    strings /path/to/output/1234.dmp | grep "interesting_string"
  3. 使用專門的內存分析工具(如 Rekall 或 Volatility 本身)進一步分析提取的內存

最佳實踐

  1. 在隔離的環境中分析提取的內存文件
  2. 保持提取的文件的完整性,避免修改原始數據
  3. 記錄所有的分析步驟,確保調查的可重現性
  4. 考慮使用 malfind 插件來識別可能的惡意注入,然後使用 memdump 提取相關進程

相關命令

  • procmemdump:類似於 memdump,但輸出格式略有不同
  • dlldump:轉儲進程加載的特定 DLL
  • vaddump:轉儲特定的內存區域(VAD)
  1. mftparser: 分析 NTFS 主文件表 (MFT)

mftparser

mftparser 是 Volatility 中的一個高級插件,用於解析和分析 Windows NTFS 文件系統的主文件表(Master File Table, MFT)。MFT 是 NTFS 文件系統的核心組件,包含了關於文件和目錄的元數據信息。

基本用法

語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> mftparser

功能:

  • 從內存中提取和解析 MFT 條目
  • 提供詳細的文件和目錄信息
  • 有助於恢復已刪除的文件信息

輸出信息

MFTParser 的輸出通常包括:

  • 文件名和路徑
  • 文件大小
  • 創建、修改、訪問時間
  • 文件屬性
  • 父目錄信息
  • 數據運行(如果可用)

使用場景

  1. 文件系統分析:了解系統上的文件結構和布局
  2. 數據恢復:尋找已刪除或隱藏的文件痕跡
  3. 時間線分析:重建文件系統活動的時間線
  4. 惡意軟件調查:識別可疑文件和它們的位置

高級用法

  1. 結合輸出重定向以便後續分析:

    1
    volatility -f memory.dmp --profile=Win7SP1x64 mftparser > mft_output.txt
  2. 使用 grep 或其他文本處理工具進行快速搜索:

    1
    cat mft_output.txt | grep "suspicious_file.exe"
  3. 與其他 Volatility 插件結合使用,如 filescantimeliner

注意事項

  1. MFTParser 可能會生成大量輸出,處理時需要耐心
  2. 並非所有 MFT 條目都能被完整恢復或解析
  3. 解析結果的準確性取決於內存轉儲的完整性和系統狀態

最佳實踐

  1. 在分析之前,確保使用正確的系統配置文件
  2. 結合其他文件系統分析工具來驗證和補充 MFTParser 的結果
  3. 創建輸出的備份,以便進行離線分析和長期保存
  4. 使用時間過濾器來聚焦於特定時間範圍內的文件活動

相關命令

  • filescan: 掃描內存中的文件對象
  • dumpfiles: 從內存中提取文件
  • timeliner: 創建系統事件的時間線,可以包括 MFT 信息

3.3 輸出結果處理

大多數Volatility命令的輸出可以被重定向到文件中,便於後續分析:

1
volatility -f memory.dmp --profile=Win7SP1x64 pslist > pslist_output.txt

某些插件還支持以其他格式輸出,如CSV:

1
volatility -f memory.dmp --profile=Win7SP1x64 pslist --output=csv --output-file=pslist_output.csv

3.4 使用過濾器

許多插件支持使用過濾器來精確定位感興趣的信息:

1
volatility -f memory.dmp --profile=Win7SP1x64 dlllist -p 1234 | grep "system32"

這條命令會列出PID為1234的進程加載的DLL,並只顯示包含”system32”的行。

4. 高級功能

4.1 時間線分析

使用timeliner插件創建系統事件時間線。

4.2 內存取證

  • memdump: 轉儲特定進程的完整內存
  • procdump: 轉儲進程的可執行文件
  • procdump: 轉儲進程的可執行文件

procdump: 轉儲進程的可執行文件

使用語法:

1
volatility -f <內存轉儲文件> --profile=<配置文件> procdump -p <PID> --dump-dir=<輸出目錄>

參數說明:

  • -f <內存轉儲文件>: 指定要分析的內存轉儲文件。
  • --profile=<配置文件>: 指定適合的配置文件(如 Win7SP1x64)。
  • -p <PID>: 指定要轉儲的進程 ID。
  • --dump-dir=<輸出目錄>: 指定保存提取文件的目錄。

使用示例:

1
volatility -f memory.dmp --profile=Win7SP1x64 procdump -p 1234 --dump-dir=/tmp/extracted_exe

這個命令會將 PID 為 1234 的進程的可執行文件提取到 /tmp/extracted_exe 目錄中。

注意事項:

  1. 確保指定的輸出目錄存在且有寫入權限。
  2. 提取的文件名格式通常為 executable.<PID>.exe
  3. 如果不指定 PID,Volatility 會嘗試轉儲所有進程的可執行文件。
  4. 對於某些進程(如系統進程),可能無法成功提取可執行文件。

使用技巧:

  1. 結合 pslistpstree 命令先識別可疑進程的 PID。
  2. 使用 --unsafe 選項可以嘗試從可能已經終止的進程中提取可執行文件。
  3. 提取後的文件可以使用其他工具(如 IDA Pro 或 Ghidra)進行進一步的靜態分析。
–dump-dir 選項的詳細說明

--dump-dir 選項用於指定 Volatility 保存提取文件的目錄。這個選項在使用 procdump 以及其他需要輸出文件的命令時非常重要。

詳細說明:

  1. 語法:

    1
    --dump-dir=<輸出目錄路徑>
  2. 用途:

    • 指定 Volatility 保存提取文件的目標目錄。
    • 確保提取的文件被保存在一個已知和可訪問的位置。
  3. 注意事項:

    • 指定的目錄必須已經存在。Volatility 不會自動創建不存在的目錄。
    • 確保指定目錄有足夠的寫入權限。
    • 使用絕對路徑可以避免混淆。
    • 在 Windows 系統上,路徑中使用反斜線(\);在 Unix/Linux 系統上,使用正斜線(/)。
  4. 示例:

    • 在 Linux/macOS 上:
      1
      volatility -f memory.dmp --profile=Win7SP1x64 procdump -p 1234 --dump-dir=/home/user/volatility_output
    • 在 Windows 上:
      1
      volatility -f memory.dmp --profile=Win7SP1x64 procdump -p 1234 --dump-dir=C:\Users\YourUsername\Desktop\volatility_output
  5. 最佳實踐:

    • 為每次分析創建一個新的、唯一的輸出目錄,以避免文件覆蓋或混淆。
    • 在目錄名中包含日期或案例標識符,例如:
      1
      --dump-dir=/cases/case001_2023-07-11/procdump_output
    • 如果在同一目錄中運行多個命令,考慮為每個命令創建子目錄:
      1
      2
      --dump-dir=/cases/case001/procdump_output
      --dump-dir=/cases/case001/memdump_output
  6. 故障排除:

    • 如果遇到權限錯誤,檢查目錄的寫入權限。
    • 如果文件沒有被保存,確認指定的目錄路徑是否正確,以及目錄是否存在。
  7. 與其他命令的使用:
    --dump-dir 選項不僅適用於 procdump,還可以用於其他需要輸出文件的 Volatility 命令,如 memdumpdlldump 等。

Win10 hash tool

指令
1
certutil -hashfile  <檔名>  <hash型別>

4.3 惡意軟件分析

  • malfind: 檢測代碼注入
  • svcscan: 掃描服務
  • ldrmodules: 檢測隱藏的DLL

4.4 網絡分析

  • netscan: 掃描網絡連接和套接字
  • connscan: 掃描TCP連接

4.5 字符串提取和字節序(Endianness)

在分析內存轉儲文件時,了解字符串提取和字節序的概念非常重要,特別是當處理不同類型的數據和文件格式時。

字符串提取

strings 命令是一個常用的工具,用於從二進制文件中提取可打印的字符序列。在內存取證中,它常用於快速查看內存轉儲文件的內容。

基本用法:

1
strings <文件名>

字節序(Endianness)

字節序指的是計算機如何儲存多字節數據類型(如整數或字符串)的順序。

  1. 大端序(Big Endian):最高有效字節存儲在最低的內存地址。
  2. 小端序(Little Endian):最低有效字節存儲在最低的內存地址。

“strings -e l” 的含義

當使用 "strings -e l" 命令時:

  • -e 選項指定字節序
  • l 表示 little-endian(小端序)

這個命令用於從按小端序存儲的數據中提取字符串。

為什麼對記事本文件使用小端序?

Windows 操作系統中的許多應用程序,包括記事本(Notepad),通常使用 UTF-16LE(Little Endian)編碼來存儲 Unicode 文本。這意味著:

  1. 每個字符使用兩個字節表示。
  2. 這兩個字節按小端序排列。

例如,字符 “A” 在內存中的表示:

  • UTF-16LE:41 00
  • UTF-16BE:00 41

在內存分析中的應用

  1. 分析 Windows 進程內存:

    1
    strings -e l <memdump文件> | grep "關鍵詞"
  2. 提取可能的文本內容:

    1
    2
    volatility -f memory.dmp --profile=Win7SP1x64 memdump -p <記事本進程ID> --dump-dir=/output
    strings -e l /output/<PID>.dmp > extracted_text.txt
  3. 跨平台分析:

    • 對於 Linux 或 macOS 系統,可能需要使用 -e b(大端序)
    • 某些文件格式可能混合使用大小端序

注意事項

  1. 並非所有文本都是 UTF-16LE 編碼,某些可能是 UTF-8 或其他編碼。
  2. 在分析未知來源的數據時,嘗試不同的字節序和編碼可能會有所幫助。
  3. 某些工具(如高級文本編輯器)可以自動檢測和處理不同的字節序。

最佳實踐

  1. 了解目標系統和應用程序通常使用的編碼和字節序。
  2. 在分析過程中,嘗試使用不同的字節序選項(-e l, -e b, -e s)。
  3. 結合使用其他 Volatility 插件(如 filescan, dumpfiles)來定位和提取感興趣的文件。

5. Volatility 的工作原理

Volatility 是一個強大的內存取證框架,其工作原理涉及多個關鍵概念和技術。理解這些原理有助於更有效地使用該工具並解釋其結果。

5.1 基本原理

  1. 內存結構分析:

    • Volatility 通過分析內存轉儲文件中的數據結構來重建系統狀態。
    • 它利用操作系統特定的內存佈局和數據結構知識來定位和解釋信息。
  2. 配置文件(Profiles):

    • Volatility 使用配置文件來定義特定操作系統版本的內存結構。
    • 這些配置文件包含了內核數據結構的定義、重要內存地址等信息。
  3. 地址空間抽象:

    • Volatility 創建一個抽象的地址空間,允許它像操作系統一樣訪問內存。
    • 這種抽象使得 Volatility 可以處理不同格式的內存轉儲文件。

5.2 關鍵技術

  1. 符號解析:

    • Volatility 使用調試符號信息來定位和解釋內核數據結構。
    • 這允許它準確地映射內存中的對象和數據。
  2. 對象遍歷:

    • 通過遍歷內存中的對象鏈表和樹結構,Volatility 可以重建進程列表、文件句柄等信息。
  3. 啟發式掃描:

    • 對於某些情況(如隱藏進程),Volatility 使用啟發式方法來掃描內存,尋找特定的數據模式。
  4. 插件架構:

    • Volatility 的模塊化設計允許開發者創建自定義插件,擴展其功能。

5.3 工作流程

  1. 內存轉儲文件加載:

    • Volatility 讀取內存轉儲文件,創建虛擬地址空間。
  2. 操作系統識別:

    • 使用如 imageinfokdbgscan 等命令來確定適當的配置文件。
  3. 配置文件應用:

    • 將選定的配置文件應用於內存轉儲,建立內存結構映射。
  4. 插件執行:

    • 用戶選擇的插件在映射的內存上執行,提取和分析特定信息。
  5. 結果輸出:

    • 分析結果被格式化並呈現給用戶。

5.4 關鍵優勢

  1. 跨平台兼容性:

    • Volatility 可以在不同的操作系統上運行,分析各種格式的內存轉儲。
  2. 非侵入性分析:

    • 對原始內存轉儲進行分析,不會改變原始證據。
  3. 可擴展性:

    • 插件架構允許社區貢獻和定制分析功能。
  4. 深度分析能力:

    • 能夠提取和分析操作系統內部的深層數據結構。

5.5 限制和挑戰

  1. 依賴準確的配置文件:

    • 錯誤的配置文件選擇可能導致分析錯誤或失敗。
  2. 對抗技術:

    • 某些高級惡意軟件可能會使用反取證技術來混淆內存內容。
  3. 大型內存轉儲的處理:

    • 分析大型內存轉儲可能需要大量的計算資源和時間。
  4. 動態性:

    • 內存內容是高度動態的,某些短暫的信息可能在轉儲時已經丟失。

理解這些原理有助於更有效地使用 Volatility,並正確解釋其輸出結果。同時,這也有助於在遇到複雜情況時進行故障排除和高級分析。

6. 記憶體的構造邏輯

理解記憶體的構造邏輯對於深入掌握 Volatility 等內存分析工具的工作原理至關重要。計算機內存是一個複雜的系統,其構造涉及多個層次和概念。

6.1 物理內存 vs 虛擬內存

  1. 物理內存:

    • 直接對應到硬件 RAM 芯片
    • 由操作系統管理,應用程序通常不直接訪問
  2. 虛擬內存:

    • 每個進程都有自己的虛擬地址空間
    • 操作系統負責將虛擬地址映射到物理地址

6.2 內存分頁

  • 內存被分割成固定大小的”頁”(通常是 4KB)
  • 使用頁表將虛擬頁面映射到物理頁面
  • 允許非連續的物理內存看起來像是連續的虛擬內存

6.3 內存佈局

  1. 內核空間:

    • 通常位於高地址區域
    • 存儲操作系統內核、驅動程序等
  2. 用戶空間:

    • 通常位於低地址區域
    • 存儲應用程序代碼和數據
  3. 典型的進程內存佈局:

    • 代碼段(Text)
    • 數據段(Data)
    • BSS 段(未初始化數據)
    • 堆(Heap)
    • 棧(Stack)
    • 共享庫

6.4 內存管理單元 (MMU)

  • 負責虛擬地址到物理地址的轉換
  • 管理內存訪問權限(讀/寫/執行)
  • 實現內存保護機制

6.5 內存分配和回收

  1. 動態內存分配:

    • 堆內存由內存分配器管理(如 malloc/free)
    • 操作系統提供系統調用(如 brk, mmap)來擴展進程的內存
  2. 垃圾回收:

    • 某些語言(如 Java, Python)使用垃圾回收機制自動管理內存

6.6 特殊內存區域

  1. 共享內存:

    • 允許多個進程訪問同一塊物理內存
  2. 內存映射文件:

    • 將文件內容直接映射到進程的地址空間

6.7 操作系統特定的結構

  1. Windows:

    • 進程環境塊(PEB)
    • 線程環境塊(TEB)
    • 內核對象
  2. Linux:

    • 任務結構(task_struct)
    • 虛擬內存區域(vm_area_struct)
    • 文件描述符表

6.8 內存取證的意義

  1. 揮發性數據:

    • 內存包含系統的當前運行狀態
    • 可以捕獲到磁盤上看不到的信息
  2. 隱藏信息:

    • 某些惡意軟件只在內存中運行,不寫入磁盤
  3. 加密數據:

    • 內存中可能包含解密後的敏感數據

6.9 Volatility 如何利用這些知識

  1. 結構解析:

    • 利用操作系統特定的內存結構來定位和解析數據
  2. 地址轉換:

    • 在虛擬地址和物理地址之間進行轉換
  3. 進程重建:

    • 通過分析進程相關的內存結構來重建進程列表和信息
  4. 文件恢復:

    • 從內存中提取文件內容和元數據

理解這些內存構造邏輯,有助於更深入地理解 Volatility 的工作原理,並能更有效地進行內存取證分析。

7. 用簡單的方式理解記憶體

想像電腦的記憶體就像一個巨大的圖書館。這個圖書館有很多特別之處,讓我們來看看:

7.1 圖書館的結構

  1. 書架 (物理內存):

    • 圖書館裡有很多書架,就像電腦裡有很多記憶體晶片。
    • 每個書架都有自己的編號,就像記憶體的每個位置都有地址。
  2. 圖書目錄 (虛擬內存):

    • 圖書館有一個神奇的目錄,可以讓你找到任何書,即使它們不在一起。
    • 這就像電腦的虛擬內存,讓程序以為它有一大片連續的空間。

7.2 圖書管理

  1. 圖書分類 (內存分頁):

    • 書籍被分成小組,每組放在一個盒子裡。
    • 這就像電腦把內存分成小塊(頁面),更容易管理。
  2. 圖書管理員 (操作系統):

    • 管理員負責找書、放書,確保每個人都能用到需要的書。
    • 操作系統就像這個管理員,管理所有的內存使用。

7.3 閱讀區域

  1. 公共閱讀區 (用戶空間):

    • 這裡是人們看書的地方,就像程序運行的地方。
  2. 員工專用區 (內核空間):

    • 只有圖書館員工才能進入的區域,像是電腦的核心系統運行的地方。

7.4 借書和還書

  1. 借書 (內存分配):

    • 當你需要一本書時,管理員會幫你找到並借給你。
    • 程序需要內存時,操作系統就會分配給它。
  2. 還書 (內存釋放):

    • 看完書後,你把書還回去,別人就能用了。
    • 程序用完內存後,會還給系統,供其他程序使用。

7.5 特別的書

  1. 共享的書 (共享內存):

    • 有些書可以同時被多人一起看。
    • 這就像共享內存,多個程序可以同時使用。
  2. 複印的書頁 (緩存):

    • 常用的書頁會被複印,放在容易拿到的地方。
    • 這就像電腦的快取,把常用的數據放在快速存取的地方。

7.6 Volatility 的工作

想像 Volatility 是一個特別的圖書館調查員:

  • 它可以看到圖書館的每個角落。
  • 它知道怎麼讀懂管理員的筆記和目錄。
  • 它可以找出誰借了什麼書,甚至是已經還回去的書。
  • 它能發現有人偷偷藏起來的書。

這就是 Volatility 如何在電腦的記憶體中找到重要信息,即使這些信息看起來已經不在那裡了。