2017-10-01 13 views
0

Javassist에 유니 코드가있는 클래스에 문제가 있는지 확실하지 않지만이 난독 화 클래스에는 메서드의 매개 변수에 대한 유니 코드가 있으며 바이트를 반환 할 때마다 중단되는지는 잘 모르겠습니다. 그것은 완벽하게 잘 작동 unobfuscated 환경에서 작동합니까? 다음 예는이 클래스를 수정하려고하지만, 여기 당신이 갈입니다 :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) 클래스를 편집하려고하는데 위의 코드는 유니 코드를 매개 변수 이름으로 사용하는 난독 화 클래스의 예입니다. 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

이것은 내가 문제를 해결하는 데 도움이되지 않습니다. 실제로 변경하려고 시도한 클래스에 대한 위의 내 의견을 읽으십시오. 나는 아무것도 변경하지 않았지만 javassist가 준 바이트를 반환합니다. 내가 ASM을 배웠고 완벽하게 잘 작동했기 때문에 그것은 정말로 중요하지 않습니다. 그러나 다른 사람들은이 문제에 대한 해결책을 원할 수 있습니다. – cn198nc1