3

JVM クラス ファイルとテキスト表現の間を往復するフェイル セーフな方法を探しています。

厳密な要件の 1 つは、テキスト表現が変更されていない限り、結果として得られるラウンドトリップ JVM クラス ファイルが元の JVM クラス ファイルと機能的に完全に同等であることです。

さらに、テキスト表現は人間が判読可能で編集可能でなければなりません。テキスト表現に小さな変更 (テキスト文字列やクラス名の変更など) を加えて、結果のクラス ファイル表現に反映できるようにする必要があります。

最も簡単な解決策は、JAD などの Java デコンパイラを使用してテキスト表現を生成することです。この場合、テキスト表現は単純に再作成された Java ソース コードになります。次に、javac を使用してバイトコードを生成します。ただし、無料の Java 逆コンパイラの現状を考えると、このアプローチはすべての状況で機能するとは限りません。クラスファイル/Java ソース/クラスファイルの完全なラウンドトリップに耐えられない難読化されたバイトコードを作成するのはかなり簡単です (一部には、JVM バイトコードとJava ソースコード)。

上記の要件を考慮して、JVM クラスファイル/テキスト表現/クラスファイルのラウンドトリップを実現するフェイルセーフな方法はありますか?

更新:回答する前に - 上記のすべての要件を読んで時間と労力を節約し、具体的には次の点に注意してください。

  • 「JVM バイトコードのテキスト表現」は、必ずしも「Java ソースコード」を意味するわけではありません。
4

5 に答える 5

6

BCELプロジェクトは、クラス ファイルを jasmin アセンブリに変換する JasminVisitor を提供ます。

これを変更して、クラス ファイルに再アセンブルできます。編集が行われず、バージョンの互換性が保たれている場合、行番号のマッピングが失われる可能性があることを除いて、ラウンド トリップによって同一のクラス ファイルが生成されるはずです。往復のケースで少しずつ同一のコピーが必要な場合は、ツールを変更して、純粋なメタデータでもあるコードの側面を取得する必要があります。

jasmin はかなり古く、実際に本格的なプログラムをアセンブリで簡単に記述できるようには設計されていませんが、文字列定数テーブルと定数を変更するには十分すぎるはずです。

于 2009-09-22T23:38:58.403 に答える
2

ジャスミンとキメラ?

于 2009-09-20T13:58:21.093 に答える
1

ASMがこれを行うように見えます。(これはShuggyCoUkと同じ種類の答えですが、ツールが異なります。)Jarjar、まさにあなたが話している種類のことのためにASMを使用していると言います。

于 2011-09-16T15:32:01.683 に答える
1

まさにこのために設計されたツールを作成しました。

Krakatauの逆アセンブラとアセンブラは、どんなに奇妙なものであっても、有効なクラスファイルを処理するように設計されています。Jasmin 形式に基づくアセンブリ形式を使用しますが、Jasmin が処理できないすべてのクラスファイル機能をサポートするように拡張されています。45.3コード属性フィールドの幅を狭くする事前クラスファイルなど、Hotspot のあいまいな、または文書化されていない「機能」の一部もサポートしています。

私が知っているクラスファイルを往復できます。結果はバイナリ的には同じではありませんが、機能は同じになります (たとえば、定数プール エントリが再配置される場合があります)。

更新: Krakatau は、クラスファイルの正確なバイナリ ラウンドトリップをサポートするようになりました。フラグを渡すと、-roundtrip定数プール エントリなどの順序が保持されます。

于 2013-03-02T20:32:50.293 に答える
-2

いいえ。対応する Java プログラムのない有効なバイトコードが存在します。

Soot プロジェクトには、非常に洗練された逆コンパイラ( http://www.sable.mcgill.ca/dava/ ) があります。これは、Java コンパイラからのバイト コードに役立つ可能性があります。ただし、完全ではありません。

最善の策は、クラス ファイルのソース コードを取得することです。

于 2009-09-20T19:57:16.577 に答える