iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Security

《Nyahello!從零開始的 30 天 malware 學習日誌》系列 第 25

【Day 25】總結:WinDbg for Malware Analysis

  • 分享至 

  • xImage
  •  

前言

前面幾篇花了不少時間介紹 WinDbg,從基本操作一路看到 Kernel Debugging、Kernel Driver,最後甚至進入 Rootkit 與 SSDT Hooking。

但學到這裡可能會有一個問題:

分析惡意程式的時候,我真的會用到 WinDbg 嗎?

畢竟如果只是分析一般的 .exe,x64dbg 通常已經非常方便。設定 Breakpoint、查看 Register、Memory、Stack,甚至修改 Instruction,都可以直接完成。

那為什麼還需要學 WinDbg?

其實重點不在於「以後所有 Malware 都要用 WinDbg 分析」,而是當分析開始從單一 Process 往 Windows OS 底層深入時,只看 User Mode 就可能不夠了。

所以 WinDbg 系列的最後一篇,就來整理前面學過的內容,以及 WinDbg 在 Malware Analysis 中到底扮演什麼角色。

【聲明】由於時間問題本日文章由 AI 生成QQ


從 User Mode Debugging 開始

最一開始接觸 Dynamic Analysis 時,我們通常是在 User Mode 分析 Malware。

例如使用:

  • OllyDbg

  • x64dbg

  • WinDbg

開啟一個執行檔,接著觀察 Malware 執行的 Assembly。

最基本的流程可能是:

載入 Malware
    ↓
設定 Breakpoint
    ↓
執行程式
    ↓
Breakpoint 觸發
    ↓
查看 Registers / Stack / Memory
    ↓
Single Step
    ↓
理解 Malware 行為

在這個階段,Debugger 最重要的用途就是讓程式「停下來」。

如果沒有 Debugger,一個 Function 可能在幾毫秒內就執行結束,我們只能看到最後造成的結果。

但是透過 Breakpoint,就可以停在某一條 Instruction 前面,查看當下的:

Registers
Stack
Memory
Instructions

再使用 Single Step 一步一步執行。


WinDbg 的基本操作

WinDbg 和 x64dbg 的介面與操作方式差很多。

x64dbg 很多操作可以直接透過 GUI 完成,而 WinDbg 很常使用 Command。

例如:

g

代表繼續執行程式。

t

代表 Single Step,也就是執行下一條 Instruction。

p

則類似 Step Over,遇到 Function Call 時不會跟進 Function 裡面。

如果想查看 Disassembly,可以使用:

u

查看 Memory 則可以使用:

db
dd
dq

分別以不同大小查看記憶體內容。

而:

lm

可以查看目前載入的 Modules。

這些指令本身不難,真正重要的是知道:

我現在為什麼要看這些資訊?

例如 Malware 呼叫某個 Function 前,可以先查看 Register 與 Stack,了解傳入的 Argument。

Function 執行完成之後,再查看 Return Value。

Debugger 的用途不是單純「一步一步按」,而是讓我們在重要的位置停下來觀察程式狀態。


從 User Mode 走向 Kernel Mode

一般的 Application 大多執行在 User Mode。

但是很多真正的系統操作最後都必須交給 Kernel。

例如一個程式想要開啟 File,可以把流程簡化成:

Application
    ↓
Windows API
    ↓
ntdll.dll
    ↓
Nt* System Service
    ↓
System Call
    ↓
Kernel Mode
    ↓
Windows Kernel / Driver

前面分析 Rootkit 時,就已經看到一個實際例子:

NtCreateFile

User Mode 程式需要進行 File Operation 時,最後可能透過 System Call 進入 Kernel。

所以 User Mode Debugging 與 Kernel Debugging 並不是兩個完全沒有關係的世界。

反而可以把它們理解成不同的觀察範圍。

User Mode Debugger 比較像是在觀察:

某一個 Process 做了什麼?

Kernel Debugger 則可以進一步觀察:

整個 OS 底層正在發生什麼?

為什麼需要 Kernel Debugging?

如果 Malware 只是一個普通的 .exe,很多時候根本不需要 Kernel Debugging。

