エラーとトラブルシューティング
次のエラーカテゴリがあります
- クラッシュまたはアクセス違反
- 内部整合性チェックのエラー(interr)
- 関数の逆コンパイルの正常なエラー
- 正しくない出力テキスト
- 非効率的/不明瞭/適切ではない出力テキスト
現時点で注意することは、正しい機能に対して正しい出力を生成することです。 逆コンパイラがクラッシュしたり、失敗したり、有効な入力に対して誤った出力を生成したりしないようにする必要があります。 これが発生した場合は、バグレポートを提出してください。
逆コンパイラには、内部チェックとアサーションの広範なセットがあります。 たとえば、「void *」ポインタを逆参照するコードは生成されません。 一方、生成されたコードはコンパイル可能であるとは想定されておらず、多くのコンパイラがそれについて不平を言うでしょう。 これは、出力を100%コンパイル可能にしないという意図的な選択です。 コードを再コンパイルすることではなく、人間がコードをより高速に分析できるようにすることを目的としているためです。
デコンパイラーは、出力テキストでいくつかのC ++構造を使用します。 それらの使用は、Cで表すことができない構造に制限されています(注目すべき例は、値によって関数に構造を渡すことです)。
逆コンパイラが内部の不整合を検出すると、エラーコードを含むメッセージボックスを表示します。 また、データベースをhex-rays.comサーバーに送信することも提案します。
サンプルデータベースなしでバグを再現することは難しい(ほとんど不可能です)ので、サーバーに送ってください。 作業を容易にするために、逆コンパイラはその内部状態をデータベースに保存します。 これは、何時間も逆コンパイルした後にエラーが発生した場合に便利です。
内部エラーの後で何かを逆コンパイルすることは不可能です。 データベースをリロードするか、IDAを再起動してください。
逆コンパイラが関数で正常に失敗すると、次のメッセージのいずれかが表示されます。 通常、エラーメッセージが表示されない場合を除いて、障害に関するバグレポートを提出する必要はありません。
- cannot convert to microcode
- not enough memory
- invalid basic block
- positive sp value has been found
- prolog analysis failed
- switch analysis failed
- exception analysis failed
- stack frame is too big
- local variable allocation failed
- 16-bit functions are not supported
- call analysis failed
- function frame is wrong
- undefined or illegal type
- inconsistent database information
- wrong basic type sizes in compiler settings
- redecompilation has been required
- could not compute fpu stack states
- max recursion depth reached during lvar allocation
- variables would overlap
- partially initialized variable
- too complex function
- no license available
- only 32-bit functions can be decompiled for the current database
- only 64-bit functions can be decompiled for the current database
- already decompiling a function
- far memory model is supported only for pc
- special segments cannot be decompiled
- too big function
- bad input ranges
- current architecture is not supported
- bad instruction in the delay slot
考えられる対処方法については、トラブルシューティングのセクションをお読みください。
cannot convert to microcode (マイクロコードに変換できません)
このエラーは、逆コンパイラが指定されたアドレスの命令をマイクロコードに変換できなかったことを意味します。 命令とその長さを確認してください。 コンパイラが生成したコードで使用される通常の命令のように見え、その長さが正しい場合は、バグレポートを提出してください。
not enough memory (メモリーが充分ではありません)
エラーメッセージは一目瞭然です。それほど頻繁には発生しないはずですが、それでも巨大なスタックを持つ関数で見られます。
このバグを報告する必要はありません。次のバージョンは巨大なスタックを持つ関数をより効率的に処理できるように進めています。
このエラーメッセージ出た場合は、IDAを再起動してください。
invalid basic block (無効な基本ブロック)
このエラーは、指定されたアドレスに基本ブロックがあり、正しく終了しないことを意味します。 たとえば、命令なしで終了したり、単にゴミが含まれている場合などです。 可能であれば、関数の境界を変更したり、命令を作成したり、関数のテールを操作したりして、状況を修正してみてください。 通常、このエラーは不正な形式の関数で発生します。
コールが原因でエラーが発生した場合は、コールされた関数を「noret」としてマークしてください。 コールが間接的である場合は、「noret」関数への相互参照を追加することも出来ます。
古いバージョンのIDAによって作成されたデータベースでこのエラーが発生した場合は、 プログラムを逆コンパイルする前に、プログラムを再分析してみてください。 一般的に、逆コンパイル用のデータベースを作成するには、最新バージョンのIDAを使用することをお勧めします。
認識されないテーブルジャンプもこの失敗につながる可能性があります。
positive sp value has been found (正のsp値が見つかりました)
指定されたアドレスのスタックポインタは、最初のスタックポインタよりも高くなっています。 変な動作をする関数は逆コンパイルできません。 スタックポインタの値が正しくない場合は、IDAのAlt-K(Edit, Functions, Change stack pointer)コマンドを使用して変更します。
prolog analysis failed (プロローグ分析に失敗しました)
関数プロローグ分析のエラーです。 現在、できることはあまりありませんが、このエラーが頻繁に発生することはありません。 逆コンパイラは、この失敗のために停止するのではなく、プロローグ命令を使用してコードを生成しようとします。
switch analysis failed (スイッチ分析に失敗しました)
指定されたアドレスのスイッチイディオム(間接ジャンプ)を分析できていません。 Edit, Other, Specify switch idiomを使用して、スイッチイディオムを手動で指定できます 。
古いバージョンのIDAによって作成されたデータベースでこのエラーが発生した場合は、問題のある命令を削除して再作成してみてください。 IDAの新しいバージョンが古いバージョンより適切にスイッチを処理するため、再分析され、エラーが修正される可能性があります。
exception analysis failed (例外分析に失敗しました)
現在のバージョンでは関数が逆コンパイルされ、例外ハンドラーと関連コードが無視されるため、このエラーメッセージは表示されません。
stack frame is too big (スタックフレームが大きすぎます)
スタック分析には大量のメモリが必要なため、逆コンパイラは、エイリアスされていないスタックが1MBを超える関数の処理を拒否します。
local variable allocation failed (ローカル変数の割り当てに失敗しました)
このエラーメッセージは、逆コンパイラがレジスタとスタックの場所にローカル変数を割り当てることができなかったことを意味します。 このエラーメッセージは、構成ファイルでHO_IGNORE_OVERLAPSを有効にしている場合にのみ表示されます。 重複する変数が出力で許可されている場合、それらは赤で表示されます。
現在の機能を含め、関連するすべての機能のプロトタイプを確認してください。 変数のタイプと定義もこのエラーを引き起こす可能性があります。
関数スタックフレームを更新し、正しいスタック変数を作成することも、問題の解決に役立つ場合があります。
1つまたは複数の関数型を操作した後にこのエラーが発生した場合は、現在の関数に関する情報 (Edit, Other, Reset decompiler information)をリセットして、 最初からやり直すことができます。
16-bit functions are not supported (16ビット機能はサポートされていません)
メッセージで表示している通りです。 逆コンパイラ自体は16ビットコードを逆コンパイルするように微調整できますが、これは優先事項ではありません。
call analysis failed (コール分析に失敗しました)
これは最も大変なエラーメッセージですが、できることでもあります。 このメッセージは、逆コンパイラがcalling convention とcall parameters.を判別できなかったことを意味します。 これが直接の非可変個引数のコールである場合は、コール先のタイプを指定し修正できます。 コール先にジャンプしてYキーを押すだけです。可変個引数関数の場合も、タイプを指定することをお勧めしますが、 逆コンパイラーがコール内の引数の実際の数を検出する必要があるため、コール分析が失敗する可能性があります。 関数全体でスタックポインタをチェックすることから始めることをお勧めします。誤ったスタックポインタ値を取り除きます。 次に、コールされたすべての関数のタイプを確認します。 呼び出された関数のタイプが間違っていると、他のコールに干渉して失敗につながる可能性があります。
例:
- push eax
- push edx
- push eax
- call f1
- call f2
f1が3つの引数の__stdcall関数として定義され、f2が1つの引数の関数である場合、合計4つの引数が必要であり、 3つの引数のみがスタックにプッシュされるため、コール分析は失敗します。
間接コールでエラーが発生した場合 は、コール命令の オペランドタイプを指定してください 。 また、コール命令から目的のタイプの関数に外部参照を追加することもできます。逆コンパイラは、参照される関数のタイプを使用します。
すべての入力タイプが正しく、スタックポインター値が正しいのに逆コンパイラが失敗する場合は、バグレポートを提出してください。
function frame is wrong (機能フレームが間違っています)
これはまれなエラーメッセージです。関数スタックフレームに問題があることを意味します。 最も可能性の高い原因は、フレームに差出人住所領域がないか、関数farness(far / near)がそれに一致しないことです。
undefined or illegal type (未定義または不正なタイプ)
このエラーは、名前付きタイプ(typedef)への参照が作成されたが、タイプが未定義の場合に発生する可能性があります。 最も一般的なケースは、タイプライブラリ(vc6win.tilなど)がアンロードされる場合です。 これにより、定義されているすべてのタイプへのすべての参照が無効になる場合があります。 このエラーは、型定義が不正または正しくない場合にも発生します。 未定義の順序型を修正するには、ローカル型ウィンドウ(Shift-F1)を開き、欠落しているタイプを再定義します。
inconsistent database information (一貫性のないデータベース情報)
現在、このエラーは、関数チャンク情報が正しくないことを意味します。 関数を再定義(削除および再作成)してみてください。
wrong basic type sizes in compiler settings (コンパイラ設定の基本型サイズが間違っています)
逆コンパイラが必要としている一部の基本的なタイプサイズが正しくありません。
- sizeof(int)== 4
- sizeof(enum)== 4
オプション、コンパイラダイアログボックスでタイプサイズを確認し、正しくない場合は変更してください。 また、正しいメモリモデルが選択されていることを確認してください:"near data, near code"
最後に、ポインタのサイズは次のようにする必要があります。
- 32ビットアプリケーションの場合、"near 32bit, far 48bit"を使用します。
- 64ビットアプリケーションの場合は"64bit"を使用します。
redecompilation has been required (再コンパイルが必要です)
これは内部エラーコードであり、エンドユーザーには表示されません。 それでも表示される場合は、バグレポートを提出してください。
could not compute fpu stack states (fpuスタックの状態を計算できませんでした)
逆コンパイラは、FPUスタックポインターのトレースに失敗しています。 コールされた関数タイプを確認してください。現時点でできるのはこれだけです。今後、回避策と修正コマンドを紹介します。 浮動小数点サポートの詳細については、 リンクを参照してください。
max recursion depth reached during lvar allocation (lvar割り当て中に到達した最大再帰深度)
バグレポートを提出してください。通常、このエラーメッセージは表示されません。
variables would overlap (変数が重複しています)
これは、variable allocation failure変数割り当て失敗エラーの変形です。 このエラーメッセージは、configuration file構成ファイルでHO_IGNORE_OVERLAPSを有効にしている場合にのみ表示されます。 重複する変数が出力で許可されている場合、それらは赤で表示されます。
partially initialized variable (部分的に初期化された変数があります)
部分的に初期化された変数が検出されています。 間違ったスタックトレースはこのエラーを引き起こす可能性があります。スタックポインタを確認してください。
too complex function (関数が複雑すぎます)
関数が大きすぎるか、複雑すぎます。 残念ながら、このエラーを回避するためにユーザーができることは何もありません。
no license available (利用可能なライセンスはありません)
IDAは逆コンパイラライセンスを見つけることができませんでした。
only 32-bit functions can be decompiled for the current database (現在のデータベースで逆コンパイルできるのは32ビット関数のみです)
このエラーメッセージは現在表示されません。
only 64-bit functions can be decompiled for the current database (現在のデータベースで逆コンパイルできるのは64ビット関数のみです)
IDA64は現在、64ビット関数のみを逆コンパイルできます。 32ビット関数を逆コンパイルするには、IDA32を使用してください。
already decompiling a function (すでに関数を逆コンパイルしています)
別の関数の逆コンパイル中に関数を逆コンパイルしようとする試みが検出されています。 現在、一度に逆コンパイルできる関数は1つだけです。
far memory model is supported only for pc (ファーメモリモデルはPCでのみサポートされます)
Options, Compiler dialogでデータとコードメモリモデルを確認してください。 必要に応じて、それらを「near」モデルにリセットします。
special segments cannot be decompiled (特別なセグメントは逆コンパイルできません)
現在の関数は、特別なセグメント(「外部」セグメントなど)に属しています。 このようなセグメントには実際のコードは含まれず、インポートされた関数へのポインターのみが含まれます。 関数本体は、他のダイナミックライブラリにあります。したがって、逆コンパイルできることは何もありません。
現在の関数は、最大許容サイズよりも大きくなっています。 最大許容サイズは、 MAX_FUNCSIZE構成パラメーターによって指定されます。
指定された入力範囲が間違っています。範囲ベクトルを空にすることはできません。 最初のエントリは命令を指している必要があります。範囲は重複してはなりません。 範囲は、アイテムの途中で開始または終了することはできません。
current architecture is not supported (現在のアーキテクチャはサポートされていません)
コンパイラオプションの現在のプロセッサのビット数、エンディアン、またはABI設定は受け入れられません。 下記で現在のABI制限を参照してください 。
https://hex-rays.com/products/decompiler/manual/limit.shtml
bad instruction in the delay slot (遅延スロットの命令が正しくありません)
遅延スロットでは、分岐とジャンプは許可されていません。 このような命令は例外を通知し、逆コンパイルすることはできません。
逆コンパイルが失敗した場合は、次のことを確認してください。
- the function boundaries:機能からどこにもジャンプする余計なブランチがあってはなりません。 関数は、return命令または別の関数の先頭にジャンプして、正しく終了する必要があります。 戻り値のない関数のコール後に終了する場合、コール先は戻り値のない関数としてマークする必要があります。
- the stack pointer values:Options, General, Stack pointerコマンドを使用して、 逆アセンブリビューのアドレスの直後の列に表示します。 関数のいずれかの場所でスタックポインタ値が正しくない場合、逆コンパイルが失敗する可能性があります。 スタックポインタの値を修正するには、Edit, Functions, Change stack pointerコマンドを使用します。
- the stack variables:Edit, Functions, Stack variables... コマンドを使用してスタックフレームウィンドウを開き、定義が意味をなすものなのかを確認します。 場合によっては、大きな配列または構造変数を作成すると解決される場合があります。
- the function type:コーリングコンベンション、引数の番号とタイプは正しくなければなりません。 関数タイプが指定されていない場合、逆コンパイラーはそれを推測し、失敗することがあります。 関数が非標準レジスタへの入力を予期している場合、または非標準レジスタで結果を返す場合は、逆コンパイラにそのことを通知する必要があります。 現在、非標準の入力位置については適切に推測できますが、非標準の戻り位置を処理することはできません。
- the types of the called functions and referenced data items:間違ったタイプは大混乱を引き起こす可能性があります。 Fホットキーを使用して、メッセージウィンドウに現在のアイテムのタイプを表示します。 関数の場合は、カーソルを先頭に置き、Fキーを押します。 タイプが正しくない場合は、Edit, Functions, Set function typeで変更します(ホットキーはYです)。 このコマンドは、関数だけでなく、データおよび構造体メンバーに対しても機能します。
- タイプがundefined typeを参照している場合、逆コンパイルが失敗する可能性があります
- IDAの最新バージョンで 作成されたデータベースを使用します。
場合によっては、出力に赤の変数が含まれることがあります。これは、ローカル変数の割り当てが失敗したことを意味します。 可能な修正方法については、 overlapped variables(重複する変数)に関するページをお読みください。
今後リリースされるバージョンにはより多くの修正コマンドが含まれる予定ですが、必要なコマンドを理解する必要があります。
バグレポートを有効にするには、バグを再現するのに十分な情報が含まれている必要があります。 send databaseコマンドは、 データベースに関連するすべての情報を保存するためのコマンドで、バグレポートを送信する好ましい方法です。 一部のバグは、このコマンドなしでは再現できません。
データベースは、帯域幅を節約するために圧縮形式で送信されます。転送にはSSL接続が使用されます。
データベース/入力ファイルが機密であり、送信できない場合は、問題を説明するために同様のファイルを探してみてください。
お客様のデータベースの取り扱いには今まで通り十分気を付けます。