12

それで、逆コンパイラーは本当にコンパイルされた/解釈されたコードのソースを与えるものですか?私にはそれは不可能に聞こえるからです。コンパイルされた場合、関数、変数、クラスなどの名前をどのように取得しますか。それとも私は定義を誤解していますか?それはどのように機能しますか?そして、それを作ることの背後にある一般的な原則は何ですか?

4

4 に答える 4

12

あなたは逆コンパイラの定義について正しいです:それはコンパイルされたアプリケーションを取り、一致するソースコードを生成します。ただし、ほとんどの場合、変数/関数/クラスの名前と構造はわかりません。推測するだけです。プログラムのフローを分析し、特定のプログラミング言語(通常はC)を介してそのフローを表す方法を見つけようとします。ただし、選択したプログラミング言語(この例ではC)は、多くの場合、状態よりも高いレベルにあるためです。基礎となるプログラム(バイナリ実行可能ファイル)の場合、プログラムの一部を正確に表現できない場合があります。この場合、逆コンパイラーは失敗し、逆アセンブラーを使用する必要があります。これが、多くの人がコードを難読化することを好む理由です。逆コンパイラーがコードを開くのがはるかに難しくなります。

デコンパイラーの構築は簡単な作業ではありません。基本的に、逆コンパイルするアプリケーション(実行可能ファイルまたは他の形式のコンパイル済みアプリケーション)を取得して、メモリ内で操作できるある種のツリーに解析する必要があります。if次に、プログラムのフローを分析し、ステートメント/変数/関数などがコード内の特定の場所で使用されたことを示唆するパターンを見つけようとします。それはすべて実際には単なる推測ゲームです。コンパイラがコンパイルされたコードで作成するパターンを知ってから、それらのパターンを検索して、人間が読める同等のソースコードに置き換える必要があります。

これは、Javaや.NETなどの高レベルのプログラムではすべてはるかに簡単です。このプログラムでは、アセンブリ命令を処理する必要がなく、変数などがほとんど処理されます。そこでは、直接翻訳するほど推測する必要はありません。正確な変数/メソッド名を持っていないかもしれませんが、少なくともプログラム構造をかなり簡単に推測することができます。

免責事項:私は逆コンパイラーを書いたことがないので、私が話していることの詳細をすべて知りません。逆コンパイラーの作成に本当に興味がある場合は、そのトピックに関する本を入手する必要があります。

于 2010-05-25T04:50:17.927 に答える
1

逆コンパイラーは基本的にマシンコードを取得して、フォーマットされた言語に戻します。私が間違っていなければ、逆コンパイラーはコンパイルされた言語を知る必要があると思います。そうでないと機能しません。

デコンパイラの基本的な目的は、ソースコードに戻ることです。たとえば、Javaファイルが破損したことがあり、それを元に戻すためにできることは、逆コンパイラを使用することだけでした(クラスファイルは破損していなかったため)。

于 2010-05-25T04:52:50.660 に答える
1

これは、オブジェクトコードの内容の「合理的な」(いくつかのヒューリスティックに基づく)表現を推測することによって機能します。それが生成するものと元々そこにあったものとの間の類似性の程度は、それが開始するバイナリに含まれる情報の量に大きく依存する傾向があります。基本的に「純粋な」バイナリから始める場合、それは一般に、変数の「合理的な」名前、たとえばforループインデックス、および他のほとんどの長い名前をi作成jするだけで行き詰まります。k

一方、イントロスペクションをサポートする言語では、変数名、タイプなどに関するより多くの情報を実行可能ファイルに埋め込む必要があります。このような場合、逆コンパイルは、通常、関数や変数などの元の名前を保持するなど、元の名前に非常に近いものを生成できます。このような場合、逆コンパイラは、元の名前と非常によく似たものを生成することがよくあります。フォーマットとコメントに過ぎません。

于 2010-05-25T04:56:53.037 に答える
0

これは、逆コンパイルする言語によって異なります。CやC++のようなものを逆コンパイルする場合、提供される情報は関数名と引数(DLL内)のみです。Javaを扱っている場合、コンパイラは通常、行番号、変数名、フィールド名、メソッド名などを挿入します。変数名がない場合は、、、のような名前にlocalInt1なりlocalInt2ますlocalException1。またはコンパイラが何であれ。また、行番号により、行間の間隔を知ることができます。

于 2012-07-30T13:19:05.373 に答える