逆コンパイラ:よくある質問
入力機能に対して出力が短すぎます。(アセンブリフォームの一部コードが、出力に表示されない)
逆コンパイラがこれらの計算の結果を使用しないと判断した場合に発生する可能性があります(デッドコード)。
デッドコードは出力に含まれていません。
一般的なケースの1つは、ECXなどの異常なレジスタで結果を返す関数です。
関数タイプを明示的に指定し、IDAに戻り値の正確な場所を伝えてください。
例えば
- int __usercall myfunc
(void);
詳細については、ユーザー定義のコーリングコンベンションに関する IDAヘルプをお読みください。
もう1つの一般的なケースは、IDAまたは逆コンパイラによってタイプが誤って推測された関数です。
たとえば、推測されたタイプが
- int func(void);
しかし、正しい関数タイプは
- int func(int x、int y、int z);
そうすると関数の引数のすべての計算が出力から削除されます。 IDAに正しい関数タイプを伝えると、引数の計算が出力に表示されます。
一般的に、入力情報(関数タイプ)が正しくない場合、出力も正しくありません。下記を確認してください。
https://hex-rays.com/products/decompiler/manual/failures.shtml#trouble
次のコードは
- DllUnregisterServer proc near
- CommandLine = byte ptr -274h
- hObject = _PROCESS_INFORMATION ptr -6Ch
- xor ebx, ebx
- mov [ebp+CommandLine], bl
下記にトランスレートされています。
- char CommandLine; // [sp+0h] [bp-274h]@1
- CommandLine = 0;
これは、逆コンパイラがタイプ回復を実行しないために発生します。
出力を修正するには、IDAのCommandLineの定義を変更します。
そのためには、スタックフレームを開き(Edit, Functions, Open stack frame)、CommandLineを見つけて、そのタイプを配列に設定します
(Edit, Functions, Set function type)。
最終結果は次のようになります。
- CommandLine[0] = 0;
古いデータベースをロードしましたが、すべての関数で逆コンパイラが失敗しました。
古いデータベースには、重要な情報が含まれないことがあります。 それらを逆コンパイルする場合は、最初にIDAにデータベースを再分析させます (メインウィンドウの左下隅を右クリックして、[Reanalyze]を選択します)。 また、間接(table)ジャンプ命令を再作成する必要があります。 そうしないと、スイッチイディオムが認識されず、それらを含む関数の逆コンパイルが失敗します。
逆コンパイラが関数で失敗しました。バグレポートを提出する必要がありますか?
一般に、逆コンパイラの正常なエラーの場合、バグレポートを提出する必要はありません。 エラーは必ずしもバグではありません。続行する方法については、 正常なエラーのセクションをお読みください。
改善することができます。 しかし、まだ未解決の問題が多く、単純なことでも非常に時間がかかる可能性があります。 疑似コードを変更するには、テキストエディタを使用することをお勧めします。
浮動小数点命令は、アセンブリステートメントとして表示されます。なぜでしょうか?
こちらのページをお読みください。
SSE命令は、アセンブリステートメントとして表示されます。なぜでしょうか?
こちらのページをお読みください。