4

Java クラス ファイルを取得して逆アセンブルし、Java バイトコード出力を微調整してから、再度アセンブルしたいとします。

定数プール テーブルのシンボルの名前を変更する必要があります。また、ソースコードにアクセスすることもできず、逆コンパイラを使用するのはやり過ぎのようです。私は何かを最適化しようとしているわけではありません - Java はそれで素晴らしい仕事をします。

これを行う簡単な方法はありますか?分解または再組み立て用のツールをいくつか見つけましたが、両方用のツールはありません。または、バイトコードをテキストで表現するために同じ形式を使用しているように見えるツールのペアがありません。

4

5 に答える 5

6

ASM APIを確認しましたか?

クラスのバイトコードを変更する方法を説明するコード サンプル (公式ドキュメントから改作) を次に示します。

ClasssWriter cw = new ClassWriter();
ClassAdapter ca = new ClassAdapter(cw); // ca forwards all events to cw
// ca should modify the class data
ClassReader cr = new ClassReader("MyClass");
cr.accept(ca, 0);
byte[] b2 = cw.toByteArray(); // b2 represents the same class as MyClass, modified by ca

その後、将来の使用のために b2 を .class ファイルに保存できます。独自のクラスローダーを定義する場合は、メソッドClassLoader.defineClass(String,byte[],int,int)を使用してロードすることもできます。

于 2010-11-15T16:54:17.170 に答える
5

この質問は少し古くなっていますが、stackoverflow のどこにも答えが見つからないので、記録に残しておきます。

私が過去にうまく使用した標準的なジャスパー/ジャスミンのコンボがあります:

  • jasmin互換フォーマットへの分解用のjasper
  • ジャスパーの出力を再構築するジャスミン

ジャスパーの唯一の煩わしさは、スイッチのデフォルト句のラベルを作成するのを忘れていることです。ジャスミンは次のようなエラーを返します

Main.j:391: JAS エラー ラベル: LABEL0x48 がコードに追加されていません。

つまり、.j ファイルにアクセスして、手動で修正する必要があります。「javap -c」が役立つ場合があります。そのバグについては、ジャスパーとすぐにジャスミンを変更する前に、それが機能することを確認することをお勧めします。

このパッチをジャスパーに適用することで、実際にそのラベルのバグを修正できます。

--- Code_Collection.java.orig   1999-06-14 14:10:44.000000000 +0000
+++ Code_Collection.java        2011-02-05 07:23:21.000000000 +0000
@@ -1210,6 +1210,7 @@
     -----------------------------------------------------------------------*/
    void getLabel(Code_Collection code) {
       for (int i = 0; i < count; i++) code.setLabel(pc+branch[i]);
+      code.setLabel(pc+tableDefault);
    }

    /*-----------------------------------------------------------------------

作者に提出したのですが、何年も放置されているような気がしたので、統合されるかどうかはわかりません。

編集:上記のパッチが適用された Jasper は、 https://github.com/EugenDueck/Jasperで入手できるようになりました。

そして、この回答で説明されているように、 Eclipse Bytecode Outlineがあります: java bytecode editor?

于 2011-02-05T06:33:26.043 に答える
0

あなたは現代のコンパイラがすでに何をしているのかを説明しています。それに加えて、ほとんどのJVMは、アプリの実行中にバイトコードを最適化し続けることができます(そしてそうしようとします)。

既存のコンパイラ/JVMがバイトコードで何をしているのかを調べることから始めます。最良のケースは、JVMのオプティマイザーを改善できることです。これは可能ですが、確率は低く、どちらの方法でも車輪の再発明を行うことができます。最悪のケースは、変更が実際にランタイムオプティマイザーに干渉し、全体的なパフォーマンスが低下することです。

  1. コンパイラとJVMを研究する
  2. 基準
  3. 基準
  4. 基準

[編集]関連する投稿が見つかりました:バイトコード操作パターン

于 2010-11-15T17:43:55.573 に答える
0

元のソース コードを見つけて変更し、再コンパイルする方が簡単ではないでしょうか。それとも、ソースを持っていないバイナリ コードからのものですか?

プロのヒント: 組み込みの Java クラス ライブラリのソース コードは、OpenJDKプロジェクトの一部として、具体的にはOpenJDK 6 Sourceで入手できます。

于 2010-11-15T16:54:14.683 に答える