2014-11-24 4 views
1

그렇기 때문에 런타임 중에 jvm이로드 한 모든로드 된 클래스의 클래스 바이트를 가져 오는 중이다. 로드하려고하는 프로그램이 클래스 파일을 암호화하고 자체 클래스 로더로로드하기 때문에 Instrumentation은이 경우 작동하지 않습니다. https://gist.github.com/MalikDz/944cae9c168fa05fbd0a 여기클래스 로더를 오버라이드하여 모든로드 된 클래스 바이트와 이름을 얻는다.

출력 (오류) : https://gist.github.com/MalikDz/fdf20df16b951d41cb78

덕분에 많은

여기 내 시도입니다!

+0

사람이 아이디어가? –

+0

'ClassLoader'가 에이전트가 명령 행에 지정되었을 때 작동을 거부한다면, 나중에 에이전트를 붙이기 만하면됩니다. 'ClassLoader'는'Instrumentation'을 좋아하는지 여부를 묻지 않으므로 그것을 막을 수 없습니다. – Holger

답변

1

당신이 트릭을 수행하는 자바 에이전트를 사용할 수 있습니다

에이전트는 매우 간단합니다 :

import java.lang.instrument.Instrumentation; 
import java.lang.instrument.ClassFileTransformer; 

public class ClassDumpAgent 
{ 
    /** 
    * This method is called before the application’s main-method is called, when 
    * this agent is specified to the Java VM. 
    **/ 
    public static void premain(String agentArgs, Instrumentation inst) 
    { 
     ClassFileTransformer trans = new ClassDumpTransformer(); 
     inst.addTransformer(trans); 
    } 
} 

ClassFileTransformer를 : 그것은 바이트 코드에 접근 할 수있는 수준의 변압기를, 등록 즉 단순히 사용되는 파일 시스템에 대한 바이트 코드로 바이트 배열 덤프된다

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.lang.instrument.ClassFileTransformer; 
import java.lang.instrument.IllegalClassFormatException; 
import java.security.ProtectionDomain; 

public class ClassDumpTransformer implements ClassFileTransformer 
{ 
    private File rootFolder = new File("C:\\temp\\dump"); 

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, 
          ProtectionDomain protectionDomain, byte[] classfileBuffer) 
      throws IllegalClassFormatException 
    { 
     File dumpFile = new File(rootFolder,className+".class"); 
     dumpFile.getParentFile().mkdirs(); 
     try { 
      FileOutputStream out = new FileOutputStream(dumpFile); 
      try { 
       out.write(classfileBuffer); 
      } finally { 
       out.close(); 
      } 
     } catch (IOException e) { 
      throw new IllegalClassFormatException(e.getMessage()); 
     } 
     return classfileBuffer; 
    } 
} 

이 클래스 덤핑 에이전트 패키지를, 당신은 두 개의 클래스를 JAR 필요가 있고 포함 이 에이전트에 대한 MANIFEST.MF : 솔루션에 대한

java -javaagent:cldumpagent.jar MyApplication 

일부 발언 :

  1. 이 같은 명령 줄을 사용하여이 에이전트로 응용 프로그램을 실행하려면 클래스는 하드 코딩 된 폴더 (C : \ TEMP \ DUMP)에 덤프됩니다. 은이를 변경하려고 할 수 있습니다.

  2. 변압기는 모두 클래스 (JDK 런타임 포함)를 덤프합니다. 덤프되는 패키지를 필터링 할 수 있습니다.
  3. 리버스 엔지니어링에주의하십시오. 일부 국가에서는 이것이 불법으로 간주 될 수 있습니다.

베리

+0

무례하게하려고하지는 않지만 나는 계측이 여기서 작동하지 않는다는 것을 상기했다. 또한 이미이 작업을 수행합니다. https://gist.github.com/MalikDz/18e410aa4e30a3379603. 하지만 시도해 주셔서 감사합니다 tho <3 –

+0

해독을 수행하는 ClassLoader를 디 컴파일하려고 했습니까? 아마도 클래스를 디 컴파일하여 일반 텍스트 바이트 코드를 덤프하는 메소드를 추가 할 수 있습니까? – blagerweij

+0

'여기서 작동하지 않습니다'라고 말하면 에이전트를 사용할 수 없거나 ClassFileTransformer가 암호화 된 바이트를 계속 수신한다는 의미입니까? – blagerweij

관련 문제