2017-10-01 15 views
0

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; 
} 
+0

あなたがやろうとしていると何が間違って起こっている正確に何を説明してもらえますか? – Antimony

+0

@Antimony私はMinecraft Forge(mod-loader)クラスを編集しようとしていますが、これはパラメータ名にUnicodeを使用する難読化されたクラスの例です。javassistがそれを読むことができるかどうかはわかりませんが、任意のctClass.toBytecode()を返すため。完全にゲームをクラッシュさせます。これは難読化されていない環境で完全にうまく動作します。私はobjectweb ASMに切り替える必要があるかどうかはわかりませんが、むしろそうしたいと思います。 編集:古いバージョンのゲームでは別の方法で難読化されているため、この問題は発生しません。 – cn198nc1

+0

バイトコードレベルで作業する場合、パラメータ変数の名前はまったく関係ありません。この点で、ASMはこのレベルでの操作のみを許可するため、このような名前で混乱することはありません。ですから、ソースレベルでInstrumentationを試しているのであれば、Javassistが唯一の選択肢です。しかし、ローカル変数名はJVMには意味を持たず、デバッグ属性のためにのみ使用可能であるため、Javassistはそれらをドロップすると強制的にそれに対処しなければなりません。 (arg1、arg2などのように)生成された名前を使用することで、名前の混乱を避けることができます。 – Holger

答えて

0

:ここでは、一例である。このクラスを編集しようとしていないが、ここに行きますJavascriptで動作するパラメータ名。特定のフラグを持つコンパイラを使用しない場合、コンパイルされたクラスの情報を最小限に抑えるために、それらの名前は常に削除されます。

hereにあるJavassistでは、コード内で関数のパラメータを扱うために使用できる特別な識別子があります。ここでは、これらの特別な識別子とその意味(公式ドキュメントからのリスト)の簡単なリストは、次のとおりです。

$0: represent this 
$1, $2, ...: actual parameters in order 
$args: An array of parameters. The type of $args is Object[]. 
$$: All actual parameters. For example, m($$) is equivalent to m($1,$2,...) 
$cflow(...): cflow variable 
$r: The result type. It is used in a cast expression. 
$w: The wrapper type. It is used in a cast expression. 
$_: The resulting value 
$sig: An array of java.lang.Class objects representing the formal parameter types. 
$type: A java.lang.Class object representing the formal result type. 
$class: A java.lang.Class object representing the class currently edited. 
+0

これは私が問題を解決するのを助けません。私が実際に変更しようとしたクラスについて上記のコメントを読んでください。私はその中で何も変えなかったが、ジャバシストが私に与えたバイトを返す。それは本当に問題ではありません。なぜなら私はいくつかのASMを学んだので、完璧にうまくいったからです。しかし他の人はこの問題の解決策を望んでいるかもしれません。 – cn198nc1