デコンパイラとは何ですか?それはどのように機能しますか? [閉まっている

StackOverflow https://stackoverflow.com/questions/2902074

  •  04-10-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

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

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

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

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

他のヒント

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

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

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

一方、内省をサポートする言語は、変数名、タイプなどに関するより多くの情報を実行可能ファイルに埋め込む必要があります。このようなケースでは、繰り返しは、機能、変数などの元の名前を通常保持するなど、オリジナルにずっと近いものを生成できます。そのような場合、逆コンパイラはしばしば何かを生成できます とても オリジナルと同様に、フォーマットやコメント以上のものを失う可能性があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top