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