ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。
(編集:株式会社ラック・デジタルペンテストサービス部)

WinDbgで快適なデバッグ環境を構築する

f:id:lac_devblog:20210820185604j:plain デジタルペンテストサービス部の北原です。 今回は、Windowsでの開発や低レイヤのセキュリティの研究には欠かせないWinDbgの、GUI(Workspace)の構築方法とプラグインの導入方法について解説します。 本記事ではWorkspaceの作成方法とプラグインの導入方法だけ解説し、WinDbgの具体的な操作方法については触れません。

なぜ自分でWorkspaceを作成できたほうが良いのか

Windows 10 Anniversary Update(バージョン1607)以後のバージョンのWindowsでは、初心者にも使いやすい見た目のWinDbg Previewが使えるため、「WinDbg Previewがあるじゃん?」という人もいるかもしれません。 しかし、WinDbg Previewはサーバ機には対応していませんし、開発や低レイヤの研究をする上ではWinDbg PreviewがサポートされていないバージョンのWindows OSでWinDbgを操作することもあるでしょう。 WinDbg PreviewのWorkspaceが好みと合わないという場合もあるでしょうし、自分でWorkspaceをカスタマイズして設定できたほうが良いでしょう。

WinDbgをインストールする

WinDbgをこれから触るという人のために、念のためにWinDbgのインストール方法から解説します。 WinDbgは、開発者用ツールであるMicrosoft Windows SDK(Software Development Kit)の一部としてインストール可能です。 以下のMicrosoft公式ページからMicrosoft Windows SDKをダウンロードします。 最新版でうまくインストールできない場合は、Archive版から自分の環境に合ったバージョンを選んでインストールすると良いでしょう。

Microsoft Windows SDKのダウンロード

インストーラ(winsdksetup.exe)のダウンロードが完了したら、インストーラWinDbgをインストールしたい仮想マシンなどに移動して起動しましょう。 以下の手順でインストールを進めます。

  1. Specify Location - インストール先を指定する項目です。特にこだわり無いならば、そのまま「Next」をクリックして次に進みましょう。
  2. WindowsKits Policy - データ集計の許可を求める項目です。YesかNoのいずれかを選択して「Next」をクリックして次に進みましょう。
  3. License Agreement - ライセンスへの同意を確認する項目です。「Accept」をクリックして次に進みましょう。
  4. Select the features you want to install - Microsoft Windows SDKの中からインストールしたい項目を選択します。WinDbgのみを使いたいのであれば「Dbugging Tooks for Windows」にのみチェックを入れて、「Install」をクリックしてインストールを開始しましょう。
  5. Welcome to the Windows Software Development Kit という画面が表示されればインストールは成功です。

インストールに成功したら、Windowsメニューを開いてみましょう。 x86、x64、ARM、ARM64などのWinDbgが表示されるでしょう(Microsoft Windows SDKのバージョンによりインストールされるWinDbgの数は異なります)。 本記事ではWinDbg (x64)を用いますが、他のアーキテクチャWinDbgでも手順はほぼ同じなはずです。

Workspaceを整備する

まずはWinDbgとnotepad.exeを起動して、WinDbgにnotepad.exeをアタッチしましょう。 WinDbgのメニューから「File」を選択し、「Attach to process...」を開き、プロセスのリストの中からnotepad.exeを選択します。 アタッチが成功すると以下のような画面になります。

f:id:lac_devblog:20210816202248p:plain

まずは作業をしやすくするために、WinDbgの外枠のウインドウを最大化しましょう。

f:id:lac_devblog:20210816202312p:plain

「Command」というウインドウをWinDbgの外枠のウインドウの端に近づけると、以下のスクリーンショットのように一体化します。

f:id:lac_devblog:20210816202354p:plain

初期状態で表示されているのは「Command」ウインドウのみですが、メニューから「View」を選択するとさまざまなウインドウを開けます。 本記事では例として「Command」、「Disassembly」、「Register」、「Memory」ウインドウを用いてWorkspaceを構成します。

次にメニューから「View」を選択し「Disassembly」を開きましょう。 すると「Disassembly」という小さいウインドウが表示されます。

f:id:lac_devblog:20210816202412p:plain

この「Disassembly」ウインドウをWinDbgの外枠のウインドウの上端に近づけましょう。 以下のスクリーンショットのように、上半分が「Disassembly」ウインドウ、下半分が「Command」ウインドウになるように一体化します。 うまくいかない場合は、ウインドウを一度画面の中央付近に移動してから、端のほうに移動しましょう。

f:id:lac_devblog:20210816202538p:plain

続けてメニューから「View」を選択し「Registers」を開きましょう。 「Registers」ウインドウが表示されるため、WinDbgの外枠の右上の角に向けて移動しましょう。 少し調整が難しいかもしれませんが、うまくいくと以下のスクリーンショットのように、上側の右半分が「Registers」ウインドウになるように一体化します。

f:id:lac_devblog:20210816202611p:plain

最後に、メニューから「View」を選択し「Memory」を開きましょう。 「Memory」ウインドウを右端に向けて移動しましょう。 WinDbgの右半分が「Memory」ウインドウになるように一体化します。

