# 逆コンパイル処理 - DE Decompiler

> ネイティブコードの逆コンパイルは、マシン命令と利用可能なメタデータから Delphi に似たステートメントを再構築します。処理オプションは、生成されたコードリストの表現方法を制御します。

Canonical HTML: <https://www.de-decompiler.com/help/jp/decompilation.htm>

## 逆コンパイル処理

ネイティブコードの逆コンパイルでは、機械語命令と利用可能なメタデータからDelphi風のPascalコードを復元します。同じ処理設定を、対応するDelphiおよびC++Builderのプログラムに適用できます。

### 再構築されたプログラムロジック

逆コンパイラは条件、`case` ブロック、ループおよび呼び出しを復元し、認識された VCL メソッドも含みます。ソースレベルの名前と型は、バイナリに保持されている情報に依存します。生成された変数名、推測された構造体レイアウト、および認識された VCL 名がない呼び出しは、ネイティブコードの再構築における通常の結果です。詳細については [復元されたコードの解釈](https://www.de-decompiler.com/help/jp/validation.htm) を参照してください。

![逆コンパイル処理のコントロール。](https://www.de-decompiler.com/image/help/jp/options_decompilation.png)
逆コンパイル処理のコントロール。

### Delphi 式とランタイム操作

認識された制御フローには、`if/else`、`case`、`for`、`while` および `repeat/until` が含まれ、ネイティブな分岐がその意味を確立する場所では `Break` および `Continue` が使用されます。

利用可能な RTTI、クラスメタデータおよびシグネチャは、オブジェクトフィールド、プロパティ、仮想メソッド、VCL 呼び出しおよびインポートされた Windows API 呼び出しをサポートします。一般的な RTL 操作は、Delphi の文字列式、`Length`、`Copy`、`Delete`、`Insert`、配列のサイズ変更とインデックス付け、バリアント配列へのアクセス、および `TextFile` 入力操作として表現できます。

これらの変換は、認識された型、呼び出し規約、およびデータフローに依存します。証拠が不十分な場合、コードリストには明示的な呼び出し、ポインタ、または分岐が保持されます。生成された意味的な変数名は推測された役割を記述するものであり、復元された元の識別子ではありません。

### スタックパラメータと最適化

**スタックパラメータの解析 (Parse stack parameters)** は呼び出しと高レベル式の再構築に寄与します。**プロシージャアナライザとオプティマイザ (Procedure analyzer and optimizer)** は認識された式および制御フローパターンを簡素化します。式や分岐が不明確な場合は、これらの制御を無効にして結果のコードリストと比較してください。

### 制御フロー処理

**If ... End Ifブロックを処理 (ネイティブコード) (Process If ... End If blocks (Native Code))** は、認識された条件分岐を高レベルの条件ブロックとして再構築します。**'Else'ブロックを処理 (Process 'Else' blocks)** は Else ブランチのヒューリスティックを追加し、If ブロックの処理を必要とします。あいまいな分岐を調査する際に、これらのコントロールの有効化状態と無効化状態を比較してください。

### プロトタイプとアドレス

**プロトタイプの分析 (Analyze prototypes)** は、プロシージャの引数と戻り値の予備的なヒューリスティック解析を実行します。これは、プライベート関数に明示的な署名メタデータがない場合に高速逆コンパイルモードで有用です。この解析には追加の初期処理時間がかかります。解析の結論に影響を与える可能性がある場合、推定された署名を呼び出し元や機械語命令に対して確認してください。

**アドレスを追加 (Add Addresses)** は、比較およびナビゲーションのために高水準コードリストに仮想アドレスを保持します。**逆アセンブラにコピー (Copy to disassembler)** を有効化している場合はこれを有効のままにしてください。逆アセンブラは、この設定とは独立してアドレスを表示します。

出力がキャッシュされている場合、またはプロジェクト全体がすでに処理済みの場合は、関連する設定を変更した後に再読み込みまたは再処理を行ってください。
