42

今、私は最高の Java 逆コンパイラを見つけようとしていますが、これらを見つけました:

これらの逆コンパイラを使用して、このクラスのバイト コードを処理します。

public class ss
{
public static void main(String args[])
{
  try{
   System.out.println("try");

  }
  catch(Exception e)
  {
   System.out.println("catch");
  }
  finally
  {System.out.println("finally");}
}
}

そして、私は次の結果を得ました:

シダの花:

public class ss {

   public static void main(String[] var0) {
      try {
         System.out.println("try");
      } catch (Exception var5) {
         System.out.println("catch");
      } finally {
         System.out.println("finally");
      }

   }
}

DJ Java 逆コンパイラ:

import java.io.PrintStream;

public class ss
{

    public ss()
    {
    }

    public static void main(String args[])
    {
        System.out.println("try");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception;
        exception;
        System.out.println("catch");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception1;
        exception1;
        System.out.println("finally");
        throw exception1;
    }
}

カバ:

import java.io.PrintStream;

public class ss
{

    public ss()
    {
    }

    public static void main(String args[])
    {
        System.out.println("try");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception;
        exception;
        System.out.println("catch");
        System.out.println("finally");
        break MISSING_BLOCK_LABEL_50;
        Exception exception1;
        exception1;
        System.out.println("finally");
        throw exception1;
    }
}

http://java.decompiler.free.fr/ :

import java.io.PrintStream;
public class ss
{
  public static void main(String[] paramArrayOfString)
  {
    try
    {
      System.out.println("try");
    }
    catch (Exception localException)
    {
      System.out.println("catch");
    }
    finally {
      System.out.println("finally");
    }
  }
}

逆コンパイラで最良の結果が得られることがわかります:http://java.decompiler.free.fr/

テストするために、非常に単純なコードを書きました。逆コンパイラをテストするためにどのコードを書くべきだと思いますか? おそらく、try{} catch(){} finally{} よりも優れているのではないでしょうか?

4

9 に答える 9

26

テストに使用するコードは、ターゲット クラスのコンパイルに使用される JDK で使用可能な機能をテストする必要があります。たとえば、ターゲットが Java 1.5 で記述されていることがわかっている場合、コードにジェネリックが含まれている可能性があると想定するのが妥当であるため、選択した逆コンパイラがそれらを適切に処理することを確認する必要があります。私の経験では、無料で入手できる逆コンパイラは、サポートする機能の点で JDK リリースよりも 1 ~ 2 リリース遅れる傾向があります。

個人的な試行錯誤に基づいて、JDは一般的に最高の仕事をする傾向があります。ただし、1.3 以前で記述されたコードを逆コンパイルする場合は、JODEを試してみることをお勧めします。

編集、5年後:

CFRProcyonFernflowerがこの分野をリードしています。

于 2010-10-12T15:33:20.270 に答える
10

プロキオンには独自の比較があります。

于 2013-06-12T09:04:43.040 に答える
8

私はhttp://java.decompiler.free.fr/を長い間使用してきましたが、これが最高のものであることがわかりました。特に、サードパーティの jar を逆コンパイルするために使用し、ソース コードも変更することができました。

使いやすく、UIもすっきりしています。

更新: Java Decompiler はhttp://java.decompiler.free.fr/で利用できなくなりました。ダウンロードできる新しいリンクhttp://jd.benow.ca/があります。

于 2010-11-30T08:57:30.797 に答える
6

JD Java Decompilerfernflowerは、この特定のテストケースで可能な限り優れた逆コンパイル コードを生成しているようです。他の 2 つは良い仕事をしていません、IMO。

逆コンパイラをテストするためにどのコードを書くべきだと思いますか?

  1. 利用可能なすべてのコンストラクトを使用して、より複雑なコードを記述します。
  2. 実際のコードで試してみてください。
  3. 難読化された実際のコードで試してみてください。

ソースからコンパイルするコードを試すときは、さまざまな「-g」オプションとさまざまな Java コンパイラを試してみてください。

于 2010-10-10T05:49:42.383 に答える
6

意味のある結果が得られると予想される場合は、もう少し複雑なコードでテストする必要があります。Fernflower は、非常に特殊で難読化されたバイトコードを処理する目的で作成されました。したがって、このような単純なスニペットを逆コンパイルすることは大したことではありません。ところで、Fernflower のスタンドアロン バージョンのテストに興味がある場合は、fernflower(dot)decompiler(at)gmail(dot)com に連絡してください。バージョン 0.8.4 は現在セミパブリック ベータ版です (ただし、Web サイトではまだ利用できません)。

于 2010-10-15T08:49:04.420 に答える
5

http://www.reversed-java.com/fernflower/、github.com /vorburger/ScratchApplet で私の比較を参照してください

于 2010-11-27T00:34:21.453 に答える
4

詳細については、JD は、switch(enum)、switch(string)、assert ステートメント、および for-each ループをサポートしています。

-g(javac) オプションについては、

  • 行番号を省略した場合、JD は元の命令フローを再構築できません。ループの種類が確定できず、複数の代入が再生成できず、ソース コードを再調整するために使用されるアルゴリズムが機能しません。
  • ローカル変数データを省略すると、JD は変数の正確な範囲を特定できない場合があります。問題ありです。
于 2010-10-12T19:43:16.837 に答える
1

わかりました、これは私の携帯電話から書かれているので、我慢してください。

まず第一に、すべての Java ファイル コードは、それぞれの.classファイルでバイトコードにコンパイルされます。これは、定数が格納されAS IS(したがって文字列を簡単に取得できる)、変数がレジスタに割り当てられ、JVM がクラス ファイルを処理するときにスタック プログラムの実行に置かれることを意味します。

例外ブロックが作成した元のコードに返されない理由は、javac がコードをコンパイルして Java バイトコードに変換したためです。

どの逆コンパイラが最適に機能するかを知りたい場合は、いくつかの式を使用して Java のよく知られたステートメント (for ループ、if ステートメント、while ループ) をすべて記述し、元のコードを最もよく表しているものを確認してください。

幸運を。

于 2010-10-10T00:16:57.487 に答える
0

このスレッドへのフィードバックからしばらく経ちました。しかし、私はそれを見つけて入力を真剣に受け止めたので、最新情報を提供することが重要だと感じています.

Java Decompiler Free を使用して成功しました。しかし、最近、実動 J2EE アプリケーションのかなりの量のコードを誤って削除してしまいました。JD Freeがそれを処理すると想定していましたが、ジェネリックはまったく処理しません。さらに、変数の初期化を完全に間違って処理するコードがありました。私が終わったのは完全な混乱でした。

仕事に正しく役立つものは何もないかもしれません。私の場合、それはバックアップ、バックアップ、バックアップの単なる別のレッスンです。一括復旧を行うには、ジェネリックを適切に処理する逆コンパイラが必要です。ただし、変数の処理の精度も役立ちます。ツールに元のコードを吐き出すように頼むのはやり過ぎです。しかし、これまで見てきたことは、コンパイルはできますが、ジェネリックはさておき、正しく機能しません。ということで、クリスマスまでは長い一週間になると思います!!

于 2012-12-19T17:26:12.040 に答える