f:id:lac_devblog:20210816202629p:plain

各ウインドウの境界にマウスカーソルを近づけると、ウインドウのサイズが調整できます。 「Memory」ウインドウの上側の「Display format」のメニューを展開すると、「Memory」ウインドウの表示形式が選択できます。 本記事では例として「Pointer and Symbol」に設定します。 以下のようになります。

f:id:lac_devblog:20210816202719p:plain

フォントを変える

WinDbgのデフォルトのフォントはCourier Newですが、ほかのフォントにしたい人もいるでしょう。 個人的には、等幅で程よく太くはっきり見えるConsolasのほうが好ましいので、Consolasに設定しています。 フォントやフォントサイズを変更するには、WinDbgのメニューから「View」を選択し、「Font...」を開きます。 フォントやフォントサイズを変更するウインドウが表示されるため、好きな設定にして「OK」を押しましょう。

f:id:lac_devblog:20210816202739p:plain

最終的なWorkspaceは以下のスクリーンショットのようにしました。

f:id:lac_devblog:20210816202840p:plain

背景色、文字色を変更する

背景色と文字色を変更するには、WinDbgのメニューから「View」を選択し、「Options...」を開きます。 ウインドウの下部に「Color」という欄があるため、背景色を変更する場合は「Background」を、文字色を変更する場合は「Text」を選択します。 ウインドウ右下の「Change」をクリックすると、色のリストが表示されるため、好きな色を選択しましょう。

f:id:lac_devblog:20210816202811p:plain

Workspaceを保存する

Workspaceが完成したらWEWファイルとして保存しましょう。 WinDbgのメニューから「File」を選択し、「Save Workspace to File...」を開き、保存先を指定して保存します。

f:id:lac_devblog:20210816202926p:plain

作成したWorkspaceをデフォルトに設定する

WinDbgを再起動してnotepad.exeをアタッチすると、以下のスクリーンショットのようにデフォルトのWorkspaceが起動し、自分で作成したWorkspaceでは起動されないでしょう。

f:id:lac_devblog:20210816202946p:plain

WinDbgのメニューから「File」を選択し、「Open Workspace in File...」を開き、先ほど作成したWEWファイルを開けば、自分で作成したWorkspaceでデバッグできるようになります。 しかし、WinDbgを起動してプロセスをアタッチするたびにWEWファイルを開くのは面倒でしょう。 デフォルトで開くWorkspaceを設定するには、HKCU:\Software\Microsoft\WinDbg\Workspaces\UserというレジストリキーのDefaultという値に、WEWファイルのバイナリを直接書き込む必要があります。 Windows 10では、WinDbgをインストールした時点では HKCU:\Software\Microsoft\WinDbg というレジストリキーは存在しません。

PS C:\Users\User> Get-Item -Path HKCU:\Software\Microsoft\WinDbg\
Get-Item : Cannot find path 'HKCU:\Software\Microsoft\WinDbg\' because it does not exist.
At line:1 char:1
+ Get-Item -Path HKCU:\Software\Microsoft\WinDbg\
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (HKCU:\Software\Microsoft\WinDbg\:String) [Get-Item], ItemNotFoundExcept
   ion
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand


PS C:\Users\User> 

まずはレジストリキーを作成します。 PowerShellでは、以下のコマンドを実行します。 管理者権限は必要ないはずです。

PS C:\Users\User> New-Item -Path HKCU:\Software\Microsoft\WinDbg\Workspaces\User -Force


    Hive: HKEY_CURRENT_USER\Software\Microsoft\WinDbg\Workspaces


Name                           Property
----                           --------
User


PS C:\Users\User> 

続けて、先ほど作成したWorkspaceファイルをバイナリデータとして読み込み、作成したレジストリキーのDefaultという値に書き込みます。

PS C:\Users\User> $ws = [IO.File]::ReadAllBytes("C:\Users\User\Desktop\Custom.WEW")
PS C:\Users\User> New-ItemProperty -Path HKCU:\Software\Microsoft\WinDbg\Workspaces\User -Name Default -Value $ws -Type Binary


Default      : {87, 68, 87, 83...}
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\WinDbg\Workspaces\User
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\WinDbg\Workspaces
PSChildName  : User
PSDrive      : HKCU
PSProvider   : Microsoft.PowerShell.Core\Registry


PS C:\Users\User> 

これでWorkspaceのデフォルト設定は完了です。 WinDbgとnotepad.exeを起動して、WinDbgにnotepad.exeをアタッチしましょう。 成功していれば、以下のスクリーンショットのように、作成したWorkspaceが起動します。

f:id:lac_devblog:20210816202147p:plain

プラグインを入れる

快適にデバッグをするために、他の技術者が公開しているプラグインを導入したいという場合があるでしょう。 本記事ではNarlyというプラグインを用いて、WinDbgへのプラグインを解説します。 Narlyはデバッグ対象のプログラムとそれに読み込まれているDLLの保護機能の設定状況などを調べるためのプラグインです。 以下のWebページにて公開されています。

code.google.com

