モジュール情報・逆アセンブル
モジュール情報・逆アセンブル 目次
●モジュール別参照関数表示●選択範囲を逆アセンブル
●モジュールを逆アセンブル
●PeRdrでプロセスの実行ファイルを逆アセンブル
●dispeでプロセスメモリ上のメインモジュールを逆アセンブル
●パラサイトルーチン作成
モジュール別参照関数表示
|
現在開いているプロセスで使用されているモジュールの一覧を表示します。また、モジュール一覧中から選択したモジュールがインポート・エクスポートしている関数を一覧表示します。 |
|
●画面説明 |
選択範囲を逆アセンブル
| ●注意事項 この機能は、なるべくWindows2000やWindowsXP他、WindowsNT系のOS上で使用して下さい。 Windows9x系のOS上では動作が不安定になる可能性があります(MFCの仕様上の問題)。 誤操作防止のため、当機能使用にあたり、レジスタ、オペコード、ニーモニック、スタック、例外及びAPI関数等の基本的な事項について理解しておいてください。これらを理解するために有用な、Intel社やMicrosoft社が無償で公開している資料、プログラミング関連用語集サイト及び参考書については、当ソフトウェア公式サイトからリンクしています。 この逆アセンブル機能では、コードとデータの混在を認識できません。そのため、 コードセクション中の文字列やスイッチテーブル及びインデックステーブルは、 コードとして逆アセンブルされます。 |
●基本操作 ダンプ表示ウィンドウ上でコードセクション等のコードを含む領域を範囲選択して、 メニューの「デバッグ」→「選択範囲を逆アセンブル」で専用ウィンドウを表示します。 簡易的な使用を想定しているため、逆アセンブル可能な選択範囲は0x1000を上限に設定してあります。 表示されている選択範囲の開始・終端アドレスに問題が無ければ、「逆アセンブル実行」ボタンを押します。もし選択範囲の開始アドレスがニーモニック先頭アドレスではない場合、異常な逆アセンブルコードが表示されることになりますので、その場合は開始アドレスを1バイトずつ前後させながら再度逆アセンブルして、適切な開始アドレスを探って下さい。 逆アセンブルコードリスト上での複数列選択は、クリックとCtrlキーかShiftキーの併用で可能です。 ダイアログ右下にあるサイズグリップをドラッグすることで、ダイアログのサイズを変更可能です。また、ダイアログ右上にあるサイズ変更ボタンにより、簡単にダイアログのサイズを変更することもできます。 |
●画面説明![]() ●選択範囲を逆アセンブル ■開始アドレス 選択範囲の開始アドレスを指定します。 ■終端アドレス 選択範囲の終端アドレスを指定します。選択範囲のサイズではないので注意して下さい。 ■逆アセンブル実行 開始・終端アドレスで指定された選択範囲のバイナリデータを逆アセンブルします。 ●ポップアップメニュー(逆アセンブルコードを選択して右クリック) ■NOPで埋める・ゼロで埋める 選択された全ての列のニーモニックをNOP命令(0x90)あるいはゼロで埋めます。 ■クリップボードにコピー コピー対象のうち、単項目はフォーカスがある選択列1列のみ有効で、それ以外は全ての選択列に有効です。「全選択列のアドレスとHexダンプ」は、主用途を考慮して改造コード形式で出力するようにしました(例:00401009-EB1E)。 ■バイナリデータとして貼り付け テキストデータとしてクリップボード中にあるバイナリデータ(例:EB1E)を、改造コードを実行するように、フォーカスがある選択列のアドレス以降に書き込みます。既存のニーモニックの長さなどは一切考慮しません。 クリップボード中のテキストデータに含まれる記号や改行は無視しますが、漢字等2バイトの文字があった場合は、16進文字列の一部として誤認識する可能性がありますので注意して下さい。 ■栞(しおり)設定トグル フォーカスがある選択した逆アセンブルコードの開始アドレスに、目印となる栞を設定します。栞が設定されると、逆アセンブルコードの左端に「*」が表示されます。 栞関連機能は、基本的にダンプ表示ウィンドウと連携します。ただし、ダンプ表示ウィンドウ上で設定された栞は、逆アセンブル実行時のみ取り込みます。 ■前の栞・次の栞 フォーカスがある選択した逆アセンブルコードからみて、前か後にある直近の栞に移動します。 ■全ての栞を削除 逆アセンブルコードリスト上で設定した全ての栞を削除します。 ■逆アセンブルコード先頭へ移動 逆アセンブルコードリストの先頭へ移動します。 ●コード修正 ■コード修正(エディットボックス・リストビュー) 逆アセンブルコードリスト上で逆アセンブルコードを選択してから、エディットボックスにバイナリデータ(例:EB1E)を入力すると、書き換え後の逆アセンブルコードリストをシミュレートして下部リストビューに表示します。 「EB00 E900000000 40 48 CC」というように複数のニーモニック相当のバイナリデータを入力することも可能です。入力の際、記号やスペース等の16進文字列以外は無視します。ただし、漢字等2バイトの文字があった場合は、16進文字列の一部として誤認識する可能性がありますので注意して下さい。 ■Asm(チェックボックス) [Asm]チェックボックスにチェックを入れると、逆アセンブルコードの修正をバイナリデータではなくアセンブルコードをベースに行います。 このモードでアセンブルコードを入力すると、互換性のあるアセンブルコードを探索して、バイナリデータが最小のものを下部リストビューに表示します。 例えば、「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キーの併用で可能です。 ダイアログ右下にあるサイズグリップをドラッグすることで、ダイアログのサイズを変更可能です。また、ダイアログ右上にあるサイズ変更ボタンにより、簡単にダイアログのサイズを変更することもできます。 |
●画面![]() |
| ●画面説明 ●モジュールを逆アセンブル ■対象モジュール(コンボボックス) 逆アセンブル対象モジュールを一覧から選択します。 ■CrossReference このチェックを有効にすると、逆アセンブルコードリスト左側にジャンプ命令やコール命令のクロスリファレンス情報を表示します。 「>」がジャンプ命令からの参照箇所で、「}」がコール命令からの参照箇所です。 ジャンプ命令やコール命令から参照されているアドレスの逆アセンブルコードを選択すると、画面右下の参照元一覧に参照元アドレスをリストアップします。この参照元アドレスリストで特定のアドレスを選択すると、逆アセンブルコードリスト上で当該アドレス周辺を表示します。 なお、クロスリファレンス情報の動的解析は、使用PCのスペックによっては、逆アセンブルコードリストのスクロール等で表示の遅延という問題が発生します。そのため、クロスリファレンス情報を必要な場合にのみ取得できるよう、クロスリファレンス情報取得の有効・無効を簡単に切り替えられるようにしました。 ■参照文字列は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]チェックボックスにチェックを入れると、逆アセンブルコードの修正をバイナリデータではなくアセンブルコードをベースに行います。 このモードでアセンブルコードを入力すると、互換性のあるアセンブルコードを探索して、バイナリデータが最小のものを下部リストビューに表示します。 例えば、「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では使用できません。 |
パラサイトルーチン作成
|
対象プロセスが実行する任意のニーモニックをジャンプ命令に書き替え、さらに、ジャンプ先には任意の処理を行うプログラムコード(パラサイトルーチン)を書き込みます。パラサイトルーチンの直後には、ジャンプ命令で上書きした本来のニーモニックを復元して書き込み、加えて最初のジャンプ元へのジャンプ命令を書き込みます。 これにより、任意のニーモニックが実行されるタイミングで情報取得等の新規処理を実行させたり、あるいは、API関数呼び出し時の引数や戻り値を変更するといった操作が容易に行えるようになります。PUSHAD/POPAD命令などを使用すれば、プロセスが実行する本来のプログラムコードへ影響を与えないことも可能です。 |
●画面説明![]() ●パラサイトルーチン設定 ■ジャンプ元アドレス パラサイトルーチンへのジャンプ命令を書き込むアドレスを指定します。必ずニーモニック先頭アドレスを指定してください。 ■プレビュー パラサイトルーチンへのジャンプ命令を書き込みをシミュレートして、書き込み後の逆アセンブルコードリストや、書き込み内容をテキストに変換した改造コードを表示します。 ■バッファアドレス パラサイトルーチンのプログラムコードを書き込むバッファのアドレスを指定します。 ■確保 パラサイトルーチンのプログラムコードを書き込むためのバッファを確保します。 ●アセンブルコード記述補助 ■テンプレート出力(要左記設定) 指定されたジャンプ元アドレスとバッファアドレスの情報を元に、パラサイトルーチン作成やAPI関数フックなどを行う、アセンブルコードの雛型を出力します。 ■主要API関数のアドレスをコピー 対象プロセスがインポート可能な、主要API関数のアドレスを取得して、文字列としてクリップボードにコピーします。このアドレスは、APIフック対象アドレスの指定あるいは、アセンブルコードの記述に使用することができます。対象プロセスでWINMM.DLLやWS2_32.DLLが使用されているならば、これらのDLLがエクスポートする主要な時間関連API関数や通信関連API関数のアドレスも取得します。 ●パラサイトルーチン作成・ジャンプ+ルーチン書き込み ■読込 アセンブルコードを含むテキストファイルを指定して内容を読み込みます。 ■保存 入力されたアセンブルコードをテキストファイルとして保存します。 ■< > アセンブルコード編集用エディットボックスの、拡大表示と通常表示を切り替えます。 ■プレビュー 入力されたアセンブルコードのアセンブルをシミュレートし、その結果である逆アセンブルコードリストや、逆アセンブルコードリストをテキストに変換した改造コードを表示します。 ■ジャンプ+ルーチン書き込み 指定されたジャンプ元アドレスやバッファアドレスおよび、入力されたアセンブルコードを元に、ジャンプ命令への書き替えと新規プログラムコードの書き込みを実行します。 ■ルーチンのみ [ジャンプ+ルーチン書き込み]ボタン押し下げ時に、ジャンプ命令への書き替えをスキップし、新規追加コードの書き込みのみ行います。 ■ジャンプ部分書き戻し [ジャンプ+ルーチン書き込み]ボタンで書き換えられたジャンプ命令を、元のニーモニックに書き戻します。 ●逆アセンブルコードリスト/改造コードプレビュー(右クリックからコピー可) ■色 逆アセンブルコードリストのプレビュー画面で、カラー表示を行うオプションです。 ■改造コード表示 このチェックボックスへのチェック設定と解除で、逆アセンブルコードリストと改造コードの表示を切り替えます。 ■エラー表示(エディットボックス) アセンブル時の詳細なエラー情報を表示します。 ■逆アセンブルコードリスト(リストビュー) 逆アセンブルコードリストのプレビュー表示を行うリストビューです。項目を選択して右クリックにより、表示内容のコピーやリストビューの表示幅調整を行うためのポップアップメニューを表示します。 ■改造コード(エディットボックス) 逆アセンブルコードリストのプレビュー表示の実行に併せて、同内容の改造コードの表示を行います。 ●操作補助ボタン(画面右上) ■一番左のボタン 「選択アドレスへの直接書き込み・選択範囲の一括書き換え」ダイアログを表示します。 ■左から2番目のボタン 「改造コード実行」ダイアログを表示します。 ■左から3番目のボタン 「モジュール別参照関数表示」ダイアログを表示します。 ■*ボタン 当ダイアログのウィンドウタイトルを消去します。 ■-,+ボタン 当ダイアログの縮小表示と通常表示を切り替えます。 |
●注意事項
|
●基本的な操作の流れ
|
●その他
|



