デジタルペンテストサービス部の北原です。 今回は、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版から自分の環境に合ったバージョンを選んでインストールすると良いでしょう。
インストーラ(winsdksetup.exe)のダウンロードが完了したら、インストーラをWinDbgをインストールしたい仮想マシンなどに移動して起動しましょう。 以下の手順でインストールを進めます。
- Specify Location - インストール先を指定する項目です。特にこだわり無いならば、そのまま「Next」をクリックして次に進みましょう。
- WindowsKits Policy - データ集計の許可を求める項目です。YesかNoのいずれかを選択して「Next」をクリックして次に進みましょう。
- License Agreement - ライセンスへの同意を確認する項目です。「Accept」をクリックして次に進みましょう。
- Select the features you want to install - Microsoft Windows SDKの中からインストールしたい項目を選択します。WinDbgのみを使いたいのであれば「Dbugging Tooks for Windows」にのみチェックを入れて、「Install」をクリックしてインストールを開始しましょう。
- 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を選択します。 アタッチが成功すると以下のような画面になります。
まずは作業をしやすくするために、WinDbgの外枠のウインドウを最大化しましょう。
「Command」というウインドウをWinDbgの外枠のウインドウの端に近づけると、以下のスクリーンショットのように一体化します。
初期状態で表示されているのは「Command」ウインドウのみですが、メニューから「View」を選択するとさまざまなウインドウを開けます。 本記事では例として「Command」、「Disassembly」、「Register」、「Memory」ウインドウを用いてWorkspaceを構成します。
次にメニューから「View」を選択し「Disassembly」を開きましょう。 すると「Disassembly」という小さいウインドウが表示されます。
この「Disassembly」ウインドウをWinDbgの外枠のウインドウの上端に近づけましょう。 以下のスクリーンショットのように、上半分が「Disassembly」ウインドウ、下半分が「Command」ウインドウになるように一体化します。 うまくいかない場合は、ウインドウを一度画面の中央付近に移動してから、端のほうに移動しましょう。
続けてメニューから「View」を選択し「Registers」を開きましょう。 「Registers」ウインドウが表示されるため、WinDbgの外枠の右上の角に向けて移動しましょう。 少し調整が難しいかもしれませんが、うまくいくと以下のスクリーンショットのように、上側の右半分が「Registers」ウインドウになるように一体化します。
最後に、メニューから「View」を選択し「Memory」を開きましょう。 「Memory」ウインドウを右端に向けて移動しましょう。 WinDbgの右半分が「Memory」ウインドウになるように一体化します。
各ウインドウの境界にマウスカーソルを近づけると、ウインドウのサイズが調整できます。 「Memory」ウインドウの上側の「Display format」のメニューを展開すると、「Memory」ウインドウの表示形式が選択できます。 本記事では例として「Pointer and Symbol」に設定します。 以下のようになります。
フォントを変える
WinDbgのデフォルトのフォントはCourier Newですが、ほかのフォントにしたい人もいるでしょう。 個人的には、等幅で程よく太くはっきり見えるConsolasのほうが好ましいので、Consolasに設定しています。 フォントやフォントサイズを変更するには、WinDbgのメニューから「View」を選択し、「Font...」を開きます。 フォントやフォントサイズを変更するウインドウが表示されるため、好きな設定にして「OK」を押しましょう。
最終的なWorkspaceは以下のスクリーンショットのようにしました。
背景色、文字色を変更する
背景色と文字色を変更するには、WinDbgのメニューから「View」を選択し、「Options...」を開きます。 ウインドウの下部に「Color」という欄があるため、背景色を変更する場合は「Background」を、文字色を変更する場合は「Text」を選択します。 ウインドウ右下の「Change」をクリックすると、色のリストが表示されるため、好きな色を選択しましょう。
Workspaceを保存する
Workspaceが完成したらWEWファイルとして保存しましょう。 WinDbgのメニューから「File」を選択し、「Save Workspace to File...」を開き、保存先を指定して保存します。
作成したWorkspaceをデフォルトに設定する
WinDbgを再起動してnotepad.exeをアタッチすると、以下のスクリーンショットのようにデフォルトのWorkspaceが起動し、自分で作成したWorkspaceでは起動されないでしょう。
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が起動します。
プラグインを入れる
快適にデバッグをするために、他の技術者が公開しているプラグインを導入したいという場合があるでしょう。 本記事ではNarlyというプラグインを用いて、WinDbgへのプラグインを解説します。 Narlyはデバッグ対象のプログラムとそれに読み込まれているDLLの保護機能の設定状況などを調べるためのプラグインです。 以下のWebページにて公開されています。
ダウンロードページに移動して、好きなバージョンのアーカイブファイルをダウンロードし、プラグインを導入したい環境に移動します。 アーカイブファイルを展開すると、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 ......