ETW (Event Tracing for Windows) で挙動解析(新型32ビット版「UsaMimi32.exe」および64ビット版「UsaMimi64.exe」用)

  この機能は、プログラム解析において有用なETW (Event Tracing for Windows) という仕組みを使って、対象プロセスの各種挙動を解析するものです。

ETW (Event Tracing for Windows) で挙動解析 解説ページ

デバッグ文字列出力を監視

  解析対象プロセスやその他のプロセスがOutputDebugString関数で出力したデバッグ出力文字列を表示します。デバッガとしてのアタッチは行いません。

この機能は、ドライバが出力するデバッグ文字列の表示には対応していません。この場合は出力されたデバッグ文字列の取得にもドライバが必要となるため、需要その他を勘案し対応は見送りました。

デバッグ文字列出力結果リストで表示される時刻情報は、API関数の仕様によりミリ秒の単位でみればさほど精度の高いものではありません。

この機能は、「Kernel32.DLL/Ntdll.DLLモジュール書き替えによるAPIフックを解除」「SDT(Service Descriptor Table)書き替えによるAPIフックを解除」とは併用しないで下さい。当ソフトウェアがフリーズする可能性があります。この場合は、当ソフトウェアを2重起動して、APIフック解除とデバッグ文字列取得を別個に行ってください。

画面説明


●オプション

他のプロセスが出力したデバッグ文字列も表示する
現在オープンしているプロセス以外のプロセスもデバッグ文字列出力の監視対象に設定します。

強調条件文字列
「強調条件文字列」はデバッグ文字列の先頭に付加される文字列を指します。任意の強調条件文字列を指定して条件を振り分けることで、プログラム開発時にデバッグ出力文字列の絞り込みや視認性を高めることが可能になります。

選択強調条件に該当するデバッグ文字列のみ表示する
「強調条件文字列」1~3のうち、チェックが入れられたものに該当するデバッグ出力文字列のみ表示します。

PIDをプロセス名に変換して表示する
デバッグ文字列出力を行ったプロセスのPIDをプロセス名に変換して表示します。プロセスの作成や終了に伴い、PIDが別のプロセスで再利用されるケースに対処するため、プロセス名への変換はデバッグ文字列出力の都度行っています。

●モニター開始・停止
モニター開始
デバッグ文字列出力の監視を開始します。不要なデバッグ文字列の表示を避けるために、デバッグ文字列出力の監視は任意のタイミングで開始できるようにしました。

モニター停止
デバッグ文字列出力の監視を停止します。

リストクリア
デバッグ文字列出力結果リストの全内容を消去します。

●ポップアップメニューによるリスト操作(デバッグ文字列出力結果リスト上で右クリック)
全ての列を選択
全ての列を選択します。

全ての列の選択を解除
全ての列の選択を解除します。

選択された列を削除
選択列を削除します。

選択されていない列を削除
選択されていない列を削除します。

フォーカスがある選択列より上の列を削除
フォーカスがある選択列より上の列を全て削除します。

フォーカスがある選択列より下の列を削除
フォーカスがある選択列より下の列を全て削除します。

選択列の内容をエクスポート
選択列の内容をテキスト形式でエクスポートします。エクスポート時は、「,」と改行で各項目を区切って出力します。

全ての列の内容をエクスポート
全ての列の内容をテキスト形式でエクスポートします。エクスポート時は、「,」と改行で各項目を区切って出力します。

選択列の内容をクリップボードにコピー
選択列の内容をテキスト形式でクリップボードにコピーします。コピー時は、タブと改行で各項目を区切って出力します。

全ての列の内容をクリップボードにコピー
全ての列の内容をテキスト形式でクリップボードにコピーします。コピー時は、タブと改行で各項目を区切って出力します。

文字列を検索
デバッグ文字列出力結果リスト上の全メッセージに対して文字列の検索を行います。

PEB/TEB表示

  対象プロセスがプロセスメモリ上に保持する、プロセスやスレッドの情報を格納した構造体を表示します。PEBは「Process Environment Block」、TEBは「Thread Environment Block」の略称です。

PEB/TEB構造体のメンバである各項目を左クリックすると、同項目のアドレスでダンプ表示ウィンドウでの表示アドレスを変更します。また、右クリックすれば、その項目の格納値がプロセスの有効アドレスである場合に限り同表示アドレスを変更します。

