2011-08-04 3 views
1

사용자 정의 클래스 로더에 의해로드 된 Java 클래스를 리버스 엔지니어링하려고합니다.자바 클래스 객체를 클래스 파일로 직렬화 할 수 있습니까?

바이너리 콘텐츠를 저장하려고했지만 나중에 디 컴파일하려고했지만 디 컴파일러가 일반적인 자바 클래스가 아닌 것으로 불평했다. 클래스가 동적으로로드되었다는 것을 알았다.

이제 런타임에 클래스 개체가 있습니다. Sun Java 클래스와 같은 규약에 따르는 클래스 파일로 직렬화 할 수 있습니까?

추가 : 또는 Java 클래스 개체에서 사용할 수있는 디 컴파일러 API를 사용할 수 있습니까?

+0

디 컴파일러 API는 없지만 바이트 코드를 가져올 수 있습니다. 클래스 객체를 가지고 있다면 JVM 바이트 코드에 의해 처리되고, 바이트 코드 자체는 '일반적으로'사용할 수 없다. – bestsss

+0

질문에 대한 오해가있을 수 있지만 수업의 "바이너리 내용"이있는 경우 저급 [Solum] (https://github.com/TkTech/Solum) 라이브러리가 도움을 줄 수 있습니다. 높은 수준의 디 컴파일러가 실패합니다. 'solum.bytecode.Disassembler'를 사용해, 유효한 클래스를 가지지 않고 바이트 코드를 직접 디 컴파일 할 수 있습니다. – TkTech

답변

0

Ehhhh. 디 컴파일러가 왜 불평을하는 것입니까? 일부 코드는 단순히 디 컴파일 할 수 없습니다. 예를 들어, 바이트 코드가 푸시되었지만 팝하지 않는 경우에는 자바 코드가 없습니다.

바이트 코드를 시도하고 검사하십시오. javap을 이용한 빠른 엿보기는 이미 드러난 것 같습니다.

+1

1. 어떤 이유에서 이진 편집기를 사용하여 수동으로 편집 된 클래스 파일을 제공한다고 가정하지만로드 할 클래스 로더를 제공하십시오. 이제 일반 클래스의 모든 디 컴파일러가 실패합니다. 2. 원래의 클래스 파일을 만들 수 있다면 바이트 코드에 대해 걱정할 필요가 없습니다. –

+0

아, 알았어요. 그렇다면 객체 인스턴스를 잊어 버리십시오. 당신이 원하는 것은 반성입니다. 클래스 로더를 무시하고 클래스의 바이트 코드 표현을 반영하려고합니다. – nes1983

2

사례를 둘러싼 가장 쉬운 방법 (imo)은 java.lang.ClassLoader을 직접 해킹하여로드 된 클래스 모양을 추적하여 protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)을 찾은 다음 사용자 버전과 후크로 바꾸십시오. java.lang.ClassLoader의 자체 버전을 컴파일 할 때 java - -Xbootclasspath/p

일부 계측을 설치하면 유사한 효과가 발생할 수 있습니다.

해피 해킹!

+0

클래스가 ClassLoader에서 방출되기 전에 런타임에 인스트루먼트 된 경우에도 여기에 결과가 표시됩니다. 유용 할 수 있습니다. –

+0

거의 예. 실제 바이트 코드가 "JVM stuff"에 들어갑니다. – bestsss

관련 문제