使用 x64dbg、Procmon、Process Explorer 等工具,可能就已經可以取得需要的資訊。

但如果 Malware 開始碰到:

Kernel Driver
Rootkit
System Call
Kernel Structure
Interrupt

只觀察 User Mode 就不一定足夠。

例如前一篇介紹的 Rootkit,可以修改 OS 內部功能,讓 User Mode Application 取得被修改過的資訊。

假設:

malware.sys

明明存在,但是 Rootkit 攔截相關操作,最後回傳:

STATUS_OBJECT_NAME_NOT_FOUND

User Mode Application 看到的結果就會是:

File does not exist

這時候如果只相信 User Mode 得到的資訊,就可能真的以為 File 不存在。

因此分析 Kernel Malware 時,需要把觀察位置移到更底層。


Kernel Debugging 的環境

Kernel Debugging 和一般 Debugging 還有一個很大的不同:

通常不會直接在同一個環境裡完成。

常見架構是:

Host
  ↓
WinDbg
  ↓
Debug Connection
  ↓
Target VM
  ↓
Windows Kernel

Host 上執行 WinDbg,而 Target VM 則執行真正要分析的系統。

這樣做的一個原因是,Kernel 本身就是整個 OS 的核心。

User Mode Process Crash,通常只是那個 Process 結束。

但 Kernel 發生嚴重問題,影響的可能是整個系統。

所以 Kernel Debugging 的操作方式和一般開啟 .exe 分析會有明顯不同。


分析 Kernel Driver

Malware 不一定只有 EXE 或 DLL,也可能包含:

.sys

也就是 Windows Driver。

Driver 可以在 Kernel Mode 執行,因此分析惡意 Driver 時,就需要理解一些 Kernel 相關概念。

使用 WinDbg 可以查看目前載入的 Module。

例如:

lm

在 Kernel Debugging 中,這可以幫助我們查看目前系統載入了哪些 Driver。

如果知道某個 Address:

f7ad94a4

但是不知道它屬於哪個 Driver,也可以透過 Module 的 Address Range 判斷。

例如:

f7ad9000 - f7ada680    Rootkit

而:

f7ad94a4

剛好位於這個範圍內。

那麼就可以知道這個 Address 位於:

Rootkit Driver

之中。

這也是前面分析 Rootkit 時使用到的方法。


Rootkit:為什麼 Kernel Debugging 很重要?

Rootkit 是最能說明 Kernel Debugging 價值的例子之一。

前一篇看到的 SSDT Hooking,就是修改:

System Service Descriptor Table

正常情況:

Application
    ↓
NtCreateFile
    ↓
System Call
    ↓
SSDT
    ↓
Original NtCreateFile

但是 Rootkit 可以修改 SSDT 裡面的 Function Address:

Application
    ↓
NtCreateFile
    ↓
System Call
    ↓
SSDT
    ↓
Rootkit Hook

Rootkit 就可以先檢查 Request。

如果是普通 File:

Rootkit Hook
    ↓
Original NtCreateFile

正常執行。

如果是 Rootkit 想隱藏的 File:

Rootkit Hook
    ↓
STATUS_OBJECT_NAME_NOT_FOUND

如此一來,User Mode Application 就會認為 File 不存在。

這也說明了 Kernel Malware Analysis 和一般 Malware Analysis 最大的差異之一:

不能完全相信 OS 回傳給 User Mode 的結果。

因為如果 Kernel 本身已經遭到修改,User Mode 看到的資訊也可能已經被動過手腳。


WinDbg 在 Malware Analysis 中什麼時候有用?

學了這麼多 WinDbg,並不代表之後拿到任何 Malware 都要先開 WinDbg。

工具應該根據分析需求選擇。

如果今天只是拿到一個普通的 Windows EXE,希望知道:

它建立了什麼 Process?
連到哪個 IP?
寫入哪些 File?
修改哪些 Registry Key?

使用:

Procmon
Process Explorer
Wireshark
FakeNet-NG
x64dbg

可能就已經足夠。

但是遇到以下情況,WinDbg 的重要性就會提高:

