4

Java コードを逆コンパイルするときに、逆コンパイラが適切に逆コンパイルできず、出力に小さなバイトコードが残ることがあります。

逆コンパイラの弱点は何ですか? 逆コンパイルが困難なバイトコードにコンパイルされる Java ソースコードの例はありますか?

アップデート:

この情報を悪用することは、コード内の秘密を隠すための安全な方法ではないこと、および逆コンパイラは将来改善される可能性があることを認識していることに注意してください。

とはいえ、今日の逆コンパイラがどのような種類のコード フォックスを生み出しているのかを知りたいと思っています。

4

6 に答える 6

3

DB2Connect用のJDBCタイプ4ドライバーはクラシックです。1文字または2文字の名前と呼ばれるものすべて、効果がない結果になる無関係なコードなど。私はかつて、特に厄介な問題をデバッグするために調べようとしましたが、基本的にあきらめました。私は、これが実際にそのように見えるコードではなく、難読化ツールを通過したことを望んでいます(しかし決して自信がありません)。

もう1つのお気に入りのトリック(製品を思い出せませんが)は、セットから構築されるすべてのオブジェクトの名前を変更すること{'0','O','l','1'}でした。これにより、読み取りが非常に困難になりました。

于 2009-07-20T08:28:03.640 に答える
3

難読化ツールを通過した Java バイト コードには、逆コンパイラからの「ばかげた」出力が含まれます。また、JVM バイト コードにコンパイルされる Scala のような他の言語がある場合、Java でバイト コードを簡単に表現できるというルールはありません。

時間の経過とともに、逆コンパイラは新しい言語機能とそれが生成するバイト コードに対応する必要があるため、使用しているツールによって新しい言語機能が簡単に元に戻されないのはもっともなことです。

編集: .NET の例として、次のコード:

lock (this)
{
    DoSomething();
}

これにコンパイルされます:

Monitor.Enter(this);
try
{
    DoSomething();
}
catch
{
    Monitor.Exit(this);
}

逆コンパイラは、(他の .NET 言語とは対照的に) C# には、これら 2 つの呼び出し専用の特別な構文があることを認識している必要があります。そうしないと、予期しない (冗長な) 結果が得られます。

于 2009-07-20T08:18:57.760 に答える
2

適切なスタイルのソース コードに逆コンパイルできると仮定すると (常にそうできるとは限りません)、「リバース エンジニアリング」が難しいのは、なじみのない問題領域で動作するアルゴリズムです。高速フーリエ変換を理解していなくても、FFT バタフライを実装するコードを取得できれば問題ありません。(このフレーズに慣れていない場合は、エンコードすれば既に勝っています。慣れている場合は、かなり優秀なエンジニアであり、おそらくコードのリバース エンジニアリングにはまったく興味がありません)。[北朝鮮人との距離は異なる場合があります。]

于 2009-09-04T04:04:15.643 に答える
0

多くの場合、例外は逆コンパイルが困難です。ただし、難読化されたコードや別の言語で記述されたコードは、逆コンパイルするのが困難です。

ところで:なぜあなたはこれを知りたいのですか?

于 2009-07-20T08:21:26.507 に答える
0

Java Bytecode は Java 構造に直接対応していないため、逆コンパイルは、特定の Java バイト コード シーケンスが Java コード構造に対応することを知っていることを意味します。

Java バイト コードを逆コンパイルするための Soot フレームワークには、これに関する多くの情報がありますが、現在、その Web ページはダウンしています。

http://www.sable.mcgill.ca/soot/

于 2009-07-20T11:43:33.447 に答える
0

Java は多くの情報をバイトコードに保持します (たとえば、多くの名前)。したがって、逆コンパイルは比較的簡単です。ほとんどの場合、逆コンパイルが難しいバイトコードは、読みにくいソースコードによって生成されます (そのため、実際にはオプションではありません)。本当にコードを難読化したい場合は、すべてのメソッドと変数の名前を認識できないものに変更する難読化ツールを使用してください。

于 2009-07-20T08:18:24.533 に答える