All Articles

Magical WinDbg VOL.1【1 章 環境構築】

本章では、本書で使用する環境構築の手順について紹介します。

なお、本書では Home エディションの Windows マシンを利用している読者の環境を想定しているため、1 章で紹介する環境構築手順では仮想マシンを使用しませんが、本書で紹介している設定の適用やツールのインストールを行う場合には、可能な限り仮想マシンの利用を推奨いたします。(Windows 10 / 11 の Home エディションを利用する場合でも、Virtual Box や VMWare などのサードパーティ製の仮想化アプリケーションを使用することは可能です)

もくじ

本書で使用する環境について

本書の内容については、以下の環境で確認を行っています。

まず、本書で使用する環境は以下の通りです。

  • 端末: ThinkPad X280(CPU: Intel i7-8550U / RAM: 16 GB / SSD: 256 GB)
  • OS : Windows 10 Pro 22H2

本書で使用する環境は上記ですが、端末と OS を合わせていただく必要はありません。

ただし、快適に操作を行うためにも CPU は Intel Core i3 以上、RAM は 8 GB 以上の端末を使用することを推奨します。

なお、Windows OS のバージョンやエディションについては指定はありません。

最新の再頒布可能パッケージをインストールする

まず、以下の URL からダウンロードできる vc_redist.x64.exe を実行して、仮想マシンに最新の再頒布可能パッケージをインストールします。


vc_redist.x64.exe:

https://aka.ms/vs/17/release/vc_redist.x64.exe


この再頒布可能パッケージのインストールは、本書で使用する D4C.exe というプログラムを実行するために使用します。

Debugging Tools for Windows のインストール

続けて Windows ダンプ解析を行うマシンに Debugging Tools for Windows をインストールします。

Debugging Tools for Windows には、WinDbg1 などのデバッガや、GFlags2 のような Windows 環境のトラブルシューティングに役立つツールが含まれています。

Debugging Tools for Windows をインストールする方法はいくつかありますが、本書では Windows SDK (10.0.22621) を使用して Debugging Tools for Windows のインストールを行います。

まずは、以下の URL で Windows SDK のダウンロードページにアクセスし、[Download the installer] から winsdksetup.exe をダウンロードします。


Windows SDK:

https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/ 3


続いて、ダウンロードした winsdksetup.exe をダブルクリックして実行します。

Debugging Tools for Windows のインストール

デフォルト設定のままインストーラの指示に従っていくと、最後にインストールするパッケージの選択画面が表示されます。

ここではどの項目をダウンロードしても問題ありませんが、必ず [Debugging Tools for Windows] にチェックが入っていることを確認してください。

Debugging Tools for Windows のインストール

[Debugging Tools for Windows] にチェックが入った状態でインストーラを実行します。

インストーラの実行が完了したら、C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 内に windbg.exe と gflags.exe が存在することを確認します。(本書では使用しませんが、x86 用の windbg.exe は C:\Program Files (x86)\Windows Kits\10\Debuggers\x86 内に存在します)

これらのプログラムは頻繁に使用するため、必要に応じてショートカットを作成しておくと良いでしょう。

ちなみに、WinDbg には、最新の Windows アプリ版の WinDbg が存在します。

Windows アプリ版の WinDbg は、本書で使用する WinDbg(Classic) と比較してよりモダンな UI や、Time Travel Debugging(TTD) などの協力な機能を利用できます。

本書では Windows アプリ版の WinDbg は使用しませんが、ダンプ解析に使用する機能やコマンドなどは WinDbg(Classic) と同一です。

そのため、ダンプの解析のために Windows アプリ版の WinDbg を利用いただいても問題ありません。

Windows アプリ版の WinDbg

なお、以下のドキュメントに記載されている通り、Microsoft Store からダウンロード可能な「WinDbg Preview」は既に更新を終了している点に注意が必要です。


Windows デバッガーをインストールする:

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/


Windows アプリ版の最新の WinDbg を入手するには、上記のドキュメント内のリンクからダウンロード可能なインストーラを使用します。

Sysinternals ユーティリティのインストール

