문제

나는 모든 클래스 파일의 마법 번호와 유형이 제거된 항아리를 가지고 있는데, 나는 이 특정 영역에 대해 잘 알지 못합니다.0XCAFEBABE에 다시 추가하고 유형을 각 클래스 파일에 다시 추가하고 항아리를 다시 포장하는 가장 좋은 방법은 무엇입니까?

편집하다:확인해 보니 매직 넘버만 누락되어 있고 수동으로 추가하면 파일이 그대로 유지됩니다.

도움이 되었습니까?

해결책

런타임 에이 작업을 수행하려면 자신의 클래스 로더를 만들 수 있습니다.나는 당신을 도중에 얻을 수있는 의사 코드를 첨부했습니다 :

public class MyClassLoader extends SecureClassLoader {

  @Override
  protected Class<?> findClass(String name) throws ClassNotFoundException {
     ...
     FileInputStream fis = new FileInputStream(brokenClassFile);
     BufferedInputStream bis = new BufferedInputStream(fis);
     ByteArrayOutputStream bas = new ByteArrayOutputStream((int) encryptedClassFile.length());
     byte[] wrongBytes = bas.toByteArray(); 
     byte[] goodbytes = ...     
     // add  a new byte[] and put in the appropiate missing bytes for the cafebabe and magic number
     CodeSource cs = new CodeSource(jarfile.toURI().toURL(), (CodeSigner[]) null);
     return super.defineClass(name, goodbytes, 0, bytes.length, cs);



  }

}
.

그러나 일부 OS 툴링을 사용하여 JAR 파일을 수정하는 것이 더 낫습니다.

다른 팁

매직 넘버를 클래스 파일에 다시 추가하려는 경우 간단한 쉘 스크립트를 사용할 수 있습니다(Linux를 사용하거나 Windows에 Cygwin을 사용한다고 가정).

먼저 헤더(CAFEBABE)의 4바이트만 사용하여 파일을 만듭니다.

그런 다음 jar의 클래스 파일을 일부 디렉터리로 추출하고 루트에서 다음 명령을 실행합니다.

find . -name "*.class" | while read file; do
    mv ${file} ${file}-old
    cat /path/to/file/with/header ${file}-old > $file
    rm ${file}-old
done

메모:위 스크립트는 bash에서 작동하지만 모든 셸이나 Windows에서도 비슷한 내용을 작성할 수 있습니다.

하지만 "그들의 매직 넘버와 유형이 제거되었습니다."?바이트코드가 어떤 식으로든 손상되면 변경 사항을 수정하는 것이 불가능하지는 않더라도 훨씬 더 어려울 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top