インタラクティブ操作
逆コンパイラは、メニューに次のコマンドを追加します。
注:IDAのテキストバージョンでは、インタラクティブ操作はサポートされていません。
このコマンドは、現在の関数を逆コンパイルします。 逆コンパイルが成功すると、「Pseudocode/擬似コード」というタイトルの新しいウィンドウが開き、 生成されたCテキストがこのウィンドウに配置されます。
擬似コードウィンドウでは、次のコマンドを使用できます。
- Rename
- Set type
- Set number representation
- Edit indented comment
- Edit block comment
- Hide/unhide statements
- Split/unsplit expression
- Force call type
- Set call type
- Add/del variadic arguments
- Del function argument
- Add/delete function return type
- Jump to cross reference
- Jump to cross reference globally
- Generate HTML file
- Mark/unmark as decompiled
- Copy to assembly
- Show/hide casts
現在のアイテムがローカル変数の場合、コンテキストメニューに追加のアイテムが表示される場合があります。
- Reset pointer type
- Convert to struct *
- Create new struct type
- Map to another variable
- Unmap variable(s)
- Force new variable
現在のアイテムがユニオンフィールドの場合、コンテキストメニューに追加のアイテムが表示されることがあります。
現在の項目が括弧、角かっこ、または中括弧の場合は、次のホットキーを使用できます。
現在の項目がCステートメントキーワードの場合、コンテキストメニューに追加の項目が表示される場合があります。
ユーザーは、テキストを選択して、Ctrl-Cの組み合わせでクリップボードにコピーすることもできます。
関数名でEnterキーを 押すと、逆コンパイルされます。 Escキーを押すと、以前に逆コンパイルされた関数に戻ります。 以前に逆コンパイルされた関数がない場合、擬似コードウィンドウは閉じられます。
Ctrl-EnterまたはCtrl-関数名をダブルクリックすると、その関数の新しい擬似コードウィンドウが開きます。
擬似コードウィンドウでF5キーを押すと、その内容が更新されます。 逆コンパイラは時間がかかる可能性があるため、逆コンパイラは擬似コードを更新することはないので注意が必要です。
ユーザーは、マウスの右クリックまたはキーボードのホットキーを使用してコマンドにアクセスできます。 詳細については、コマンドの説明を確認してください。
このコマンドは、逆アセンブリビューと擬似コードビューを切り替えます。 擬似コードウィンドウがない場合は、新しいウィンドウが作成されます。
擬似コードウィンドウでTabキーを押すと、逆アセンブリウィンドウに切り替わります。 Tabキーを使用して、擬似コードビューと逆アセンブリビューを切り替えることができます。
詳細については、上記の 「Open pseudocode 擬似コードを開く」コマンドを参照してください。
ファイル、ファイルの作成、Cファイルの作成(ホットキー Ctrl-F5)
このコマンドは、選択した関数またはアプリケーション全体を逆コンパイルします。 出力.cファイルの名前を聞いてきます。
逆アセンブリビューで選択された領域がある場合、選択された関数のみが逆コンパイルされます。 それ以外の場合は、アプリケーション全体が逆コンパイルされます。
アプリケーション全体が逆コンパイルされると、次のルールが適用されます。
- 逆コンパイルの順序は、逆コンパイラによって決定されます。リーフ関数から始まり、コールグラフの番号付け後の順序で進みます。 この順序により、関数を逆コンパイルするときに、呼び出された関数に関するすべての情報が確実に得られます。 再帰関数については、今現在一部の情報が不足しています。
- ライブラリ(水色)関数は逆コンパイルされません。これは出力から関数を除外するための便利な機能です。
- 逆コンパイルに失敗しても分析は停止しませんが、内部エラーは停止します。 デコンパイラーは、失敗した関数に対して#errorディレクティブを生成します。
このコマンドは、現在の関数を逆コンパイルし、疑似コードを逆コメントの形式で逆アセンブリリストにコピーします。 現在の関数にすでに擬似コードウィンドウがある場合は、関数を新たに逆コンパイルする代わりに、その内容が使用されます。
このメニュー項目は、 [Copy to assembly]コマンドとまったく同じアクションを実行します。
このコマンドは、前のコマンドで作成されたすべての古いコメントを削除します。 現在の関数内のすべての古いコメントは削除されます。
のコマンドは、逆コンパイラによってスキップされる命令をマーク/マーク解除します。 一部のプロローグ/エピローグの指示がIDAによって見落とされた時に役立ちます。 このような命令が検出およびマークされていない場合、逆コンパイルが失敗する可能性があります。 (呼び出し分析はほぼ失敗します)
逆コンパイラは、プロローグ、エピローグ、およびスイッチの命令をスキップします。 IDAがそれらのマーク付けに失敗することがあるため、このコマンドを使用して状況を修正できます。
コマンドがマークされた命令に適用されると、マークが解除されます。
デフォルトでは、スキップされた命令は視覚化されません。 それらを表示するには、IDA.CFGファイルを編集し、次の行のコメントを解除します。
PROLOG_COLOR = 0xE0E0E0 // grey
EPILOG_COLOR = 0xE0FFE0 // light green
SWITCH_COLOR = 0xE0E0FF // pink
このコマンドは、逆コンパイラ情報を削除します。
ローカルな情報をグローバルオブジェクト(関数、静的データ、構造/列挙型)に関する情報や、現在の関数に削除できます。
逆コンパイルを不可能にするような変更を誤って行った場合は、このコマンドを使用してください。
また、逆コンパイラーによって使用される他の情報タイプをリセットするために使用することもできます。 たとえば、 forced variadic arguments(強制可変個引数) または split expression(分割式)をリセットできます。
このコマンドは、現在の命令を擬似コード出力で置き換える必要がある関数呼び出しを構成します。
特別な名前を使用して、現在の命令のオペランドにアクセスできます。 __OP1、__ OP2、...は、第1、第2などのオペランドです。 そのような名前を持つ各関数の引数は、呼び出しで命令の対応するオペランドの値に置き換えられます。 また、関数名がこの形式の場合、対応するオペランドが指す場所への呼び出しが生成されます。 他の引数と戻り値は、現在のコンパイラ、コーリングコンベンション、引数、およびリターンタイプに従って、関数プロトタイプから派生した場所に配置されます。 IDA固有の__usercallコーリングコンベンションを使用して、プラットフォームや引数/戻り値のタイプに関係なく任意の場所を指定できます (詳細については、ユーザー定義の呼び出し規約に関するIDAヘルプページを参照してください)。
例:
・次の命令を置き換えることが出来ます。
out 2b, ax
次のプロトタイプを指定します。
void OUT(unsigned int8 __OP1, int16 __OP2)
これにより、次の逆コンパイラ出力が生成されます。
OUT(0x2b, v1);
ここで、v1はaxにマップされます。
・次のプロトタイプ:
int __usercall syscall@
次のコードの2番目の命令に適用されます。
mov r12, #0x148
svc 0x80
次の擬似コードを生成します。
v3 = syscall(328, v1, v2);
ここで、v1、v2、v3はそれぞれR0、R1、R2にマップされます。
このコマンドは、現在のデータベースをパックしてサーバーに送信します。 ユーザーは自分の電子メールを指定し、エラーに関するメモを追加できます。 データベースなしでは何もできないため、これはバグレポートを提出するための好ましい方法です。 データベースには、バグを再現するために必要な逆コンパイラの内部状態も含まれます。 データベースは、帯域幅を節約するために圧縮形式で送信されます。転送には暗号化接続(SSL)が使用されます。
このコマンドは、現在のIDBからすべてのコードとデータを削除し、現在の関数を抽出します。 バグレポートを送信する前にデータベースのサイズを縮小するために使用できます。 データベースから情報を削除すると、バグが再現できなくなる可能性があることに注意してください。 このコマンドを適用した後、それを確認してください。