次に、Process Monitor4 や Process Explorer5 などの便利なツールを含む Sysinternals6 を取得します。

これらのツールについて、本書では詳しい説明は割愛します。

詳しく知りたい方は公式ドキュメントや「Windows Sysinternals徹底解説」7 などが参考になると思います。

これらのツールをまとめてインストールするため、以下の URL にアクセスして [Sysinternals Suite] をクリックします。


Sysinternals ユーティリティ:

https://learn.microsoft.com/ja-jp/sysinternals/downloads/


ここからダウンロードした ZIP ファイルを解凍することで、Process Monitor や Process Explorer などのツールを利用できるようになります。

Ghidra 2.3 のインストール

次に、リバースエンジニアリングツールの Ghidra 2.38 のセットアップを行います。

Ghidra の詳細や詳しい利用方法については本書では解説しませんが、Ghidra に同梱されている Help や、「リバースエンジニアリングツール Ghidra 実践ガイド」9 や「マスタリング Ghidra」10 などの書籍が参考になると思います。

Ghidra のセットアップのため、以下の Github の Release ページから Ghidra 10.2.3 のパッケージ (ghidra_10.2.3_PUBLIC_20230208.zip) をダウンロードし、解凍しておきます。


Ghidra Release Page:

https://github.com/NationalSecurityAgency/ghidra/releases


続いて、Ghidra を実行するために必要な JDK 17 をインストールするため、以下のダウンロードページから Windows x64 用の MSI Installer をダウンロードします。


Java Downloads:

https://www.oracle.com/jp/java/technologies/downloads/#jdk17-windows


ダウンロードした JDK 17 の MSI インストーラを実行し、JDK 17 のインストールを完了します。

インストールの完了後、展開した ghidra_10.2.3_PUBLIC_20230208.zip 内の ghidraRun.bat をダブルクリックして Ghidra を起動します。

Ghidra のセットアップ

Ghidra の起動が完了したら、[File]>[New Project] から任意の名称の Project を作成しておきましょう。

D4C のダウンロード

本書で解析に使用するダンプファイルの生成に使用するツール D4C.exe(v0.1) を以下のリポジトリからダウンロードします。


D4C Release Page:

https://github.com/kash1064/garyu-windbg/releases/tag/v0.111


なお、本書ではバイナリやダンプの解析にシンボルファイルは使用しないため、D4C.pdb ファイルについては初めはダウンロードしないことを推奨します。

ダンプファイル取得とキーボードクラッシュの設定

次に、ダンプファイルを取得するマシンでフルメモリダンプの取得設定とキーボードクラッシュの有効化を行います。

設定は簡単で、先ほど共有フォルダに配置した D4C.exe を仮想マシンのローカルフォルダにコピーして実行し、最初のメニューで 0 を入力して Enter キーを押すだけです。

D4C.exe を使用した設定変更

これで、OS を再起動すると、フルメモリダンプの設定とキーボードクラッシュの設定が有効化されます。

ちなみに、D4C.exe では以下の PowerShell スクリプトを実行した場合と同等の設定を行います。

# Settings of Full memory dump
$crashControlRegPath = "HKLM:System\CurrentControlSet\Control\CrashControl"
$isExistKey = Test-Path -LiteralPath $crashControlRegPath
if ($isExistKey -eq $False) {
	New-Item -Path $crashControlRegPath
}
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "CrashDumpEnabled" -PropertyType "DWord" -Value "1" -Force
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "AutoReboot" -PropertyType "DWord" -Value "1" -Force
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "DumpFile" -PropertyType "ExpandString" -Value "%SystemRoot%\FULL_MEMORY.DMP" -Force
New-ItemProperty -LiteralPath $CrashControlRegPath -Name "LogEvent" -PropertyType "DWord" -Value "1" -Force