ダウンロードページに移動して、好きなバージョンのアーカイブファイルをダウンロードし、プラグインを導入したい環境に移動します。 アーカイブファイルを展開すると、32bit用のプラグインと64bit用のプラグインがそれぞれアーカイブされた形で入っています。

PS C:\Users\User\Desktop\narly_0.2a> Get-ChildItem


    Directory: C:\Users\User\Desktop\narly_0.2a


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        6/29/2011   6:03 AM            183 ChangeLog.txt
-a----        6/29/2011   6:15 AM         212105 narly.zip
-a----        6/29/2011   6:15 AM         204707 narlyx64.zip
-a----        6/29/2011   6:15 AM          11199 ReadMe.txt


PS C:\Users\User\Desktop\narly_0.2a>

アーカイブファイルを展開すると、それぞれnarly.dllというファイルが保存されています。 narly.zipに含まれているほうは32bit用、narlyx64.zipに含まれているほうは64bit用のプラグインファイルです。 WinDbgの対象アーキテクチャによってプラグインを導入するディレクトリが異なるため、それぞれのディレクトリにプラグインのDLLを移動する必要があります。 Intel系64bit OSの場合は以下のパスです。

  • 32bit用プラグイン: C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext
  • 64bit用プラグイン: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext

32bit用のnarly.dllを32bit用のWinDbgプラグインディレクトリに、64bit用のnarly.dllを64bit用のWinDbgプラグインディレクトリに移動しましょう。 プラグインディレクトリにファイルを設置するには管理者権限が必要です。 PowerShellでファイルを移動するには、管理者権限でPowerShellを起動して以下のようにコマンドを実行します。

PS C:\Windows\system32> Move-Item C:\Users\User\Desktop\narly_0.2a\narly\narly.dll "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext"
PS C:\Windows\system32> Move-Item C:\Users\User\Desktop\narly_0.2a\narlyx64\narly.dll "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext"
PS C:\Windows\system32> Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext\narly.dll"


    Directory: C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\winext


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        6/29/2011   6:12 AM          40960 narly.dll


PS C:\Windows\system32> Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\narly.dll"


    Directory: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        6/29/2011   6:01 AM          46080 narly.dll


PS C:\Windows\system32>

もう一度WinDbgとnotepad.exeを起動して、WinDbgにnotepad.exeをアタッチします。 WinDbgのコマンド欄に .load narly と入力して実行しましょう。 以下のように、Narlyのバナーが表示されていれば成功です。

0:006> .load narly

      __s|I}*!{a.                        ._s,aan2*a
     _wY1+~-    )S,                     .ae"~=:...:X
   .vXl+:.       -4c                   <2+=|==::..:d
   vvi=;..        -?o,                =2=+==:::...=d
  )nv=:.            )5,              .2=--.......-=d
  ue+::              -*s             <c .        .=d
  m>==::..     ._,     <s,           )c           :d
  #==viii|===; {Xs=,    -{s          )c         ..:d
  Z;{nnonnvvii;v(-{%=.    ~s,        )e:====||iiv%=d
  X={oooonvvIl;3;  -{%,    -*>       )2<onnnnvnnnn>d
  X=)vvvvIliii:3;    -!s.   :)s.     )e<oonvlllllIid
  X=<lllliii|=:n;      -1c.  +|1,    )z<nvii||+|+|vX
  S=<lli|||=:: n;        "nc  -s%;   )c=ovl|++==+=vo
  X=<i||+=; . .n`          "1>.-{%i. )c<Xnnli||++=vn
  X=iii>==-.  :o`            "1,:+iI,)c:Sonnvli||=v(
  X>{ii+;:-  .u(               "o,-{Iw(:nvvvllii=v2
  S=i||;:. .=u(                 -!o,+I(:iiillii|ie`
  2>v|==__su?`                    -?o,-:==||iisv"
  {nvnI!""~                         -!sasvv}""`

             by Nephi Johnson (d0c_s4vage)
                      N for gnarly!

Available commands:

    !nmod     - display /SafeSEH, /GS, DEP, and ASLR info for
                all loaded modules

続けて !nmod コマンドを実行すると、notepad.exeと読み込まれているDLLの保護状況が確認できます。

0:006> !nmod
575b0000 575f3000 notepad              /SafeSEH OFF     *ASLR *DEP C:\Windows\system32\notepad.exe
90770000 907f9000 WINSPOOL             /SafeSEH OFF     *ASLR *DEP C:\Windows\system32\WINSPOOL.DRV
9e6d0000 9e73c000 oleacc               /SafeSEH OFF     *ASLR *DEP C:\Windows\System32\oleacc.dll
9ff40000 a01b9000 COMCTL32             /SafeSEH OFF     *ASLR *DEP C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.17763.379_none_05b83be8071c94a1\COMCTL32.dll
a3de0000 a3ea6000 efswrt               /SafeSEH OFF     *ASLR *DEP C:\Windows\System32\efswrt.dll
......

まとめ

本記事ではWinDbgの環境整備方法について解説しました。 Windowsでのデバッグの充実化に役立てますと幸いです。