表示されたリストでカラム(「メンバ」・「アドレス」・「値」と表示されている上端部分)の境界線をダブルクリックすると、「メンバ」や「値」の項目で長さが最大字数のものでも表示できるように、項目部分の長さが変更されます。例えば文字「値」の右側にある境界線をダブルクリックすると、値が8バイトのものでも数値文字列全部が表示されるように「値」項目の長さが変更されます。

PEB/TEBは、OSのバージョンやサービスパックによって、構成する項目が変更されることがあります。当方で色々な資料を参照して正しい内容を表示できるよう努めていますが、使用環境によっては表示項目が正しくない可能性があること、ご了承願います。

この機能はWindows9x/Meでは使用できません。

ヒープリスト表示

  この機能では、「HeapWalk」、プロセスメモリトレースおよび「Tool Help API」の3種類の方法で取得した、ヒープに関連する情報を表示します。ヒープ一覧では、左側リストビューにヒープと各ヒープに含まれるセグメントをリストアップします。

リスト中のヒープを選択すると、そのヒープに含まれるセグメントやメモリブロックを右側リストビューに列挙します。「MemTrace」モードの場合は、ヒープではなくセグメントを選択すると、その中に含まれるメモリブロックを列挙します。ただし、Windows Vista以降では、「MemTrace」モードでのメモリブロックの正確な列挙ができません。左側リストビューでの選択可能な項目は、背景色が青色で表示されます。

一つのヒープを構成するセグメントは、複数になることもあります。この場合、2番目以降のセグメントは、ヒープ先頭アドレス(≒1番目のセグメントのアドレス)とは関係がない、全く異なるアドレスとなる可能性に注意してください。

この機能は、Windows95/98/Meでは使用できません。

.NET パフォーマンスカウンタ表示

  この機能では、対象プロセスが使用する .NET CLR(共通言語ランタイム)に関する、実行状況を示すパフォーマンスカウンタ情報を表示します。この機能は、.NET Frameworkを用いる、いわゆる「.NET アプリケーション」専用の機能です。実行環境によっては、当ソフトウェアを管理者権限で起動しないと、この機能が使用できません。

画面左側にあるリストビューでカテゴリを選択すると、そのカテゴリに属するカウンタ情報を右側リストビューに表示します。「.NET CLR Memory」カテゴリでは、参考情報として仮想メモリの使用状況も表示します。表示されたカウンタ情報は、カテゴリを変更するか、カウンタを表示する右側リストビュー上の任意の場所でダブルクリックすれば、最新のカウンタ情報で更新されます。

基本的に、カウンタ情報の取得時には、当ソフトウェアでオープンしているプロセスの識別子(プロセスID)と、カウンタ側に属するプロセスIDを比較して、表示するカウンタを特定します。一部の.NET アプリケーションでは、カウンタ情報に属するプロセスIDが取得できないという問題があります。この場合、プロセス名(拡張子を除く実行可能ファイル名)を基に表示するカウンタを特定します。そのため、プロセスIDが取得不可でしかも複数の同名プロセスが起動しているならば、最初に見つかった同名プロセスのカウンタを表示することになりますので注意が必要です。当機能を再起動すると、複数の同名プロセスが起動している状況でも、正確に表示するカウンタを特定できることがあります。

[パフォーマンスブラウザ起動]ボタンは、.NET CLR を含む、システム全体の各種パフォーマンスカウンタ情報を取得するためのものです。オブジェクト、カウンタおよびインスタンスを選択することで、特定パフォーマンスカウンタの情報が取得可能になります。パフォーマンス情報を取得するための、システムが保有するデータに破損等の問題が生じていると、カウンタ情報の大半が取得できません。

この機能は、Windows95/98/Meでは使用できません。

メモリ領域操作を監視

  解析対象プロセスが行うメモリ領域の作成・確保・解放・破棄を監視し、その情報を表示します。

この機能は古いWindows用です。Windows 7以降では、当ソフトウェア同梱のプロセスモニター「猫原喜雨」を使用してください。

この機能は、Windows 7以降ではOSの処理と競合が生じ安定した実行が見込まれないため、対象OSはWindows 2000/XP/Vistaとなります。また、対象OS上においても、監視対象プロセスの実行状況によっては、当機能使用時に対象プロセスの不正終了など不具合を招く可能性があります。

この機能は、上記「ヒープリスト表示」機能とは併用しないで下さい。対象プロセスがフリーズする可能性があります。


