本章では、本書で使用する環境構築の手順について紹介します。
なお、本書では Home エディションの Windows マシンを利用している読者の環境を想定しているため、1 章で紹介する環境構築手順では仮想マシンを使用しませんが、本書で紹介している設定の適用やツールのインストールを行う場合には、可能な限り仮想マシンの利用を推奨いたします。(Windows 10 / 11 の Home エディションを利用する場合でも、Virtual Box や VMWare などのサードパーティ製の仮想化アプリケーションを使用することは可能です)
もくじ
- 本書で使用する環境について
- 最新の再頒布可能パッケージをインストールする
- Debugging Tools for Windows のインストール
- Sysinternals ユーティリティのインストール
- Ghidra 2.3 のインストール
- D4C のダウンロード
- ダンプファイル取得とキーボードクラッシュの設定
- マシンでフルメモリダンプを取得してみる
- WinDbg と Procmon にシンボルサーバを設定する
- 1 章のまとめ
- 各章へのリンク
本書で使用する環境について
本書の内容については、以下の環境で確認を行っています。
まず、本書で使用する環境は以下の通りです。
- 端末: 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] にチェックが入った状態でインストーラを実行します。
インストーラの実行が完了したら、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 を利用いただいても問題ありません。
なお、以下のドキュメントに記載されている通り、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 の起動が完了したら、[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 キーを押すだけです。
これで、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 つの設定を行っています。
- システムクラッシュ時に出力するダンプの種類をフルメモリダンプに変更
- ページファイルのサイズを「物理メモリのサイズ + 400 MB」に変更
- アプリケーションクラッシュ時に出力するプロセスダンプの種類をフルダンプに変更
- 「右 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 回連打します。
キーボードクラッシュの設定が反映されている場合、上記のキー操作を実施するとシステムがクラッシュし、ブルースクリーン画面が表示されます。
システムの再起動後、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
設定が完了したら、左上の [File] から [Save Workspace] をクリックします。
これで既定のワークスペースに設定が保存されるため、次回以降の起動時にもシンボルパスの設定が引き継がれます。
次に、[Sysinternals ユーティリティのインストール] で取得した SysinternalsSuite から Procmon64.exe を管理者権限で実行します。
起動した Procmon のウインドウ上部のメニューから [Options]>[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
これでシンボルサーバの設定は完了です。
1 章のまとめ
この章では、Windows のダンプファイルの解析やトラブルシューティングに必要なツールのセットアップを行いました。
トラブルシューティングのためにダンプファイルの解析を行う場合には、自分が取得したダンプファイルにどのような情報が含まれており、ファイルサイズはどの程度の大きさになるのかなどの情報を事前に把握しておくことが重要です。
また、ダンプファイルには確かに非常に多くの情報が含まれますが、ダンプファイルから参照可能な情報はあくまでそのダンプを取得した一瞬間のメモリ情報のスナップショットに過ぎません。
そのため、より効率的にトラブルシューティングを行うためには、様々な調査ツールを使用して問題の発生前後のシステムの動きをトレースしたり、OS やアプリケーションのログファイルなどを調査する必要があります。
私は、トラブルシューティングの方法に決まった型は存在しないと考えています。
本書は Windows のダンプファイルの解析を中心とした内容ではありますが、皆さんが実際にトラブルシューティングを行う際には、様々なツールや機能を活用して、あらゆる角度からの解析を楽しんでいただければと思います。
各章へのリンク
- まえがき
- 1 章 環境構築
- 2 章 WinDbg の基本操作
- 3 章 解析に必要な前提知識
- 4 章 アプリケーションのクラッシュダンプを解析する
- 5 章 システムクラッシュ時のフルメモリダンプを解析する
- 6 章 プロセスダンプからユーザモードアプリケーションのメモリリーク事象を調査する
- 7 章 フルメモリダンプからユーザモードメモリリーク事象を調査する
- 付録 A WinDbg の Tips
- 付録 B Volatility 3 でクラッシュダンプを解析する
- ↩
-
GFlags https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/gflags
↩ -
Windows SDK - Windows app development https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/
↩ -
Process Monitor https://learn.microsoft.com/ja-jp/sysinternals/downloads/procmon
↩ -
Process Explorer https://learn.microsoft.com/ja-jp/sysinternals/downloads/process-explorer
↩ -
Sysinternals https://learn.microsoft.com/ja-jp/sysinternals
↩ -
Windows Sysinternals徹底解説 : 無償ツールで極めるトラブルシューティングテクニック (Mark E. Russinovich・Aaron Margosis 著 / 山内 和朗 訳 / 日経BP社 / 2017 年)
↩ -
Ghidra https://github.com/NationalSecurityAgency/ghidra
↩ -
マスタリング Ghidra 基礎から学ぶリバースエンジニアリング完全マニュアル (Chris Eagle, Kara Nance 著 / 石川 朝久 監訳 / 中島 将太, 小竹 泰一, 原 弘明 訳 / オライリー・ジャパン / 2022 年)
↩ -
リバースエンジニアリングツール Ghidra 実践ガイド セキュリティコンテスト入門からマルウェア解析まで (中島 将太, 小竹 泰一, 原 弘明, 川畑 公平 著 / マイナビ出版 / 2020 年)
↩ -
garyu-windbg https://github.com/kash1064/garyu-windbg/releases/tag/v0.1
↩ -
ユーザモードダンプファイル https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/user-mode-dump-files
↩ -
インサイド Windows 第 7 版 下 P.571 (Andrea Allievi, Mark E.Russinovich, Alex Ionescu, David A.Solomon 著 / 山内和朗 訳 / 日系 BP 社 / 2022 年)
↩ -
シンボルとシンボルファイル https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/symbols-and-symbol-files
↩ -
シンボルサーバーの使用 https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/using-a-symbol-server
↩