2012-09-16 28 views
48

Javaコードを逆コンパイルするのがどれくらい簡単か分かりました。私はネットの周りを検索してきましたが、私は理解できないようです。WHYとても簡単です。たびに私は何か "なぜ私は.classファイルを分解することができますか? 「なぜJavaはとても簡単に逆コンパイルできますか?」というのは、自分のコードを簡単に逆コンパイルできるソフトウェアへのリンクだけです。だから私はあなたに向かうStackOverflow:なぜJavaは容易に読みやすいソースコードに変換できるのですが、C++や他の言語は逆コンパイルにはあま​​り親切ではありませんか?Javaコードを逆コンパイルするのはなぜ簡単ですか?

ありがとう

+23

Javaは実際にはC++と同じ方法で「コンパイル」されることはありません。 (少なくともJITが始動するまで) – Mysticial

+2

これをもっと難しくしたいのであれば、ZKMのような適切なobfuscaterを使います。制御フローの難読化は、逆コンパイラがコードを逆コンパイルできないようにします。ユーザーはまずZKMとバイトコードエンジニアリングの高い知識を必要とするあなたのコードをdeobする必要があります。 – LanguagesNamedAfterCofee

+2

しかし、すべてのクラスを逆コンパイルすることはできず、すべての逆コンパイルされたクラスは修正なしにコンパイルされません。 –

答えて

55

Javaのバイトコードはアセンブリよりもソースに近いため(より似ています)。すべてのJava(または.NET)逆コンパイラが行う必要

特に

.classファイルはなどクラス名のメタデータ、メソッド名、フィールド&パラメータの型が含まれて...
は、各メソッド本体の指示を見ています、それらを適切な統語構造に変換します。

対照的に、C++などのネイティブ言語にはメタデータがまったく含まれていないため、逆コンパイラはすべてをに再構築する必要があります。

+9

また、javaバイトコードは、実行時にコードを最適化するためにJITterに依存しているため、ネイティブコードの方法に最適化されていません。 – Dan

21

Javaは、元のJavaコードに含まれる大量の情報を保持する中間形式のJVMバイトコードにコンパイルされます。 C++のような言語は、元のコードとは外観が大きく異なるため、アセンブリコードにコンパイルされます。したがって、元に戻すことは難しくなります。

+5

+1。したがって、ポイントはバイトコードであり、Javaではありません。 Javaをx86命令(http://www.excelsior-usa.com/jet.html、http://gcc.gnu.org/java/)にコンパイルしてから、C++と逆コンパイルするのは難しいでしょう。 –

+1

@AlexeiKaigorodov結果のコードがまだリフレクションを有効にしている場合は、C++よりも逆コンパイルが容易です。 – Dave

+0

@Dave:これはメソッド/クラスレベルの情報に当てはまりますが、メソッド内の実際の*命令は '.class'ファイルより逆コンパイルするのが難しくなります。 –

関連する問題