클래스 파일에 매직 넘버 삽입하기
-
11-12-2019 - |
문제
나는 모든 클래스 파일의 마법 번호와 유형이 제거된 항아리를 가지고 있는데, 나는 이 특정 영역에 대해 잘 알지 못합니다.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에서도 비슷한 내용을 작성할 수 있습니다.
하지만 "그들의 매직 넘버와 유형이 제거되었습니다."?바이트코드가 어떤 식으로든 손상되면 변경 사항을 수정하는 것이 불가능하지는 않더라도 훨씬 더 어려울 수 있습니다.
제휴하지 않습니다 StackOverflow