14 1月 2015

[WinDbg] Remote Kernel Debug over Network cable

WinDbg 不僅可以用來 Debug User mode 的 process,還可以用來 Debug Kernel mode 的 Windows,基本上使用的方式必須有兩台電腦,或是 VM ,因為 你如果要做 local 的 Kernel Debug 的話,中斷點 hit 到的話,整台電腦應該就會 block 住,但是 local Kernel Debug 無法這麼做的。

既然要透過 remote 的方式來做 Kernel Debug,所以 Windows 提供了不少方法讓你連線到另一台電腦,包括 Serial cable (COM)1394 cableNetwork cableUSB cable …等等,其中 Serial cable & 1394 使用上的限制比較少,support 的平台也比較多,Network cable 與 USB cable 對硬體與平台的限制都不少,所以要確認你的硬體平台有支援的話,才可以透過 Network cable, USB cable 來做 debug。



這次就來介紹一下:透過 Network cable 來做 Kernel Debug,限制如下
  1. Target computer - Windows 8.0+
  2. Target computer - 網卡 Vendor 支援清單
  3. Host computer - Windows XP+
  4. Host computer - WinDbg version 要 WDK 8.1+

1. 確認 Target computer 網卡支援性


啟動裝置管理員 Device Manager (或是執行指令 devmgmt.msc)
Device Manager
找到你的網卡,點右鍵,選Property 

Ethernet Properties
注意看Value:PCI\VEN_8086&DEV_155A
Vendor ID = 8086
Device ID = 155A
照著這個 Vendor ID & Device ID 到 MSDN 網頁中比對一下,如果找得到的話,恭喜你,代表這台電腦是可以做 Kernel Debug的。

圖3 (Optional)
Ethernet Properties
當你的電腦不止一張網卡的話
要注意圖中的 Location : PCI bus 0, device 25, function 0
這個 magic number 在之後會用到

2. 開啟 Target computer 的 Debug mode

在舊 XP 的時代,開啟 Debug mode 必須透過 boot.ini,但是在 Vista 以後,可以透過 bcdedit 指令直接開啟 Debug 的功能

admin 的權限開啟 cmd (命令提示字元)
確認你的 host computer 的 ip(w.x.y.z) & port(n 建議50000+)
兩台電腦必須在同一個網域或是 ping 得到對方的 ip 才行
輸入以下指令
bcdedit /debug on
bcdedit /dbgsettings net hostip:w.x.y.z port:n
bcdedit 會回傳一組 Key,必須將這組 Key 傳至 host computer

如果你有超過一張網卡以上
必須再設定你連線的網卡是哪一張
指定 busparams b.d.f (參考 圖3 取得 bus id, device id, function id)
bcdedit /set "{dbgsettings}" busparams b.d.f

最後可以確認一下你目前的設定是什麼
bcdedit /dbgsettings


3. Host computer 開始 debug

接上網路線
在 Host computer 開啟 WinDbg,選擇 File | Kernel Debug 
輸入正確的 port 與 Key
按下確定後
Target computer 重開機應該就可以開始 debug 了


指令
  • Ctrl + Break (馬上中斷)
  • Ctrl + Alt + K (Target computer 重開機時,在 Windows initialize 後馬上中斷)
  • ed Kd_DEFAULT_Mask 0x8  # display default kernel log
  • dd Kd_DEFAULT_Mask  # disable display default kernel log


Reference

沒有留言: