細かいWinデバッグテクニックのメモ

(12/05)追記したら記事の方向性がわかりやすくなったのでタイトルも変えた(笑

UserDebuggerHotKey

GUIアプリケーションに対してデバッガがアタッチしているとき、このレジストリキーで設定されたキーを押すと、ブレークが発生しデバッグすることができようになる。環境によってはできないこともあるみたい?

.ocommand (WinDbg

  1. WinDbg上でプロセスにアタッチする
  2. .ocommand メタコマンドを実行する
  3. 以後 OutputDebugString のプレフィックス がついているものは 以降がWinDbgコマンドとして解釈される

残念ながら、カーネルランドでは利用できない。

指定したプロセスの起動を置き換える(MSDN

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<もともとのイメージ名>
Debugger="置き換えた先のファイルパス"

キー名で指定したイメージ名を持つプロセスが起動されようとしたとき、代わりに、Debuggerで指定されたプロセスが起動し、引数にもともと起動しようとしたプロセスのフルパスが渡される。
もともとのイメージが起動時に特権ユーザーを要求していても影響はないが、Debugger側が起動時に特権ユーザーを要求する場合、結果的には起動することができない。


[ファイル名を指定して実行]を含めて、起動プロセスが置換されるので結構便利*1。望むなら、cmdとタイプしてpowershellが起動するように設定することもできる。

指定したDLLがロードされる直前にブレークする(Code Project)

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<ブレークしたいDLL名>
BreakOnDllLoad=1 (DWORD)
とすると、デバッガでアタッチしているプロセスが上記で指定したDLLをロードする直前にブレークする。ntdllのコードの中でブレークするので、DLLのコードまではステップ実行する必要がある。

*1:マルウェアが悪用することもあるっぽい。某製品がこのキーの変更を監視してた^^;