2015年7月20日月曜日

ネットワークケーブルを用いたカーネルデバッグ

Windows8からはネットワークケーブルを用いたカーネルデバッグが可能という事なので試してみた。
シリアルケーブルで接続する時はホストPCとターゲットPCは1対1で接続する必要があったが、
ネットワークケーブルの場合は、1台のホストPCに複数台のターゲットPCを接続出来るので非常に便利。


[環境]
192.168.20.1 ホストPC(WinDbgインストール済)
192.168.20.2 ターゲットPC(デバッグされる側)
上記2台をLANケーブルで直接接続。

<対応しているNIC一覧>
Supported Ethernet NICs for Network Kernel Debugging in Windows 8

ちなみに、vendor IDとdevice IDは対象NICのアダプタのプロパティから確認出来る。
vender ID : VEN_XXXのXXX部 (下図の例だと"10EC" ⇒Realtek)
device ID : DEV_YYYのYYY部 (下図の例だと"8136")

[手順]
1. ホストPCのIP アドレスを確認
今回の環境だと192.168.20.1。

2. ホストPCとターゲットPC間のデバッグポートを決定(範囲は49152-65535)
今回は50000とした。

3. ターゲットPCに対してデバッグ設定を実施
ターゲットPC上でコマンドプロンプトを管理者権限で起動し、以下のコマンドを実行する。
  bcdedit /debug on
  bcdedit /dbgsettings net hostip:w.x.y.z port:n

/dbgsettingsオプションのhostipはホストPCのIPアドレス(192.168.20.1)、portは2で決定したポート番号(50000)を指定する。
設定完了時にKey情報が生成されるが、これは後述するデバッグセッション開始時にホストPC側で使用する。

(注意1)
デバッガの設定時に以下のエラーが発生する場合は、セキュアブートを無効化する必要あり。

以下の記事を参考に。
<セキュアブートを無効にする方法>
<Windows 8 で BIOS セットアップを表示させたい> ※恥かしながら知りませんでした。。


(注意2)
ターゲットPC上で複数のネットワークアダプターが存在する場合、
以下のコマンドでbusparmsのb.d.fにデバッグ接続に使用するアダプターのPCI bus、device、function番号を指定する。
  bcdedit /set {dbgsettings} busparams b.d.f


PCI bus、device、function番号についてはデバイスマネージャーで対象アダプタ-のプロパティより確認できる。下図の例だと、「busparams 4.0.0」となる。


4. ホストPC からデバッグセッションを開始する
Windbgを起動し、2で決定したポート番号(50000)と3で生成されたキー情報を入力し、[Kernel Debug]を実行する。

5.  ターゲットPCを再起動する
デバッガ上でブレークインできれば接続完了・・・のはずが出来ないなぁ。。
PC依存?別PCが用意出来たらTryしてみます。


[参考資料]
ネットワークケーブルを用いたカーネルデバッグ接続の設定手順
Setting Up Kernel-Mode Debugging over a Network Cable Manually

0 件のコメント:

コメントを投稿