私はexeファイルを持っていて、それをIdaで逆コンパイルしました。プログラムは Delphi でコーディングされていると言われたので、DeDe で逆コンパイルしようとしましたが、失敗し、出力もエラーもありませんでした。そして、プログラミング言語用に特別に書かれたさまざまな逆コンパイラを試すことで、exeの作成に使用される言語を見つけることは可能でしょうか? それとも、他の理由で失敗する可能性がありますか?
2 に答える
多くの場合、コードのコンパイルに使用されたコンパイラを識別し、そこから元の言語を識別することができます。
ほとんどの言語実装には、言語のさまざまな高レベル操作を実装するためのある種のランタイム ライブラリが含まれています。たとえば、C にはファイル I/O 操作( など)を実装する CRT がありfopen
、fread
Delphi にはそのstring
タイプ(連結、代入など)用のコンパイラ ヘルパーがあり、ADA には言語の安全性を確保するためのさまざまな低レベル関数があります。プログラムのコードと候補コンパイラのランタイム ライブラリを比較すると、一致するものを見つけることができる場合があります。
IDA は、このアプローチをFLIRT テクノロジーに実装しています。署名を使用することにより、IDA は DOS および Windows の主要なコンパイラのほとんどを判別できます。Linux では、コンパイラ バイナリの単一のプロバイダーが存在しないため、多少難しくなります。そのため、ディストリビューションごとに署名を作成する必要があります。
ただし、ランタイム ライブラリ コードに頼らなくても、使用されているコンパイラを特定できる場合があります。多くのコンパイラは、さまざまな操作を表すために非常に異なるイディオムを使用しています。たとえば、Duqu ウイルスに使用されたコンパイラは Visual C++ であると推測できましたが、これは後で確認されました .
.so
コンパイルは損失を伴うプロセスであるため、一般に、実行可能ファイル (またはや などの他のコンパイル済みプログラム モジュール) を逆コンパイル.dll
して元の言語でソース コードを復元したり、元の言語が何であったかを明確に判断したりすることはできません。元のソースコード言語が 1 つだけであるとは限りません。リンクする前に、さまざまなモジュールがさまざまな言語で記述されている可能性があるためです。通常、バイナリを逆アセンブルしてアセンブリ言語を復元できますが、その価値は非常に限られています。
多くの場合、バイナリから (シンボルが) 削除されていなければ、元の言語について何かを知ることができます。たとえば、通常、バイナリ内のシンボルを調べることで、バイナリが元々C++で記述されているかどうかを判断できます(Linux では を使用objdump
します。Windows では同等のものが何であるかはわかりません) 。C++シンボルは特定の方法でマングルされます。100%の保証ではありませんが、可能性は高いです。
とはいえ、一部の逆コンパイラは、非常に難しいタスクをかなり合理的に処理します。バイナリから高レベルの構造を推測するのは簡単ではありません。私の (非常に限られた) 経験では、それらはかなり些細なプログラムや、元のコンパイラの狭い範囲のバージョンでコンパイルされたソフトウェアに対しては機能する傾向がありますが、実質的なものでは機能しません。逆コンパイラの作成者が追いつくのは非常に困難です。コンパイラの変更、および彼女がそうするインセンティブはほとんどない可能性があります。
逆コンパイルが非常に成功した場合でも、結果は本質的に完全にコメント解除された無意味な変数名を持つ、理解するのが非常に困難なコードになります。逆コンパイルは 1 つのことであり、結果から意図したセマンティックな意味を抽出することは別のことです。多くの変数、分岐、ループ、および関数が完全に最適化され、多くの関数がインライン化されていることを忘れないでください。したがって、「ソース コード」は、この方法で取得できたとしても、それほど多くはない可能性があります。あなたに役立つ。