web-dev-qa-db-ja.com

選択してテストJava decompiler

今、私は最高の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");}
}
}

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

fernflower:

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;
    }
}

cavaj:

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 {}よりも良いでしょうか?

41
user471011

テストに使用するコードは、ターゲットクラスのコンパイルに使用されるJDKで利用可能な機能をテストする必要があります。たとえば、ターゲットがJava 1.5で記述されていることがわかっている場合、コードに generics が含まれている可能性があると想定するのが妥当です。私の経験では、無料で入手可能なデコンパイラは、1-2リリースでサポートする機能の点でJDKリリースに遅れをとる傾向があります。

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

5年後の編集:

[〜#〜] cfr [〜#〜]Procyon 、および Fernflower はこの分野で先導します。

25
Justin Garrick

Procyonには 独自の比較 があります。

10
Janus Troelsen

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

使いやすく、UIもきちんとしていてきれいです。

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

8
Anant

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

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

  1. 使用可能なすべての構成体を使用して、より複雑なコードを作成します。
  2. 実際のコードで試してみてください。
  3. 難読化された実際のコードで試してみてください。

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

6
Stephen C

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

6
Stiver

http://www.reversed-Java.com/fernflower/ 、github.com/vorburger/ScratchAppletで私の比較を参照

5
vorburger

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

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

  • 行番号を省略すると、JDは命令の元のフローを再構築できません。ループのタイプを確定できず、複数の割り当てを再生成できず、ソースコードを再配置するために使用されるアルゴリズムが機能しません。
  • ローカル変数データを省略すると、JDは変数の正確な範囲を特定できない場合があります。問題があります。
4
Emmanuel Dupuy

わかりました、これは私の携帯電話から書かれていますのでご容赦ください。

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

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

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

幸運を。

1
Buhake Sindi

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

私はJava Decompiler Freeを成功裏に使用しました。しかし、最近私は本番J2EEアプリケーションのかなりのコードを誤って削除しました。それに加えて、変数の初期化をまったく間違って処理するコードがありました。

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

0
GISNovis