基本的には、API関数呼び出し時の引数や戻り値の表示は、当機能よりもIAT書き換えによるAPIフックや仲介DLLを製作した方がより安全に行うことが可能です。当機能は、IAT書き換えや仲介DLLでは対応できない、パッカー使用やEXEファイル改ざんチェックがあるケースへの対処を想定して実装しました。しかし、上述のとおり、動的なAPIフックに伴い、対象プロセスの実行状況によっては動作不安定になるケースがあります。特にHeapAlloc/HeapFree/HeapReAlloc関数への動的なAPIフックが動作の不安定化を招きやすいため、これらのAPI関数へのフックを除外するオプションを用意しています。

当機能を使用して、対象プロセスが起動直後に行うメモリ領域確保処理を捕捉するには、対象プロセスをエントリーポイントで停止した状態で起動させ(参照)、その時点で当機能での監視処理を開始する必要があります。

プログラムの処理として作成・確保されるメモリ領域とは別に、プロセス起動時点でOSによって自動的に確保され、プログラムが使用可能なメモリ領域である、EXEモジュールのデータセクション該当領域や、デフォルトヒープがあることに注意が必要です。

当機能では一般的に用いられるメモリ領域操作用API関数を監視します。メモリ領域操作に用いられる関数は、他にもGlobalAlloc関数やCoTaskMemAlloc関数などがあります。
画面説明


●オプション
監視用DLL名
メモリ領域操作監視に使用するAPIフック用のDLL名を指定します。

リスト表示対象API種別指定
監視対象とするAPI関数群を指定します。
・Heap系:HeapCreate, HeapAlloc, HeapReAlloc, HeapFree, HeapDestroy関数
(「Alloc系除外」で、安全のためHeapAlloc/HeapFree/HeapReAlloc関数を監視対象から除外)
・Virtual系:VirtualAlloc(確保時のみ), VirtualFree関数
・FileMap:CreateFileMappingA, CreateFileMappingW関数(ともに共有メモリ確保時のみ)

対象サイズ範囲指定
メモリ領域操作時の領域サイズで、メモリ領域操作結果の表示を絞り込みます。このオプションがオンならば、対象サイズ外のメモリ領域操作は表示されません。メモリ領域サイズは10進数あるいは「0x」接頭辞を使用して16進数で指定可能です。

CALL元モジュール指定
メモリ領域操作を行うモジュールを指定して、メモリ領域操作結果の表示を絞り込みます。このオプションがオンならば、対象モジュール以外のメモリ領域操作は表示されません。

除外CALL元アドレス指定
メモリ領域操作結果の表示を絞り込むために、不要なアドレスでのメモリ領域操作を表示しないようにします。このオプションがオンならば、[CALL元アドレス追加]ボタンで追加されたアドレスでのメモリ領域操作は表示されません。除外CALL元アドレスのリスト上でアドレスをダブルクリックすると、そのアドレスをリストから削除します。

デバッグ文字列で出力
メモリ領域操作結果をデバッグ文字列で出力します。このオプションは、実行権限の問題等で当ダイアログ上での表示ができないケースを想定しています。ダイアログ右下の[デバッグ文字列表示]ボタンで、デバッグ文字列の出力を監視する専用ダイアログを表示します。

●監視開始・終了
アタッチ・監視開始
メモリ領域操作の監視を開始します。

デタッチ
メモリ領域操作の監視を終了します。対象プロセスの実行状況によっては、このデタッチ処理で対象プロセスが不正終了する可能性があります。

終了
当機能を終了し、ダイアログを閉じます。

●リスト表示・ダイアログ表示
リスト表示を中断
デタッチを行わず、メモリ領域操作結果の表示だけを停止します。

破棄・解放分を自動削除
HeapCreate関数呼び出しに対する、HeapDestroy関数呼び出しといった、破棄・解放用API関数が呼び出された場合に、対応するメモリ領域の作成・確保を行ったAPI関数呼び出し分をリスト上から削除します。

全リストクリア
リスト上の表示内容を全て削除します。

相対アドレス表示
リスト上で選択されているメモリ領域先頭アドレスによる、ダンプ表示画面上での相対アドレス指定をトグルします。

リージョン検索
リージョン検索用ダイアログを表示します。

表示アドレス指定
ダンプ表示画面上での表示アドレスを指定するダイアログを表示します。

デバッグ文字列表示
デバッグ文字列の出力を監視する専用ダイアログを表示します。

Copyright © 2025 Digital Travesia