# Settings of Full application dump
$localDumpsRegPath = "HKLM:SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
$isExistKey = Test-Path -LiteralPath $localDumpsRegPath
if ($isExistKey -eq $False) {
	New-Item -Path $localDumpsRegPath
}
New-ItemProperty -LiteralPath $localDumpsRegPath -Name "DumpFolder" -PropertyType "ExpandString" -Value "%LOCALAPPDATA%\CrashDumps" -Force
New-ItemProperty -LiteralPath $localDumpsRegPath -Name "DumpCount" -PropertyType "DWord" -Value "2" -Force
New-ItemProperty -LiteralPath $localDumpsRegPath -Name "DumpType" -PropertyType "DWord" -Value "2" -Force

# Disable CrashOnCtrlScroll
$parameterRegPaths = @("HKLM:System\CurrentControlSet\Services\i8042prt\Parameters",
					  "HKLM:System\CurrentControlSet\Services\kbdhid\Parameters",
					  "HKLM:System\CurrentControlSet\Services\hyperkbd\Parameters"
					)
foreach ($parameterRegPath in $parameterRegPaths) {
	$isExistKey = Test-Path -LiteralPath $parameterRegPath
	if ($isExistKey -eq $False) {
		New-Item -Path $parameterRegPath
	}
	New-ItemProperty -LiteralPath $parameterRegPath -Name "CrashOnCtrlScroll" -PropertyType "DWord" -Value "0" -Force
}

# Setting alt dump key
$parameterRegPaths = @("HKLM:System\CurrentControlSet\Services\i8042prt\crashdump",
					  "HKLM:System\CurrentControlSet\Services\kbdhid\crashdump",
					  "HKLM:System\CurrentControlSet\Services\hyperkbd\crashdump"
					)
foreach ($parameterRegPath in $parameterRegPaths) {
	$isExistKey = Test-Path -LiteralPath $parameterRegPath
	if ($isExistKey -eq $False) {
		New-Item -Path $parameterRegPath
	}
	New-ItemProperty -LiteralPath $parameterRegPath -Name "Dump1Keys" -PropertyType "DWord" -Value "0x2" -Force
	New-ItemProperty -LiteralPath $parameterRegPath -Name "Dump2Key" -PropertyType "DWord" -Value "0x3d" -Force
}

# Change PageFileSize
$totalPhysicalMemSize = $([Math]::Round((Get-WmiObject Win32_OperatingSystem).TotalVisibleMemorySize / 1024))
$freeStorageSizeofC = $([Math]::Round(((Get-PSDrive C).Free / 1024 / 1024)))
$pageFileSize = $totalPhysicalMemSize + 400
$pageFileSetting = "c:\pagefile.sys $pageFileSize $pageFileSize"
if (($freeStorageSizeofC -gt $pageFileSize) -eq $True) {
	New-ItemProperty -LiteralPath "HKLM:System\CurrentControlSet\Control\Session Manager\Memory Management" -Name "PagingFiles" -PropertyType "MultiString" -Value $pageFileSetting -Force
} else {
	Write-Warning "C drive space is too small."
}

上記の設定手順では、大きく以下の 4 つの設定を行っています。

  1. システムクラッシュ時に出力するダンプの種類をフルメモリダンプに変更
  2. ページファイルのサイズを「物理メモリのサイズ + 400 MB」に変更
  3. アプリケーションクラッシュ時に出力するプロセスダンプの種類をフルダンプに変更
  4. 「右 Ctrl + Space キー 2 回」の操作でのシステムクラッシュを有効化

現在の Windows システムにてアプリケーションクラッシュ時にプロセスダンプを取得する場合、フルダンプよりもすべての情報を取得するオプションを設定して取得したミニダンプの方が多くの情報を収集できます。12

ただし、基本的にはフルダンプの設定で十分な情報を収集できますので、本書ではより直感的にイメージしやすいように、アプリケーションクラッシュ時に出力するプロセスダンプの種類はフルダンプを選択しています。

また、システムクラッシュ時に取得できるフルメモリダンプには、その端末で稼働する Windows システムがアクセス可能なすべての物理メモリ内のページ情報が全て含まれます。

ただし、フルメモリダンプを取得する際には、最小で「物理メモリのサイズ + 1 MB」のサイズのページファイルを構成する必要があります。

これは、物理メモリ内のすべての情報をダンプファイルとして出力するために必要な設定です。

