WinDbg: 条件付きブレークポイントで「ある関数を経由してきたか」をチェックする方法
条件付きブレークポイント (Conditional Breakpoint) では、よく「引数や変数がある値になっているか」をチェックしますが、「ある関数を経由してきたか」はどうやってチェックすればいいのでしょうか。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 「ある関数を経由してきたか」とは 下図のように、関数 common に至るルートが 4 通りあったとします。 単純に関数 […]
Windows の例外コード(0xC0000005 など)を発生させてみる
Windows のいろいろな例外コード、たとえば 0xC0000005(アクセス違反)や 0xC00000FD(スタックオーバーフロー)を、簡単なプログラムで意図的に発生させてみます。具体的には、次の例外です。 0xC0000005(アクセス違反・リード) 0xC0000005(アクセス違反・ライト) 0xC0000005(アクセス違反・実行) 0xC0000094(ゼロ除算) 0xC000001D(不正な命令) 0xC0000096(特権命令) 0xC0000374(ヒープ破壊) 0xC000 […]
WinDbg: プログラムの実行時にメモリにパッチを当てて動作を変える方法
WinDbg を使ってプログラムの起動直後や実行中にメモリの内容を書き換えプログラムの動作を変える方法について説明します。例として、(1) メッセージを書き換える、(2) ロジックを書き換える、(3) 特定の関数の呼び出しを検出する、を行ってみます。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 メッセージを書き換える プログラムが表示するメッセージを変えてみます。以下は、「He […]
Windows エラー報告の .wer ファイルの読み方
アプリケーションの異常終了時に Windows エラー報告 (Windows Error Reporting; WER) が生成する「Report.wer」ファイルの読み方について簡単に説明します。生成される場所は「%ProgramData%\Microsoft\Windows\WER\ReportArchive」フォルダ内で、中身は単なるテキストファイルです。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 EventType […]
このヒープメモリはいったい誰が確保したものなのか、を調べる方法(Windows, C 言語)
メモリリークの故障解析などで、「このアドレスのヒープメモリはいったい誰が確保したものなのか」を知りたくなる場合があると思います。そんなときは Windows の設定を変更しておくと、メモリ確保時の呼び出し履歴が自動的に記録されます。 動作確認環境 Windows 11 Home 22H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 GFlags (Global Flags) GFlags で設定変更 まず、WinDbg と一緒にイン […]
動作中のプロセスのダンプファイルを取得する方法 3 つ
動作中のプロセスのダンプファイルを取得する方法、具体的には次の方法について説明します。 タスクマネージャーを使う(GUI) ProcDump を使う(コマンドライン) 自作プログラムを使う 例外発生時に自動的にダンプファイルを取得する方法ではありません。また、カーネルダンプではなくユーザーダンプの話です。 動作確認環境 Windows 11 Home 22H2 Visual Studio Community 2022 (Visual C++) ProcDump v11.0 タスクマネージャーを使 […]
アプリケーションが例外をキャッチしなかったらどうなるか
アプリケーション内で発生した Null Pointer Exception などの例外をアプリケーション自身が捕捉(キャッチ)しなかった場合、デバッガが起動したりダンプファイルが生成されたりしますが、この動作がどうなっているのか追ってみます。 動作確認環境 Windows 11 Home 22H2 Visual Studio Community 2022 (Visual C++) 例外発生プログラムを作成 調査のため、3 秒後に NULL ポインタ例外(Null Pointer Exceptio […]
WinDbg: ダンプファイルの解析をしたいがオフライン環境のためシンボルファイルがダウンロードできないとき
ダンプファイル(メモリダンプ, .dmp ファイル)を解析したいがデバッグ環境がインターネットから切り離されているため OS のシンボルファイル(デバッグ情報ファイル, プログラムデータベース、.PDB ファイル)がダウンロードできない場合、どこか別のオンライン環境にて適切なシンボルファイルをダウンロードして持ってくる必要があります。その方法についていくつか説明します。 動作確認環境 Windows 11 Home 22H2 WinDbg 10.0 ダンプファイルを別環境に持っていき WinDb […]
いまはもう動かないキーロガーの記録
その昔秋葉原で買ったものの動かなくなってしまったハードウェアキーロガーについて、廃棄する前に写真や使い方などを記録しておきます。 動作確認環境 Windows 11 Home 22H2 ハードウェアキーロガーの動作 ハードウェアキーロガーとは、外付けキーボードとパソコンの間に接続するキー入力記録装置です。下の写真は 2011 年に秋葉原で購入したものです。いまは秋葉原でキーロガーを入手することはできないと思いますが、そのときはレジの上だったか横だったかのパネルに普通にぶら下がっていました。 価格 […]
ソフトウェアブレークポイントとハードウェアブレークポイントの違い
ソフトウェアブレークポイントとハードウェアブレークポイント(プロセッサーブレークポイント, データブレークポイント)の違いを、Visual C++ や WinDbg を使いながら見てみます。 動作確認環境 Windows 11 Home 22H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 ソフトウェアブレークポイントとは ソフトウェアブレークポイントは、プログラムのコード(マシン語)を一時的にデバッグ用のトラップ命令に書き換えるこ […]