Hex-Rays SDK
逆コンパイラには、バイナリコードの2つの表現があります。
- マイクロコード: プロセッサ命令が変換され、逆コンパイラが最適化して変換します。
- ctree: ctreeは、最適化されたマイクロコードから構築され、 Cステートメントと式を使用してASTのようなツリーを表します。Cコードとしてコピーできます。
マイクロコードは、次のクラスで表されます:
- mba_t:逆コンパイルされたコードと基本ブロックの配列に関する一般的な情報を保持します。通常、mba_tの名前は「mba」です。
- mblock_t:基本ブロック。手順のリストが含まれています
- minsn_t:命令。左、右、宛先の3つのオペランドが含まれています
- mop_t:オペランド。タイプに応じて、数値、レジスタ、スタック変数などのさまざまな情報を保持できます。
- mlist_t:メモリまたはレジスタの場所のリスト。広大なメモリ領域と複数のレジスタを保持できます。 このクラスは、逆コンパイラーで非常に広く使用されています。 命令または基本ブロック全体によってアクセスされる場所のリストを表す場合があります。 また、多くの関数の引数としても使用されます。たとえば、mlist_tを参照する命令を検索する関数があります。
https://www.hex-rays.com/blog/microcode-in-picturesを参照してください。
Ctreeは次のように表されます。
- cfunc_tは、mba_tへのポインターを含む、逆コンパイルされたコードに関する一般的な情報を保持します。 “mba_t. deleting cfunc_tはmba_t”を削除します。 (ただし、逆コンパイラーはcfuncptr_tを返します。これは参照カウントオブジェクトであり、 基になる関数へのすべての参照がスコープ外になるとすぐに削除されます。)。 cfunc_tには 'body'があり、これは逆コンパイルされた関数本体をcinsn_tとして表します。
- cinsn_tC:ステートメント。複合ステートメントまたはその他の正当なCステートメント (if、for、while、return、expression-statementなど)にすることができます。 ステートメントタイプに応じて、追加情報へのポインタがあります。たとえば、「if」ステートメントにはcif_tへのpoinerがあり、 これは「if」条件、「then」ブランチ、およびオプションで「else」ブランチを保持します。 cinsn_tという名前にもかかわらず、「指示」ではなく「ステートメント」と言うことに注意してください。 指示はマイクロコードの一部であり、ctreeではありません。
- cexpr_t:C Statement。必要に応じて、Cステートメントの一部として使用されます。 cexpr_tには、式の型を保持する「type」フィールドがあります。
- citem_tは、cinsn_tおよびcexpr_tの基本クラスであり、アドレス、ラベル、オペコードなどの一般的な情報を保持します。
- cnumber_t:定数64ビット数。その値に加えて、10進数、16進数、またはシンボリック定数(列挙型メンバー) としての表現方法に関する情報も保持されます。数値はマイクロコードでは別のクラス(mnumber_t)で表されることに注意してください。
詳細については、 https://www.hex-rays.com/blog/hex-rays-decompiler-primerを参照してください。
マイクロコードとctreeはどちらも、次のクラスを使用します。
- lvar_tローカル変数。スタック変数またはレジスタ変数を表す場合があります。 変数には名前、タイプ、場所などがあります。変数のリストはmba-> varsに格納されます。
- lvar_locator_tは、可変ロケーション(vdloc_t)とその定義アドレスを保持します。
- vdloc_tは、レジスタ番号やスタックオフセットなどの可変の場所を記述します。
複雑な場合は、レジスタとスタックの場所を組み合わせることもできます。idaで使用されているargloc_tと非常によく似ています。
argloc_tとvdloc_tの違いは次のとおりです。
- vdloc_tはARGLOC_REG2を使用しません
- vdloc_tは、プロセッサレジスタ番号の代わりにマイクロレジスタ番号を使用します
- vdloc_tではスタックオフセットが負になることはありませんが、argloc_tでは負のオフセットが存在する可能性があります
上記は、このヘッダーファイルで最も重要なクラスです。多くの補助クラスがあります。 ヘッダーファイルでそれらの定義を参照してください。
マイクロコードで使用される仮想マシンの説明も参照してください。