
Windowsの「ネイティブ」API向けのstrace風プログラム
参照: http://rogerorr.github.io/NtTrace/
ターゲットとするアプリケーションに合わせて、NtTrace の 64 ビット版と 32 ビット版のいずれか、または両方が必要です。
scripts\build-vs-x64.bat または scripts\build-vs-x86.bat を実行します。または
nmake /f NtTrace.mak を実行しますまたは
nmake /f NtTrace.mak を実行しますNtTrace はコマンドラインから実行するように設計されています。
必要に応じて引数を付けてプログラムを実行するために使用できます。
例:
NtTrace -filter File cmd /c echo hello
または、PID を指定して既存のプロセスにアタッチしたり、-a オプションを使用して名前でアタッチしたりすることもできます。
例:
NtTrace 1234
または
NtTrace -a notepad
完全なオプションの一覧については NtTrace -h を実行してください。
既定では、NtTrace は NtDll.dll を介して公開される Windows ネイティブ API を対象とします。
Windows グラフィックスインターフェイスをサポートする多くのエントリポイント用の構成ファイルも提供されています。
Gdi32Trace.cfg は Graphics Device Interface 用です。
User32Trace.cfg は User Interface 用です。
既定の NtTrace.cfg の代わりに、-config コマンドライン引数を使用して、これらのいずれかを選択できます。
Windows には system32 ディレクトリに DbgHelp.dll が同梱されています。ただし、この DLL の新しいバージョンが Microsoft の SDK で利用できる場合もあります。
OS と共にインストールされた DLL のバージョンは、ダウンロードされる新しいバージョンよりも優先される傾向があります。
システムディレクトリにインストールされているものより新しいバージョンが必要だとわかった場合は、新しい方の DbgHelp.dll を NtTrace.exe と同じディレクトリにコピーするだけです。(SymSrv.dll と SrcSrv.dll もコピーする必要があります)
NtTrace は、Windows デバッグインターフェイスを使用して、カーネルへの Windows ネイティブ呼び出しの周囲の NtDll にブレークポイントを配置します。ブレークポイントがヒットするたびに、NtTrace は関連する呼び出しに渡された引数/返された値を読み取ります。
ユーザーレベルで動作し、特定のプロセス(およびその子プロセス)にのみ影響します。カーネルに入ろうとはしません。これは意図的な設計判断であり、管理者権限やデバイスドライバをインストールする権限を必要とせずにツールを使用できることを意味します。ただし、これはツールが以下を捕捉できないことも意味します:
また、NtTrace は既定では、最初に起動したプロセスの子プロセスもトレースします。-pid オプションは各出力行にプロセス ID を追加し、どのプロセスがどの呼び出しを行ったかを識別するのに役立ちます。-only オプションは子プロセスのトレースを抑制します。
また、マルチスレッドアプリケーションにも対応しています(-tid オプションは、どのスレッドが各呼び出しを行っているかを識別するのに役立ちます)。ただし、Windows デバッグインターフェイスはイベントベースであるため、複数のスレッドが同時に呼び出しを行うと、トレースが直列化されることに注意してください。
既定では NtDll 内の呼び出しがトレースされます。Gdi32 と User32 の構成ファイルは、異なるターゲット DLL を選択します。NtTrace は現在、異なる種類のシステムコールを同時にトレースすることはサポートしていません。
ネイティブ呼び出しの構成は NtTrace.cfg に保持され、このファイルはプログラムの起動時に解析されます。Windows のバージョンによって、サポートされる呼び出しのセットが異なることに注意してください。
ネイティブ関数の一部は Microsoft によって正式に文書化されていますが、多くは文書化されていません。(ほぼ)完全なリストは、関数の調査と ReactOS などの Web サイトからの情報を組み合わせて作成されました。
各関数はカテゴリに割り当てられており、関数名(部分一致)と関数カテゴリでフィルタリングできます。
既定では、NtTrace はシステムコールからの復帰時にトレースしますが、-pre オプションを使用すると呼び出し前もトレースできます。これは、例えば、同じ構造体がリクエストバッファとレスポンスバッファの両方に使用される場合に役立ちます。