Javaアプリケーションの逆コンパイル

デコンパイル-デコンパイラを使用してソースコードを再構築するプロセス
私は最近、どの逆コンパイラが優れているのだろうと思いました。

Googleの拷問を開始し、実験しました。 最後に、私は素晴らしい解決策を見つけました。 プログラムを逆コンパイルして動作する「ソース」を取得する方法は? 件名でそれについて。



一般的な逆コンパイラの概要



モカ


Mocha(Hanpeter van Vlietによって書かれた)は、おそらく最初にリリースされたJavaデコンパイラの1つです。 コンソールユーザーインターフェイスを提供します。 リリースは、Java Development Kitバージョン1.1が登場する前の1996年に行われました。



JAvaデコンパイラ


JAva Decompiler、JAD(著者-Pavel Kouznetsov)-明らかに、最も

人気のあるJavaデコンパイラ。 Mochaのように、このデコンパイラーは、長い間更新およびサポートされていないコンソールインターフェイスを提供しますが、Eclipse開発環境用のJadClipseプラグインを含む、それを操作するための多数のグラフィカルツールは、少人数クラス。

逆コンパイルに加えて、JAva Decompilerには.classファイルを逆アセンブルする機能があります。



DJ Javaデコンパイラー


DJ Javaデコンパイラ(著者-Atanas Neshkov)-長い間、名前に反して、以前のデコンパイラのグラフィカルシェルでしかなかったため、JADを呼び出すコマンドライン引数を簡単かつ便利に選択できました。 現在のバージョンでは注釈のサポートが追加されていますが、逆コンパイラはシェアウェアになっています(10回の試用後に購入する必要があります)。



Jdコア


JD-Core(著者-Emmanuel Dupuy)は、Javaバイトコードを逆コンパイルおよび分析するための非常に強力で機能的なライブラリで、Java Decompilerプロジェクトの一部として開発されました。

次の機能があります。

おそらく、JD-Coreの欠点は、JD-Coreが次のように配布されているという事実のみに起因する可能性があります。

C ++で開発され、静的にリンクされたスタンドアロンJD-GUIグラフィカルアプリケーションの一部、またはEclipse開発環境用のJD-Eclipseプラグイン。これにより、特にJava言語で開発されたサードパーティの非商用プロジェクトでの使用が事実上不可能になります。 商用ソフトウェア製品でのライブラリの使用は、著者によって禁止されています。



シダの花


Fernflowerは、これまでで最高のJava逆コンパイル言語コンパイラの1つです。

次の機能があります。

1.さまざまな言語構成をサポートします。

2.いくつかの既知のコンパイラのバグのために生成されたバイトコードを正しく逆コンパイルします



私の選択



  1. JD-GUI



    表示用、これ以上
  2. Fernflower



    完全な回復


私は二番目について説明します。 一般に、この逆コンパイラの作成者は、オフライン版を一般にアップロードするようには見えませんでした(または、ブログを読んでいるときにこの事実を見逃していました)。 しかし、あるフォーラムで彼女を見つけたのは嬉しい驚きでした!



ダウンロード: fernflower.jar



著者のブログから引用:

ファーンフラワーは難読化を防止するために進化します

...

Fernflowerには現在、特別な難読化解除機能は含まれていません。これらは将来、個別のモジュールによって接続されます
なぜなら 不明な理由でオンラインバージョンが機能せず、オフラインについては何も言うのは難しい(逆コンパイルの品質が優れていることを除く)、現時点ではモジュールはありません。

名前変更モジュールがまだ十分ではありません
はい、そうです。 インターネットでこのようなものを探しましょう。

プロガードは救助に来るが、珍しい
ProGuardDeobfuscatorは、ProGuardプログラムを少し修正したもので、準難読化解除ツールになります。 処理中、パッケージ、クラス、フィールド、およびメソッドの難読化された短い名前は、Jarファイル内のより意味のある一意の名前に置き換えられます。
ソースと難読化解除ツール自体をダウンロードします: projectd8.org/Programs/Java/PGD



すべてのツールがありますが、個人的には、お気に入りのNetbeans IDEを使用して、並べ替えの再作成を容易にします。これは、特に多くのクラスがある場合に、私のヒントに役立ちます。

ご清聴ありがとうございました!



参照資料


se.math.spbu.ru/SE/YearlyProjects/2011/YearlyProjects/2011/345/345_Mikhailov_report.pdf

ru-java.livejournal.com



UPD:

申し訳ありませんが、Fernflowerのオフラインバージョンには、名前を変更するためのモジュールと他の多くの部分があります-Readme



All Articles