JavassistにUnicodeを持つクラスにいくつかの問題があるかどうか分かりませんが、この難読化されたクラスにはメソッドのパラメータとしてUnicodeがあります。バイトを返そうとするたびに破損するかどうかはわかりません。それは完全にうまく動作します。ザ・が持つ任意の問題になることはありません。ここJavaassistのバイトコードの制限?
public class aaa extends yo
{
private final ahs b;
public aaa(final ahs \u2603) {
super(\u2603);
this.b = \u2603;
this.d(0);
this.a(true);
}
@Override
public int a(final int \u2603) {
return \u2603 | 0x4;
}
@Override
public int a(final zx \u2603, final int \u2603) {
return this.b.h(this.b.a(\u2603.i()));
}
@Override
public String e_(final zx \u2603) {
return super.a() + "." + this.b.b(\u2603.i()).d();
}
}
は、私は(何も)変換しないようにやっているものです
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
if (name.equals("ave") || name.equals("net.minecraft.client.Minecraft")) { // Minecraft.class // net.minecraft.client.Minecraft
try {
System.out.println(String.format("oh no its doing it -> %s", name));
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.getCtClass(name);
return ctClass.toBytecode();
} catch (Exception e) {
e.printStackTrace();
}
}
return basicClass;
}
あなたがやろうとしていると何が間違って起こっている正確に何を説明してもらえますか? – Antimony
@Antimony私はMinecraft Forge(mod-loader)クラスを編集しようとしていますが、これはパラメータ名にUnicodeを使用する難読化されたクラスの例です。javassistがそれを読むことができるかどうかはわかりませんが、任意のctClass.toBytecode()を返すため。完全にゲームをクラッシュさせます。これは難読化されていない環境で完全にうまく動作します。私はobjectweb ASMに切り替える必要があるかどうかはわかりませんが、むしろそうしたいと思います。 編集:古いバージョンのゲームでは別の方法で難読化されているため、この問題は発生しません。 – cn198nc1
バイトコードレベルで作業する場合、パラメータ変数の名前はまったく関係ありません。この点で、ASMはこのレベルでの操作のみを許可するため、このような名前で混乱することはありません。ですから、ソースレベルでInstrumentationを試しているのであれば、Javassistが唯一の選択肢です。しかし、ローカル変数名はJVMには意味を持たず、デバッグ属性のためにのみ使用可能であるため、Javassistはそれらをドロップすると強制的にそれに対処しなければなりません。 (arg1、arg2などのように)生成された名前を使用することで、名前の混乱を避けることができます。 – Holger