分析 Kernel Driver

Malware 包含 .sys Driver,需要了解它進入 Kernel 後的行為。

分析 Rootkit

惡意程式可能修改 Kernel Function、Hook 系統功能,甚至隱藏自己的存在。

分析 System Call

想進一步了解 User Mode 行為進入 Kernel 之後發生什麼事情。

分析 Crash

程式或 Driver 發生 Exception 或 Crash,需要透過 Dump 找出問題發生的位置。

查看 Kernel Structure

需要了解 Process、Thread、Driver 或其他 Kernel Object 的狀態。

換句話說,WinDbg 比較像是一個:

當一般 User Mode Analysis 不夠時,可以繼續往 Windows 底層觀察的工具。


WinDbg 和 x64dbg 要選哪一個?

既然 WinDbg 功能這麼強,是不是之後就不用 x64dbg 了?

其實完全不是。

兩者適合的情境不太一樣。

分析情境 x64dbg WinDbg
一般 EXE Malware
Assembly Trace
Breakpoint
快速 User Mode 分析 很方便 可以
Crash Dump 較有限
Kernel Driver 不適合
Kernel Debugging
Rootkit Analysis

如果今天只是分析一般 Malware,我自己還是會優先選擇 x64dbg。

它的 GUI 對 Reverse Engineering 很方便,很多操作也比 WinDbg 直覺。

WinDbg 真正重要的地方,是它把分析能力往更底層延伸。

因此不需要問:

「x64dbg 和 WinDbg 哪個比較好?」

而應該問:

「我現在想觀察的東西在哪一層?」


從 Debugger 操作到分析思路

回頭看這幾篇 Debugging 的內容,一開始學的其實都是很基本的操作:

Breakpoint
Single Step
Step Over
Registers
Stack
Memory
Disassembly

接著慢慢開始接觸:

Process
Thread
Module
Memory Map
Address

再往後進入:

User Mode
Kernel Mode
System Call
Kernel Driver
Rootkit
SSDT
Interrupt

看起來學了很多不同的東西,但其實都圍繞著同一件事情:

理解程式現在正在做什麼。

一開始可能只知道:

call eax

接著開始思考:

EAX 裡面是什麼?

這個 Address 屬於哪個 Module?

這個 Function 接收什麼 Argument?

它為什麼要呼叫這個 Windows API?

這個操作有沒有進入 Kernel?

如果有 Driver,它在 Kernel 裡做了什麼?

這才是學習 Debugger 真正重要的部分。


Debugger 只是觀察程式的一扇窗

到這裡,WinDbg 系列也差不多告一段落。

從最開始學習 Breakpoint、Registers、Stack 與 Memory,到後來開始接觸 Kernel Debugging、Driver 與 Rootkit,可以發現 Debugger 本身其實只是一個工具。

真正困難的從來不是記住:

g
t
p
u
lm

這些 Command。

而是知道:

什麼時候該停下來?

停下來之後要看什麼?

看到這些資訊之後,又能推論出什麼?

在一般 User Mode Malware 中,x64dbg 可能就已經足夠。

遇到 Kernel Driver、Rootkit 或需要進一步理解 Windows 底層行為時,WinDbg 才會真正發揮它的價值。

所以學 WinDbg 的目的,不是為了把所有 Malware 都丟進 WinDbg。

而是讓自己的 Malware Analysis 不會永遠停留在 User Mode。

當有一天分析的 Malware 從:

EXE

一路走到:

DLL
    ↓
Windows API
    ↓
System Call
    ↓
Kernel
    ↓
Driver

我們至少知道接下來應該往哪裡看,以及可以使用什麼工具繼續追下去。

而這也是這幾篇學習 WinDbg 最大的收穫。

本日貓味

https://ithelp.ithome.com.tw/upload/images/20260920/20183878bLn4IXFCTR.jpg


上一篇
【Day 24】Rootkits:從 SSDT Hooking 看懂核心層惡意程式
下一篇
【Day 26】實戰 WinDbg:Kernel Debugging
系列文
《Nyahello!從零開始的 30 天 malware 學習日誌》28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言