問題タブ [jvm-bytecode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 現在のクラスを静的にスタックに追加する ASM LdcInsnNode を作成するにはどうすればよいですか?
他の人が作成したバイトコードを変更するためにASM ライブラリを使用しています。LdcInsnNode
任意のクラスの任意のメソッドについて、現在のクラスをスタックに追加するを作成したいと思います。
たとえば、 というクラスを変換するとしcom.example.ExampleClass
ます。に相当するバイトコードを作成したいと思いますSystem.out.println(ExampleClass.class.getName());
。
これは比較的単純な作業のようです。Eclipse Bytecode Outline プラグインを使用すると、次のバイトコードが同等であると表示されます。
次のコードを試しました:
これは の拡張機能で実行されているClassNode
ため、フィールドname
を参照してください。ClassNode.name
このInsnList
メソッドによって返された は、既存のAbstractInsnNode
usingの前に挿入されていInsnList.insertBefore(AbstractInsnNode, printClass())
ます。バイトコードがこのポイントに到達すると、次の理由でエラーが発生します。
これは明らかに、LDC 命令が"Lcom/example/ExampleClass;.class"
実際のクラスではなく文字列を追加しているためLcom/example/ExampleClass;.class
です。
これに対する回避策はありますか? クラスがまだ存在しないため、Class
オブジェクトを anに直接追加することは不可能のようです。しかし、オブジェクトLdcInsnNode
をロードする命令を追加する方法はありますか?Class
Object.getClass()
私の特定のケースでは、静的コンテキストから動作する必要があるため、メソッドを呼び出すことはオプションではありません。
android - Android バイトコード: 一部の変数の値が定義されていません
Android アプリケーションをリバースします。読んでいると、 や などの変数を使用するメソッドがいくつかp1
ありp2
ます。それらの変数をどこで参照できるかわかりません。例えば:
私が理解していないことは次のとおりです。
ここの変数がわかりませんp1
p2
p3
。教えてください。ありがとう
java - ASM の ClassWriter COMPUTE_FRAMES
ASM でジャンプをいじって、スタック マップ フレームが Java でどのように機能するかを理解しようとしています。いくつかのことを試すための簡単な方法を作成しました: (Krakatau で逆アセンブル):
StringBuilder
いくつかの文字列を変数と結合するための を作成するだけです。
L35 の invokespecial 呼び出しは、L10 の invokespecial 呼び出しとまったく同じスタックを持っているため、ICONST_1; IFEQ L10
ASM を使用して L35 の直前にシーケンスを追加することにしました。
分解してみると (再び Krakatau で)、結果が非常に奇妙であることがわかりました。ASM は、L10 のスタック フレームを次のように計算しました。
それ以外の
私が期待していたように。
さらに、 を呼び出すことができないため、このクラスも検証に合格しませStringBuilder#<init>
んTop
。ASMのマニュアルによるとTop
、初期化されていない値を参照していますが、ジャンプ位置と前のコードの両方から、コードで初期化されていないようです。ジャンプの何が問題なのかわかりません。
挿入したジャンプに何か問題があり、クラスがフレームを計算できなくなりますか? これはおそらく ASM の ClassWriter のバグですか?