モジュール情報・逆アセンブル
モジュール情報・逆アセンブル 目次
●モジュール別参照関数表示●指定メモリエリアでIAT検索
●選択範囲を逆アセンブル
●モジュールを逆アセンブル
●PeRdrでプロセスの実行ファイルを逆アセンブル
●dispeでプロセスメモリ上のメインモジュールを逆アセンブル
●パラサイトルーチン作成
●.NET Frameworkのマネージドコードを注入して実行
モジュール別参照関数表示
現在開いているプロセスで使用されているモジュールの一覧を表示します。また、モジュール一覧中から選択したモジュールがインポート・エクスポートしている関数を一覧表示します。 パッカーが使用されているといった理由により、この機能でインポート関数が表示できない場合は、メニューから[デバッグ]→[指定メモリエリアでIAT検索]で対処してください。 インポート関数やエクスポート関数がコンパイラによってマングリング(コンパイルにおいて特定関数を正確に識別するために行われる関数名の修飾)をされている場合は、[修飾除去]ボタンでデマングル(関数名の修飾を除去)後の関数名を表示可能なケースがあります。なお、インポート関数のデマングル後の関数名は、上記[指定メモリエリアでIAT検索]でも表示可能です。併せて[修飾除去]ボタン押し下げ時には、名前が「api-ms-win-」や「ext-ms-win-」で始まる、仮想的なDLL(ApiSet Stub DLL)の名前を実際のDLL名に修正します。 |
●画面説明 |
指定メモリエリアでIAT検索
メモリマップ上で指定したメモリエリア(リージョン)内で、IAT(Import Address
Table)を検索します。このIAT検索処理は、対象プロセスが使用する各モジュールのPEヘッダの内容には依存しません。そのため、パッカー使用などで本来のIATがPEヘッダから辿れないケースにも対処可能です。ただし、一部のパッカーは本来のIATも隠蔽のために書き換えてしまうので、検索できないケースもあります。 参考までに、Windows XP SP2以降では、任意のポインタの暗号化と復号化を行う以下のAPI関数が追加されています。IATを暗号化・復号化するためのAPI関数ではありませんが、このようなAPI関数が存在することは覚えておいたほうが良いと思われます。 EncodePointer DecodePointer EncodeSystemPointer DecodeSystemPointer 検索により発見されたIATで参照しているAPI関数が、別のAPI関数にリダイレクトされる「関数フォワーダ」の場合は、リダイレクト先のAPI関数名が表示されます。他にも、状況によっては、一般的な参照関数取得処理では取得できないAPI関数名が表示できることがあります。さらに、インポート関数がコンパイラによってマングリング(コンパイルにおいて特定関数を正確に識別するために行われる関数名の修飾)をされている場合は、デマングル(関数名の修飾を除去)後の関数名を表示可能なケースがあります。 遅延ロードされたDLLに対応するIATの場合は、該当するAPI関数が一度実行されIATが関数開始アドレスで上書きされているならば、そのAPI関数名を取得可能です。 MessageBoxA関数など一部のAPI関数は、IAT内の同関数アドレスが、Windows OSによりapphelp.dll(互換性に関連するシステムDLL)内の関数アドレスに書き換えられるケースがあります。この場合は後述の検索モード「API関数アドレス(近似を含む)」で検索すれば、IAT書き換え箇所を取得できる可能性があります。なお、このIAT内アドレスを書き換えられたAPI関数は、当機能での検索結果とPEエディタが表示するインポート関数一覧との比較で特定することが可能です。当ソフトウェアには、PEダンパー兼PEエディタ「UMPE」を同梱しています。 動的なロードを拒否する特殊なDLLがエクスポートする関数は、検索できないことがあります。 また、検索により発見されたIATに格納されている、コールする関数の開始アドレスを書き換える機能も実装しています。これにより、通常IAT書き換え型のAPIフックが使用できないパッカー適用アプリケーションでも、IAT書き換えによるAPIフックが可能になります。この場合は、IATの格納アドレスを、対象プロセスにロードさせたAPIフック用DLL内の、フック用関数のアドレスに書き換えることになります。当機能のダイアログから、DLLロード用のダイアログを表示できるようにしていますが、当機能のダイアログをオープンしなおさないと、新しくロードされたDLLとそのエクスポート関数の認識情報を更新できず、IAT検索に支障が生じるため、なるべく前もってAPIフック用DLLをロードさせておいてください。 この機能はWindows9x/Meでは使用できません。 |
●画面説明 |
選択範囲を逆アセンブル
●注意事項 この機能は、なるべくWindows2000やWindowsXP他、WindowsNT系のOS上で使用して下さい。 Windows9x系のOS上では動作が不安定になる可能性があります(MFCの仕様上の問題)。 誤操作防止のため、当機能使用にあたり、レジスタ、オペコード、ニーモニック、スタック、例外及びAPI関数等の基本的な事項について理解しておいてください。これらを理解するために有用な、Intel社やMicrosoft社が無償で公開している資料、プログラミング関連用語集サイト及び参考書については、当ソフトウェア公式サイトからリンクしています。 この逆アセンブル機能では、コードとデータの混在を認識できません。そのため、 コードセクション中の文字列やスイッチテーブル及びインデックステーブルは、 コードとして逆アセンブルされます。 逆アセンブル時には、ニーモニックの内容を解析して、推定される参照API関数を表示します。対象プロセスが使用するモジュールのIATには依存しません。参照API関数が、別のAPI関数にリダイレクトされる「関数フォワーダ」の場合は、リダイレクト先のAPI関数名が表示されます。なお、このAPI関数表示機能はWindows9x/Meでは使用できません。 |
●基本操作 ダンプ表示ウィンドウ上でコードセクション等のコードを含む領域を範囲選択して、 メニューの「デバッグ」→「選択範囲を逆アセンブル」で専用ウィンドウを表示します。 簡易的な使用を想定しているため、逆アセンブル可能な選択範囲は0x1000を上限に設定してあります。 もし、ダンプ表示ウィンドウでの選択範囲が1バイトで、かつ選択範囲の開始アドレスから0x100バイトのプロセスメモリ読み込みに問題が無ければ、自動的に終端アドレスを修正します。この場合選択範囲は0x100バイトになります。 表示されている選択範囲の開始・終端アドレスに問題が無ければ、「逆アセンブル実行」ボタンを押します。もし選択範囲の開始アドレスがニーモニック先頭アドレスではない場合、異常な逆アセンブルコードが表示されることになりますので、その場合は開始アドレスを1バイトずつ前後させながら再度逆アセンブルして、適切な開始アドレスを探って下さい。 逆アセンブルコードリスト上での複数列選択は、クリックとCtrlキーかShiftキーの併用で可能です。 ダイアログ右下にあるサイズグリップをドラッグすることで、ダイアログのサイズを変更可能です。また、ダイアログ右上にあるサイズ変更ボタンにより、簡単にダイアログのサイズを変更することもできます。 |
●画面説明 ●選択範囲を逆アセンブル ■開始アドレス 選択範囲の開始アドレスを指定します。 ■終端アドレス 選択範囲の終端アドレスを指定します。選択範囲のサイズではないので注意して下さい。 ■逆アセンブル実行 開始・終端アドレスで指定された選択範囲のバイナリデータを逆アセンブルします。 ●ポップアップメニュー(逆アセンブルコードを選択して右クリック) ■NOPで埋める・ゼロで埋める 選択された全ての列のニーモニックをNOP命令(0x90)あるいはゼロで埋めます。 ■クリップボードにコピー コピー対象のうち、単項目はフォーカスがある選択列1列のみ有効で、それ以外は全ての選択列に有効です。「全選択列のアドレスとHexダンプ」は、主用途を考慮して改造コード形式で出力するようにしました(例:00401009-EB1E)。 ■バイナリデータとして貼り付け テキストデータとしてクリップボード中にある、バイナリデータ指定用文字列(例:"EB1E")を、改造コードを実行するように、フォーカスがある選択列のアドレス以降に書き込みます。既存のニーモニックの長さなどは一切考慮しません。 クリップボード中のテキストデータに含まれる記号や改行は無視しますが、漢字等2バイトの文字があった場合は、16進文字列の一部として誤認識する可能性がありますので注意して下さい。 ■栞(しおり)設定トグル フォーカスがある選択した逆アセンブルコードの開始アドレスに、目印となる栞を設定します。栞が設定されると、逆アセンブルコードの左端に「*」が表示されます。 栞関連機能は、基本的にダンプ表示ウィンドウと連携します。ただし、ダンプ表示ウィンドウ上で設定された栞は、逆アセンブル実行時のみ取り込みます。 ■前の栞・次の栞 フォーカスがある選択した逆アセンブルコードからみて、前か後にある直近の栞に移動します。 ■全ての栞を削除 逆アセンブルコードリスト上で設定した全ての栞を削除します。 ■逆アセンブルコード先頭へ移動 逆アセンブルコードリストの先頭へ移動します。 ●コード修正 ■コード修正(エディットボックス・リストビュー) 逆アセンブルコードリスト上で逆アセンブルコードを選択してから、エディットボックスにバイナリデータ指定用文字列(例:"EB1E")を入力すると、書き換え後の逆アセンブルコードリストをシミュレートして下部リストビューに表示します。 「EB00 E900000000 40 48 CC」というように複数のニーモニック相当のバイナリデータを入力することも可能です。入力の際、記号やスペース等の16進文字列以外は無視します。ただし、漢字等2バイトの文字があった場合は、16進文字列の一部として誤認識する可能性がありますので注意して下さい。 ■Asm(チェックボックス) [Asm]チェックボックスにチェックを入れると、逆アセンブルコードの修正をバイナリデータではなくアセンブルコードをベースに行います。 このモードでアセンブルコードを入力すると、互換性のあるアセンブルコードを探索して、バイナリデータが最小のものを下部リストビューに表示します(32ビット版UsaMimi.exeのみ)。 例えば、「CMP DWORD PTR [EBP+0C],1」と入力すると、これを変換した下記4パターンのうちバイナリデータが最小となる「837D0C01」を表示します。 81BD0C00000001000000 817D0C01000000 83BD0C00000001 837D0C01 アセンブルコード入力時には、TASM等のアセンブラ同様に、数値指定時は数値だと明確にするために、数値の最大桁は必ず10進数の数字で指定する必要があります。例えば「MOV EAX,C」は「MOV EAX,0C」と指定しないとアセンブルエラーとなります。 ■修正実行 シミュレートした逆アセンブルコードリストを元に実際に書き換えを行います。書き換えを実行すると、書き換え前のバイナリデータと入力したバイナリデータのセットを履歴として保存します。書き換え履歴はエディットボックス右端の逆三角形をクリックすると表示され、再利用が可能になります。 「コード修正」での書き換え時は、書き換え終端がニーモニックの途中である場合、そのニーモニックの終端までをNOPで埋めます。 |
モジュールを逆アセンブル
●注意事項 この機能は、なるべくWindows2000やWindowsXP他、WindowsNT系のOS上で使用して下さい。 Windows9x系のOS上では動作が不安定になる可能性があります(MFCの仕様上の問題)。 誤操作防止のため、当機能使用にあたり、レジスタ、オペコード、ニーモニック、スタック、例外及びAPI関数等の基本的な事項について理解しておいてください。これらを理解するために有用な、Intel社やMicrosoft社が無償で公開している資料、プログラミング関連用語集サイト及び参考書については、当ソフトウェア公式サイトからリンクしています。 この逆アセンブル機能では、コードとデータの混在を認識できません。そのため、 コードセクション中の文字列やスイッチテーブル及びインデックステーブルは、 コードとして逆アセンブルされます。 この逆アセンブル機能は、パッカーによってプロセスの実行ファイルに圧縮や暗号化が施されている場合、PEヘッダの異常によりプロセスメモリ上のモジュールエリアを読み込めないことがあります。モジュールエリアを読み込めたとしても、正常な逆アセンブルコードリストや正しいエントリーポイントを表示できず、外部関数参照箇所の一覧表示やアドレス-オフセット変換モードも正常に動作しません。また、実行ファイルの解凍・復号化ルーチンをコード本体と誤認識することもあります。ただし、一部のパッカーが使用されたケースについては、逆アセンブル時に内部で自動的にPEヘッダ内の値を補正して、正常な逆アセンブルコードを表示させています。
この逆アセンブル処理にあたっては多大なメモリを確保することになります。逆アセンブルコードリストが100万行超の場合など、実装メモリ容量によっては逆アセンブル中にフリーズしかねません。そのため、まずシステム全体での空きメモリ状況を取得して、この逆アセンブル処理でフリーズしかねない場合は事前に警告し、逆アセンブル処理を続行するか確認します。 |
●基本操作 メニューの「デバッグ」→「モジュールを逆アセンブル」で専用ウィンドウを表示します。画面左上にあるモジュールのリストから逆アセンブル対象モジュールを選択し、「逆アセンブル実行」ボタンを押します。 逆アセンブルコードリスト上での複数列選択は、クリックとCtrlキーかShiftキーの併用で可能です。 ダイアログ右下にあるサイズグリップをドラッグすることで、ダイアログのサイズを変更可能です。また、ダイアログ右上にあるサイズ変更ボタンにより、簡単にダイアログのサイズを変更することもできます。 |
●参考画面(新型32ビット版・64ビット版) API関数の呼び出し箇所や、文字列・数値などの参照箇所は、画面右下で検索できるようにしています。 |
●画面 |
●画面説明 ●モジュールを逆アセンブル ■対象モジュール(コンボボックス) 逆アセンブル対象モジュールを一覧から選択します。 ■CrossReference このチェックを有効にすると、逆アセンブルコードリスト左側にジャンプ命令やコール命令のクロスリファレンス情報を表示します。 「>」がジャンプ命令からの参照箇所で、「}」がコール命令からの参照箇所です。ジャンプ命令やコール命令から参照されているアドレスの逆アセンブルコードを選択すると、画面右下の参照元一覧に参照元アドレスをリストアップします。この参照元アドレスリストで特定のアドレスを選択すると、逆アセンブルコードリスト上で当該アドレス周辺を表示します。 なお、クロスリファレンス情報の動的解析は、使用PCのスペックによっては、逆アセンブルコードリストのスクロール等で表示の遅延という問題が発生します。そのため、クロスリファレンス情報を必要な場合にのみ取得できるよう、クロスリファレンス情報取得の有効・無効を簡単に切り替えられるようにしました。 「クロスリファレンス」は、英語のプログラム解析に関する各種資料やツールでは「XREF」と表記されるケースもあります。 ■参照文字列はUnicode 指定されたモジュールが参照する文字列をUnicode形式とみなして出力します。一般的に、Windows Vista/XPなどのWindows NT系OSに最適化されたモジュールは、プログラムの参照文字列をUnicode形式で格納するケースが多いといえます。 ■逆アセンブル実行 指定されたモジュールのコードセクションに対応する、プロセスメモリ上のバイナリデータを逆アセンブルします。 ■移動 逆アセンブルコードリスト表示後、画面右上のアドレス入力欄に、16進数(「0x」不要)でアドレスを入力して「移動」ボタンを押すと、逆アセンブルコードリスト上の当該アドレス周辺を表示します。逆アセンブルコードリスト中に入力したアドレスが存在しない場合は移動は行いません。移動に用いたアドレスは履歴として保存され、アドレス入力欄の右端の逆三角形をクリックすると履歴が一覧表示され、アドレスの再利用が可能になります。 ●ポップアップメニュー(逆アセンブルコードを選択して右クリック) ■NOPで埋める・ゼロで埋める 選択された全ての列のニーモニックをNOP命令(0x90)あるいはゼロで埋めます。 ■クリップボードにコピー コピー対象のうち、単項目はフォーカスがある選択列1列のみ有効で、それ以外は全ての選択列に有効です。「全選択列のアドレスとHexダンプ」は、主用途を考慮して改造コード形式で出力するようにしました(例:00401009-EB1E)。 ■バイナリデータとして貼り付け テキストデータとしてクリップボード中にあるバイナリデータ(例:EB1E)を、改造コードを実行するように、フォーカスがある選択列のアドレス以降に書き込みます。既存のニーモニックの長さなどは一切考慮しません。 クリップボード中のテキストデータに含まれる記号や改行は無視しますが、漢字等2バイトの文字があった場合は、16進文字列の一部として誤認識する可能性がありますので注意して下さい。 ■逆アセンブルコード中の文字列を検索 逆アセンブルコードリストでの現在の選択列を基準として「上検索」「下検索」を行います。 キャンセルボタン左側にあるアップダウンコントロールで、逆アセンブルコードリストをスクロールさせることが可能です。 ■外部関数参照箇所を一覧表示 専用画面表示後、絞り込み用文字列を入力・削除すると、リアルタイムで一覧の絞り込み・一覧の復元を行います。上部の関数リストで特定の関数を選択すると、下部のリストにその関数を参照しているコードのアドレスが一覧表示されます。下部のリストで特定のアドレスを選択すると、逆アセンブルコードリスト上で当該アドレス周辺を表示します。下部リスト右側にあるアップダウンコントロールで、逆アセンブルコードリストをスクロールさせることが可能です。 ■文字列参照箇所を一覧表示 専用画面表示後、絞り込み用文字列を入力・削除すると、リアルタイムで一覧の絞り込み・一覧の復元を行います。絞り込み用入力文字列がアルファベット1文字の場合は、漢字等2バイト文字中の1バイトにヒットしてしまうことがあります。文字列参照箇所リストで特定のアドレスを選択すると、逆アセンブルコードリスト上で当該アドレス周辺を表示します。リスト右側にあるアップダウンコントロールで、逆アセンブルコードリストをスクロールさせることが可能です。 ■アドレス-オフセット変換モード 表示するプロセスメモリ上のアドレスと、それに対応する実行ファイル中の該当オフセットを動的に切り替えます。パッカー使用時など、実行ファイルのセクション情報が書き換えられている場合には、表示されるオフセットの値が正確でない可能性があります。 ■栞(しおり)設定トグル フォーカスがある選択した逆アセンブルコードの開始アドレスに、目印となる栞を設定します。栞が設定されると、逆アセンブルコードの左端に「*」が表示されます。 栞関連機能は、基本的にダンプ表示ウィンドウと連携します。ただし、ダンプ表示ウィンドウ上で設定された栞は、逆アセンブルコードリストをスクロールさせる等で、逆アセンブルコードリストの再描画を行うまで取り込まれません。 また、栞関連の操作は、画面下部右側の栞一覧で行うこともできます。栞リスト上で特定のアドレスを選択すると、逆アセンブルコードリスト上で当該アドレス周辺を表示します。 ■前の栞・次の栞 フォーカスがある選択した逆アセンブルコードからみて、前か後にある直近の栞に移動します。 ■全ての栞を削除 逆アセンブルコードリスト上で設定した全ての栞を削除します。 ■エントリーポイントへ移動 コードの実行開始アドレスであるエントリーポイントに移動し、当該アドレス周辺を表示します。パッカー使用時など、実行ファイルのPEヘッダが書き換えられている場合には、表示されるエントリーポイントが正確でない可能性があります。 ■コードエリア先頭へ移動 逆アセンブルコードリストの先頭へ移動します。 ●逆アセンブルコードをダブルクリック ■移動先アドレス設定 ダブルクリックした逆アセンブルコードのアドレスを、画面右上の移動先アドレスの一覧(コンボボックス)に追加します。 ●コード修正 ■コード修正(エディットボックス・リストビュー) 逆アセンブルコードリスト上で逆アセンブルコードを選択してから、エディットボックスにバイナリデータ(例:EB1E)を入力すると、書き換え後の逆アセンブルコードリストをシミュレートして下部リストビューに表示します。 「EB00 E900000000 40 48 CC」というように複数のニーモニック相当のバイナリデータを入力することも可能です。入力の際、記号やスペース等の16進文字列以外は無視します。ただし、漢字等2バイトの文字があった場合は、16進文字列の一部として誤認識する可能性がありますので注意して下さい。 ■Asm(チェックボックス) [Asm]チェックボックスにチェックを入れると、逆アセンブルコードの修正をバイナリデータではなくアセンブルコードをベースに行います。 このモードでアセンブルコードを入力すると、互換性のあるアセンブルコードを探索して、バイナリデータが最小のものを下部リストビューに表示します(32ビット版UsaMimi.exeのみ)。 例えば、「CMP DWORD PTR [EBP+0C],1」と入力すると、これを変換した下記4パターンのうちバイナリデータが最小となる「837D0C01」を表示します。 81BD0C00000001000000 817D0C01000000 83BD0C00000001 837D0C01 アセンブルコード入力時には、TASM等のアセンブラ同様に、数値指定時は数値だと明確にするために、数値の最大桁は必ず10進数の数字で指定する必要があります。例えば「MOV EAX,C」は「MOV EAX,0C」と指定しないとアセンブルエラーとなります。 ■修正実行 シミュレートした逆アセンブルコードリストを元に実際に書き換えを行います。書き換えを実行すると、書き換え前のバイナリデータと入力したバイナリデータのセットを履歴として保存します。書き換え履歴はエディットボックス右端の逆三角形をクリックすると表示され、再利用が可能になります。 「コード修正」での書き換え時は、書き換え終端がニーモニックの途中である場合、そのニーモニックの終端までをNOPで埋めます。 |
PeRdrでプロセスの実行ファイルを逆アセンブル
PeRdrを使用して操作対象のプロセスのメインモジュール実行ファイルを逆アセンブルします。逆アセンブルコードリストはUsaMimi.exeと同じフォルダに「モジュール名_das.txt」で出力します。事前にPeRdr.exeをUsaMimi.exeと同じフォルダに導入しておいてください。
PeRdrは必ずバージョン「0.0108 beta」以降のものを導入して下さい。 |
dispeでプロセスメモリ上のメインモジュールを逆アセンブル
dispeを使用して操作対象のプロセスのメインモジュールをメモリ上から逆アセンブルします。
逆アセンブルコードリストはUsaMimi.exeと同じフォルダに「モジュール名.asm」で出力します。事前にdispe.exeをUsaMimi.exeと同じフォルダに導入しておいてください。 この機能はWindows9x/Meでは使用できません。 |
パラサイトルーチン作成
当機能が行う操作では、まず対象プロセスが実行する任意のニーモニックをジャンプ命令に書き替え、さらに、ジャンプ先には任意の処理を行うプログラムコードを書き込みます。このプログラムコードの直後には、ジャンプ命令で上書きした本来のニーモニックを復元して書き込み、加えて最初のジャンプ元へのジャンプ命令を書き込みます。当ソフトウェアでは、このようなアプローチあるいはこのアプローチでの「追加して実行させる任意のプログラムコード」を「パラサイトルーチン」と表記しています。ちなみに、日本では1990年代後半から特にPCゲーム解析分野で上記「パラサイトルーチン」という呼称が広まり、その後、海外で広まった「コードインジェクション」という呼称が日本人リバースエンジニアの間でも使われるようになったという経緯があります。この2つの呼称は共に「プログラムコードを追加して実行させるアプローチ」を指すものであり、特段の違いはありません。 パラサイトルーチン作成により、任意のニーモニックが実行されるタイミングで情報取得等の新規処理を実行させたり、あるいは、API関数呼び出し時の引数や戻り値を変更するといった操作が容易に行えるようになります。PUSHAD/POPAD命令あるいはPUSH/POP命令などを使用すれば、プロセスが実行する本来のプログラムコードへ影響を与えないことも可能です。 当機能は新しいプログラムコードを、確保したバッファ上で実行させることを想定していますが、当ソフトウェア同梱のPEエディタ「UMPE」で、対象実行ファイルにセクションを追加しておいて、プロセスメモリ上での同セクション該当メモリ領域をバッファのように使用するというアプローチもあります。この場合は、書き込みアドレスを強制変更する書式の半角コロン「:」を使って、ジャンプ命令による既存コード上書き箇所のアドレス指定およびその上書き処理、セクション該当アドレス指定とパラサイトルーチン本体を記述し、「ルーチンのみ」オプションをチェックで有効にしてから、書き込みを実行します。 ;<参考>追加したセクションを使用する際の記述形式 :ジャンプ命令で上書きするアドレス jmp セクション該当アドレス :セクション該当アドレス 以下にパラサイトルーチン本体 当パラサイトルーチン作成機能はWindows9x/Meでは使用できません。 UsaMimi64.exeが実装している、64ビット版の当機能では、x86からx64でのCPU基本設計の仕様変更に伴い、下記の変更を施しています。 ・ジャンプ命令等でのRIPレジスタ相対アドレス指定に対応するため、各モジュールのRIPレジスタ相対アドレスに対応可能なバッファ(0x1000バイト)を確保するようにした ・出力テンプレートで、レジスタの退避と復旧は各レジスタごとのPUSH/POP命令で対処するようにした ・出力テンプレートで、いったんRSPレジスタの内容をバッファに退避してから、スタックのアラインメント(≒整列)を行うようにした(RSPが0x10の倍数にアラインメントされないと実行処理によっては不具合が生じる) また、64ビット版では機能性の向上を図るため以下の機能強化を行いました。 ・プレビュー出力後に、逆アセンブルコードリストの右クリックから、改造コード形式を含む色々な形式に変換してコピーできるようにした 64ビット版でアセンブルコードを記述する際には、関数呼び出しを行うルーチンでは事前に最低0x20(4レジスタ分)のスタック確保が必要となることや、スタックのアラインメントが必要なことに注意してください。また、CFG(Control Flow Guard)といった、Windows OSが提供する脆弱性緩和機能が有効な場合は、当機能で作成したパラサイトルーチン内の、コール命令などが実行できないこともありえます。プロセスへのCFGの適用状況は、メニューの「ファイル」→「プロセスの各種情報を表示」で、カテゴリ[実行状況]選択で確認可能です。また、カテゴリ最上端の[(実行ファイル名)]からは、実行ファイルにCFG適用のフラグがあるか否かを確認可能です。 当機能の64ビット版の動作確認には、同梱 UsaTest2_x64.exe を使用しました。UsaTest2_x64.exe を起動して、64ビット版の UsaMimi64.exe で対象プロセスに指定後、当機能でアドレス0001'40002900をジャンプ元に設定してテンプレート出力分を試行しています。このアドレスは、UsaTest2_x64.exe での[パラメータ増加]ボタン押し下げで実行される処理の先頭アドレスであり、同ボタン押し下げのタイミングで追加したプログラムコードを実行できることになります。 新型32ビット版「UsaMimi32.exe」での当機能は、上記64ビット版での当機能をx86用に変更したものです。また、以下の解説は32ビット版「UsaMimi.exe」使用時のものです。 |
●参考画像(64ビット版画面) |
●画面説明(32ビット版) ●パラサイトルーチン設定 ■ジャンプ元アドレス パラサイトルーチンへのジャンプ命令を書き込むアドレスを指定します。必ずニーモニック先頭アドレスを指定してください。 ■プレビュー パラサイトルーチンへのジャンプ命令を書き込みをシミュレートして、書き込み後の逆アセンブルコードリストや、書き込み内容をテキストに変換した改造コードを表示します。 ■バッファアドレス パラサイトルーチンのプログラムコードを書き込むバッファのアドレスを指定します。 ■確保 パラサイトルーチンのプログラムコードを書き込むための、読み書き実行属性を持つバッファを確保します。 ●アセンブルコード記述補助 ■テンプレート出力(要左記設定) 指定されたジャンプ元アドレスとバッファアドレスの情報を元に、パラサイトルーチン作成やAPI関数フックなどを行う、アセンブルコードの雛型を出力します。 ■主要API関数のアドレスをコピー 対象プロセスがインポート可能な、主要API関数のアドレスを取得して、文字列としてクリップボードにコピーします。このアドレスは、APIフック対象アドレスの指定あるいは、アセンブルコードの記述に使用することができます。対象プロセスでWINMM.DLLやWS2_32.DLLが使用されているならば、これらのDLLがエクスポートする主要な時間関連API関数や通信関連API関数のアドレスも取得します。 ●パラサイトルーチン作成・ジャンプ+ルーチン書き込み ■読込 アセンブルコードを含むテキストファイルを指定して内容を読み込みます。 ■保存 入力されたアセンブルコードをテキストファイルとして保存します。 ■< > アセンブルコード編集用エディットボックスの、拡大表示と通常表示を切り替えます。 ■プレビュー 入力されたアセンブルコードのアセンブルをシミュレートし、その結果である逆アセンブルコードリストや、逆アセンブルコードリストをテキストに変換した改造コードを表示します。 ■ジャンプ+ルーチン書き込み 指定されたジャンプ元アドレスやバッファアドレスおよび、入力されたアセンブルコードを元に、ジャンプ命令への書き替えと新規プログラムコードの書き込みを実行します。 ■ルーチンのみ [ジャンプ+ルーチン書き込み]ボタン押し下げ時に、ジャンプ命令への書き替えをスキップし、新規追加コードの書き込みのみ行います。 ■ジャンプ部分書き戻し [ジャンプ+ルーチン書き込み]ボタンで書き換えられたジャンプ命令を、元のニーモニックに書き戻します。 ●逆アセンブルコードリスト/改造コードプレビュー(右クリックからコピー可) ■色 逆アセンブルコードリストのプレビュー画面で、カラー表示を行うオプションです。 ■改造コード表示 このチェックボックスへのチェック設定と解除で、逆アセンブルコードリストと改造コードの表示を切り替えます。 ■エラー表示(エディットボックス) アセンブル時の詳細なエラー情報を表示します。 ■逆アセンブルコードリスト(リストビュー) 逆アセンブルコードリストのプレビュー表示を行うリストビューです。項目を選択して右クリックにより、表示内容のコピーやリストビューの表示幅調整を行うためのポップアップメニューを表示します。 ■改造コード(エディットボックス) 逆アセンブルコードリストのプレビュー表示の実行に併せて、同内容の改造コードの表示を行います。 ●操作補助ボタン(画面右上) ■一番左のボタン 「選択アドレスへの直接書き込み・選択範囲の一括書き換え」ダイアログを表示します。 ■左から2番目のボタン 「改造コード実行」ダイアログを表示します。 ■左から3番目のボタン 「モジュール別参照関数表示」ダイアログを表示します。 ■*ボタン 当ダイアログのウィンドウタイトルを消去します。 ■-,+ボタン 当ダイアログの縮小表示と通常表示を切り替えます。 |
●注意事項
|
●基本的な操作の流れ
|
●その他
|
.NET Frameworkのマネージドコードを注入して実行
この機能では、対象プロセスにCLR(共通言語ランタイム)をロードさせ、さらに.NET
Framework用の任意のマネージドコードを注入して実行させます。 詳細は解説ページを参照してください。 |