なお、安全にフルメモリダンプを取得するためには「物理メモリのサイズ + 1 MB」のサイズに、デバイスドライバのクラッシュデータを含めることができる 256 MB 以上のページファイルサイズをさらに追加しておくことが推奨されています。13

スクリプトの概要については以下の公開ブログでも紹介しているので、D4C.exe ではなく PowerShell スクリプトを手動で実行して設定を行いたい場合には、下記を参照してください。


Power Shell スクリプトで Windows のフルメモリダンプの取得設定とキーボードクラッシュの設定を行う(かえるのひみつきち):

https://kashiwaba-yuki.com/windows-setting-fulldump


マシンでフルメモリダンプを取得してみる

設定が有効に動作していることを確認するためにフルメモリダンプの取得を行います。

[ダンプファイル取得とキーボードクラッシュの設定] の手順を実行した後、再起動したマシンにサインインします。

続けて、キーボードの右 Ctrl キーを押しながら、Space キーを 2 回連打します。

キーボードクラッシュの設定が反映されている場合、上記のキー操作を実施するとシステムがクラッシュし、ブルースクリーン画面が表示されます。

ブルースクリーン(BSOD)

システムの再起動後、C:\Windows フォルダ直下に仮想マシンの物理メモリとほぼ同サイズの FULL_MEMORY.DMP が生成されていれば、フルダンプの設定が有効に動作していると判断できます。

ちなみに、本書の手順で設定したキーボードクラッシュは、 RDP 経由で接続している場合には有効に動作しません。

物理キーボードを使用可能な場合は、ローカルマシンに直接サインインした状態で「右 Ctrl キーを押しながら、Space キーを 2 回連打」することでシステムクラッシュを発生させることが可能です。

また、Hyper-V 仮想マシンを利用している場合には、拡張セッションを無効化した状態でマシンにサインインし、「右 Ctrl キーを押しながら、Space キーを 2 回連打」することでキーボードクラッシュを行うことが可能です。

Virtual Box など、その他の仮想マシンプラットフォームを利用している場合には、ソフトウェアキーボードを使用してキーボードクラッシュを起こすことが可能か試してみてください。

もしキーボードクラッシュを実施できない環境の場合は、[Sysinternals ユーティリティのインストール] でダウンロードした SysinternalsSuite に含まれる notmyfault.exe を使用することでも、意図的にシステムクラッシュを再現することが可能です。

WinDbg と Procmon にシンボルサーバを設定する

WinDbg や Process Monitor(Procmon) などを使用してトラブルシューティングを行う際に適切なシンボルを取得することは非常に重要です。

シンボル14とは、exe や dll などの実行ファイルには含まれない関数や変数の名称などを含む情報です。

WinDbg などのツールを使用する際には、適切なシンボルを取得し参照することで、よりスムーズな解析を行うことが可能です。

一般にダンプファイルの解析で使用するシンボル情報は Microsoft が公開しているシンボルサーバ15から取得できます。

ただし、一部の公開されていないモジュールのシンボル情報や、サードパーティが独自に開発したソフトウェアのシンボル情報は、Microsoft によって公開されているシンボルサーバからダウンロードすることはできません。

なお、解析対象のプログラムがユーザ自身によって開発されている場合は、プログラムのビルド時に生成できる pdb や dbg ファイルをシンボル情報としてデバッガにロードして利用できます。

この項では、Microsoft が公開しているシンボルサーバからシンボル情報を取得するため、WinDbg と Process Monitor の設定を行います。

本書では必要ありませんが、必要に応じて Process Explorer でも同様の設定を実施しておくとよいでしょう。

まずは、WinDbg x64 を管理者権限で起動して、[Ctrl + S] キーを押して Symbol Scratch Path ウインドウを起動します。

起動した Symbol Scratch Path ウインドウに以下を入力して、[OK] をクリックします。

srv*https://msdl.microsoft.com/download/symbols

Symbol Scratch Path ウインドウの設定

設定が完了したら、左上の [File] から [Save Workspace] をクリックします。

これで既定のワークスペースに設定が保存されるため、次回以降の起動時にもシンボルパスの設定が引き継がれます。

