Delphi の逆コンパイル (1/3)
リバースエンジニアリングについて
Westend61 /ゲッティイメージズ
簡単に言えば、逆コンパイルはコンパイルの逆で、実行可能ファイルを高水準言語に変換します。
Delphi プロジェクトのソースを紛失し、実行可能ファイルしかないとします。元のソースが利用できない場合は、リバース エンジニアリング (逆コンパイル) が役立ちます。
うーん、「ソースが利用できません」とは、他の人の Delphi プロジェクトを逆コンパイルできるということですか?はい、いいえ...
真の逆コンパイルは可能ですか?
いいえ、もちろん違います。完全に自動化された逆コンパイルは不可能です。元のソース コードを正確に再現できる逆コンパイラはありません。
Delphi プロジェクトをコンパイルおよびリンクして、スタンドアロンの実行可能ファイルを生成すると、プログラムで使用されるほとんどの名前がアドレスに変換されます。この名前の喪失は、逆コンパイラがすべての定数、変数、関数、およびプロシージャに対して一意の名前を作成する必要があることを意味します。ある程度の成功が達成されたとしても、生成された「ソース コード」には意味のある変数名と関数名がありません。
明らかに、ソース言語の構文は実行可能ファイルには存在しません。逆コンパイラが実行可能ファイルに存在する一連の機械語命令 (ASM) を解釈し、元のソース命令が何であったかを判断することは非常に困難です。
逆コンパイルを使用する理由とタイミング
リバース エンジニアリングは、次のようないくつかの理由で使用できます。
- 失われたソースコードの回復
- 新しいハードウェア プラットフォームへのアプリケーションの移行
- プログラム内のウイルスまたは悪意のあるコードの存在の判断
- アプリケーションの所有者が修正を行うことができない場合のエラー修正。
- 他人のソース コードの復元 (たとえば、アルゴリズムを決定するため)。
これは合法ですか?
リバース エンジニアリングはクラックではありませんが、これら 2 つの間に細い線を引くのは難しい場合があります。コンピュータ プログラムは、著作権法および商標法によって保護されています。著作権所有者の権利に対する例外は、国によって異なります。最も一般的なものは、逆コンパイルしてもよいと述べています: インターフェイス仕様が利用可能にされていない場合の解釈可能性の目的のため、著作権の所有者が修正を行うことができない場合のエラー修正の目的のため、パーツを決定するため著作権で保護されていないプログラムの。もちろん、プログラムの exe ファイルの逆アセンブルが許可されているかどうか疑問がある場合は、細心の注意を払う必要があります。弁護士に相談してください。
ノート : Delphi のクラック、キー ジェネレータ、または単にシリアル番号を探している場合: 間違ったサイトにアクセスしています。ここにあるものはすべて、探索/教育目的でのみ記述/提示されていることに注意してください。
現時点では、ボーランドは、実行可能 (.exe) ファイルまたは「Delphi コンパイル済みユニット」 (.dcu) を元のソース コード (.pas) に逆コンパイルできる製品を提供していません。
Delphi コンパイル済みユニット (DCU)
Delphi プロジェクトをコンパイルまたは実行すると、コンパイル済みユニット(.pas)ファイルが作成されます。デフォルトでは、各ユニットのコンパイル済みバージョンは、ユニット ファイルと同じ名前で拡張子が .DCU の別のバイナリ形式ファイルに保存されます。たとえば、unit1.dcu には、unit1.pas ファイルで宣言されたコードとデータが含まれています。
これは、たとえばコンポーネントがコンパイルされたソースを持っている場合、それを逆にしてコードを取得するだけでよいことを意味します。違う。 DCU ファイル形式は文書化されておらず (独自の形式)、バージョンごとに変更される可能性があります。
コンパイラの後: Delphi リバース エンジニアリング
Delphi 実行可能ファイルを逆コンパイルする場合は、次のことを知っておく必要があります。
Delphi プログラムのソース ファイルは、通常、ASCII コード ファイル(.pas、.dpr)とリソース ファイル(.res、.rc、.dfm、.dcr)の 2 つのファイル タイプで保存されます。 Dfm ファイルには、フォームに含まれるオブジェクトの詳細 (プロパティ) が含まれています。作成時 エグゼ 、Delphi は .dfm ファイルの情報を完成した .exe コード ファイルにコピーします。フォーム ファイルは、すべての永続プロパティの値を含め、フォーム内の各コンポーネントを記述します。フォームの位置やボタンのキャプションを変更したり、イベント プロシージャをコンポーネントに割り当てたりするたびに、Delphi はそれらの変更を DFM ファイルに書き込みます(イベント プロシージャのコードではなく、pas/dcu ファイルに保存されます)。実行可能ファイルから「dfm」を取得するには、Win32 実行可能ファイル内に格納されているリソースのタイプを理解する必要があります。
Delphi でコンパイルされたすべてのプログラムには、CODE、DATA、BSS、.idata、tls、.rdata、.rsrc というセクションがあります。逆コンパイルの観点から最も重要なのは、CODE セクションと .rsrc セクションです。の中に ' Delphi プログラムへの機能の追加 この記事では、Delphi 実行形式、クラス情報、および DFM リソースに関するいくつかの興味深い事実が示されています。同じフォームで定義された他のイベント ハンドラによって処理されるイベントを再割り当てする方法です。さらに、ボタンのキャプションを変更するコードを実行可能ファイルに追加して、独自のイベント ハンドラーを追加する方法についても説明します。
exe ファイルに保存される多くの種類のリソースの中で、RT_RCDATA またはアプリケーション定義のリソース (生データ) は、コンパイル前に DFM ファイルにあった情報を保持します。 exe ファイルから DFM データを抽出するために、 EnumResourceNames API 関数... 実行可能ファイルから DFM を抽出する方法の詳細については、以下を参照してください。 Delphi DFM エクスプローラのコーディング 論文。
リバース エンジニアリングは伝統的に、アセンブリ言語とデバッガに精通した技術的な魔法使いの世界でした。 Delphi の逆コンパイラがいくつか登場しており、技術的な知識が限られていても、ほとんどの Delphi 実行可能ファイルをリバース エンジニアリングできます。
Delphi プログラムのリバース エンジニアリングに興味がある場合は、次の「逆コンパイラ」を参照することをお勧めします。
IDR (インタラクティブ Delphi リコンストラクター)
実行可能ファイル (EXE) の逆コンパイラと 動的ライブラリ (DLL)、Delphi で記述され、Windows32 環境で実行されます。プロジェクトの最終目標は、初期の Delphi の大部分を復元できるプログラムの開発です。 ソースコード コンパイルされたファイルからですが、IDRや他のDelphi逆コンパイラはまだそれを行うことができません。それにもかかわらず、IDR はそのようなプロセスを大幅に促進できる状態にあります。他のよく知られている Delphi 逆コンパイラと比較して、IDR 分析の結果は完全性と信頼性が最も高くなります。
リセラー
Revendepro は、プログラム内のほぼすべての構造 (クラス、型、プロシージャなど) を見つけて、パスカル表現を生成します。プロシージャはアセンブラで記述されます。アセンブラの制限により、生成された出力を再コンパイルすることはできません。この逆コンパイラのソースは自由に入手できます。残念ながら、これは私が使用できなかった唯一の逆コンパイラです。Delphi 実行可能ファイルを逆コンパイルしようとすると、例外が表示されます。
EMS ソースレスキュー
EMS Source Rescuer は使いやすいウィザード アプリケーションで、失われたソース コードを復元するのに役立ちます。 Delphi または C++Builder プロジェクト ソースを失ったが、実行可能ファイルがある場合、このツールは失われたソースの一部を救うことができます。 Rescuer は、割り当てられたすべてのプロパティとイベントを含むすべてのプロジェクト フォームとデータ モジュールを生成します。生成されたイベント プロシージャには本体がありませんが (逆コンパイラではありません)、実行可能ファイルにコードのアドレスがあります。ほとんどの場合、Rescuer を使用すると、プロジェクトの復元にかかる時間を 50 ~ 90% 節約できます。
デデ
DeDe は、Delphi でコンパイルされた実行可能ファイルを分析できる非常に高速なプログラムです。逆コンパイル後、DeDe は次の結果を返します。
- ターゲットのすべての dfm ファイル。 Delphi でそれらを開いて編集することができます。
- 文字列、インポートされた関数呼び出し、クラス メソッド呼び出し、ユニット内のコンポーネント、Try-Except および Try-Finally ブロックへの参照を含む、よくコメントされた ASM コード内の公開されたすべてのメソッド。デフォルトでは、DeDe は公開されたメソッド ソースのみを取得しますが、[ツール] メニューの [プロシージャの逆アセンブル] を使用して RVA オフセットがわかっている場合は、実行可能ファイルで別のプロシージャを処理することもできます。
- 多くの追加情報。
- すべての dfm、pas、dpr ファイルを含む Delphi プロジェクト フォルダを作成できます。注: pas ファイルには、上記のよくコメントされた ASM コードが含まれています。それらは再コンパイルできません!