18

ネイティブ x86 バイナリの逆コンパイルと比較して、.NET IL コードをソース コードに逆コンパイルする方が簡単なのはなぜですか? (Reflector はほとんどの場合、非常に優れたソース コードを生成しますが、C++ コンパイラの出力を逆コンパイルすることはほとんど不可能です。)

IL に多くのメタデータが含まれているためでしょうか。それとも、IL が x86 命令よりも高度に抽象化されているためですか? いくつかの調査を行ったところ、次の 2 つの有用な記事が見つかりましたが、どちらも私の質問には答えていません。

4

4 に答える 4

26

あなたはすでに最も重要なビットを持っていると思います。

  • おっしゃる通り、利用可能なメタデータは他にもあります。C または C++ コンパイラによって出力されるものの詳細はわかりませんが、はるかに多くの名前と同様の情報が IL に含まれていると思われます。たとえば、特定のスタックフレームの内容について逆コンパイラが知っていることを見てください-x86に関する限り、スタックがどのように使用されているかしかわかりません。ILでは、スタックの内容が何を表しているかを知っています(または、少なくともタイプ-セマンティックな意味ではありません!)
  • 繰り返しますが、既に述べたように、IL は x86 よりも高いレベルの抽象化です。x86 は、メソッドや関数の呼び出し、イベント、プロパティなどを認識していません。IL には、そのすべての情報がまだ含まれています。
  • 通常、C および C++ コンパイラは、(たとえば) C# コンパイラよりも大幅に最適化します。これは、C# コンパイラが、ほとんどの最適化がまだ後で (JIT によって) 実行できると想定しているためです。C# コンパイラではなく JIT で利用できるさまざまな情報があるため、C# コンパイラで多くの最適化を行わないようにすることは、いくつかの点で理にかなっています。最適化されたコードは、元のソース コードの自然な表現からかけ離れているため、逆コンパイルが難しくなります。
  • IL は JIT コンパイルされるように設計されています。x86 は、ネイティブで実行されるように設計されています (確かにマイクロコードを介して)。JIT コンパイラーが必要とする情報は、逆コンパイラーが必要とする情報と似ているため、逆コンパイラーは IL をより簡単に使用できます。いくつかの点で、これは実際には 2 番目のポイントの単なる言い直しにすぎません。
于 2009-03-22T19:20:20.360 に答える
9

リバース エンジニアリングをかなり簡単にする要素がいくつかあります。

  • タイプ情報。これは大規模です。x86 アセンブラーでは、変数の使用方法に基づいて変数の型を推測する必要があります。

  • 構造。アプリケーションの構造に関する情報は、il 逆アセンブリでより入手できます。これを型情報と組み合わせると、驚くほどの量のデータが得られます。この時点で、かなり高いレベルで作業しています (x86 アセンブラーに比べて)。ネイティブ アセンブラーでは、データの使用方法に基づいて、構造のレイアウト (およびそれらが構造であるという事実さえも) を推測する必要があります。不可能ではありませんが、はるかに時間がかかります。

  • 名前。物の名前を知っていると役に立ちます。

これらのことを組み合わせると、実行可能ファイルに関する非常に多くのデータがあることを意味します。Il は基本的に、ネイティブ コードのコンパイラよりもはるかにソースに近いレベルで動作します。一般的に言えば、バイトコードが動作するレベルが高いほど、リバース エンジニアリングが容易になります。

于 2009-03-22T19:17:12.287 に答える
4

C# と IL はほぼ 1 対 1 で対応します。(これは、いくつかの新しい C# 3.0 機能ではそれほどではありません。) マッピングの近さ (および C# コンパイラにオプティマイザーがないこと) により、物事は非常に「可逆的」になります。

于 2009-03-22T18:36:01.073 に答える
3

ブライアンの正解を拡張する

すべての IL が簡単に逆コンパイルできると思われる場合は、重要な F# プログラムを作成し、そのコードを逆コンパイルすることをお勧めします。F# は多くのコード変換を行うため、実際に出力された IL と元のコード ベースからのマッピングは非常に貧弱です。私見ですが、逆コンパイルされた F# コードを見て、元のプログラムに戻すのは、C# や VB.Net の場合よりもはるかに困難です。

于 2009-03-22T19:21:55.143 に答える