次に、[Sysinternals ユーティリティのインストール] で取得した SysinternalsSuite から Procmon64.exe を管理者権限で実行します。

起動した Procmon のウインドウ上部のメニューから [Options]>[Configure Symbols…] をクリックします。

Configure Symbols の設定

既定では、[DbgHelp.dll path(version 6.0 or later)] に C:\WINDOWS\SYSTEM32\dbghelp.dll が登録されています。

しかし、C:\WINDOWS\SYSTEM32\dbghelp.dll は通常はバージョン 6.0 以上の要件を満たさないので、要件を満たす dbghelp.dll のパスを指定する必要があります。

この要件を満たす dbghelp.dll は、[Debugging Tools for Windows のインストール] でインストールした WinDbg x64 などと同じく C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 の直下に配置されています。

そのため、[DbgHelp.dll path(version 6.0 or later)] には以下のパスを指定します。

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbghelp.dll

また、[Symbol paths:] には WinDbg の時と同じく Microsoft のシンボルサーバのアドレスを指定します。

srv*https://msdl.microsoft.com/download/symbols

Procmon にシンボルサーバを設定

これでシンボルサーバの設定は完了です。

1 章のまとめ

この章では、Windows のダンプファイルの解析やトラブルシューティングに必要なツールのセットアップを行いました。

トラブルシューティングのためにダンプファイルの解析を行う場合には、自分が取得したダンプファイルにどのような情報が含まれており、ファイルサイズはどの程度の大きさになるのかなどの情報を事前に把握しておくことが重要です。

また、ダンプファイルには確かに非常に多くの情報が含まれますが、ダンプファイルから参照可能な情報はあくまでそのダンプを取得した一瞬間のメモリ情報のスナップショットに過ぎません。

そのため、より効率的にトラブルシューティングを行うためには、様々な調査ツールを使用して問題の発生前後のシステムの動きをトレースしたり、OS やアプリケーションのログファイルなどを調査する必要があります。

私は、トラブルシューティングの方法に決まった型は存在しないと考えています。

本書は Windows のダンプファイルの解析を中心とした内容ではありますが、皆さんが実際にトラブルシューティングを行う際には、様々なツールや機能を活用して、あらゆる角度からの解析を楽しんでいただければと思います。

各章へのリンク


  1. WinDbg とは https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/windbg-overview?source=recommendations

  2. GFlags https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/gflags

  3. Windows SDK - Windows app development https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/

  4. Process Monitor https://learn.microsoft.com/ja-jp/sysinternals/downloads/procmon

  5. Process Explorer https://learn.microsoft.com/ja-jp/sysinternals/downloads/process-explorer

  6. Sysinternals https://learn.microsoft.com/ja-jp/sysinternals

  7. Windows Sysinternals徹底解説 : 無償ツールで極めるトラブルシューティングテクニック (Mark E. Russinovich・Aaron Margosis 著 / 山内 和朗 訳 / 日経BP社 / 2017 年)

  8. Ghidra https://github.com/NationalSecurityAgency/ghidra

  9. マスタリング Ghidra 基礎から学ぶリバースエンジニアリング完全マニュアル (Chris Eagle, Kara Nance 著 / 石川 朝久 監訳 / 中島 将太, 小竹 泰一, 原 弘明 訳 / オライリー・ジャパン / 2022 年)

  10. リバースエンジニアリングツール Ghidra 実践ガイド セキュリティコンテスト入門からマルウェア解析まで (中島 将太, 小竹 泰一, 原 弘明, 川畑 公平 著 / マイナビ出版 / 2020 年)

  11. garyu-windbg https://github.com/kash1064/garyu-windbg/releases/tag/v0.1

  12. ユーザモードダンプファイル https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/user-mode-dump-files

  13. インサイド Windows 第 7 版 下 P.571 (Andrea Allievi, Mark E.Russinovich, Alex Ionescu, David A.Solomon 著 / 山内和朗 訳 / 日系 BP 社 / 2022 年)

  14. シンボルとシンボルファイル https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/symbols-and-symbol-files

  15. シンボルサーバーの使用 https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/using-a-symbol-server