모든 클래스 파일의 마법 번호와 유형이 제거 된 병이 있습니다.이 특정 영역에 대해 잘 알고 있지 않습니다. 0XCAFEBABE에서 다시 추가하고 각 클래스 파일에 다시 입력하고 항아리를 다시 포장하는 가장 좋은 방법은 무엇입니까?클래스 파일에 마법 번호 삽입하기
편집 : 마법 번호 만 누락되었습니다. 수동으로 추가하면 파일이 손상되지 않습니다.
모든 클래스 파일의 마법 번호와 유형이 제거 된 병이 있습니다.이 특정 영역에 대해 잘 알고 있지 않습니다. 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 바이트만으로 파일을 만듭니다.
그리고, 어떤 디렉토리에 항아리에서 클래스 파일을 추출하고 루트에이 명령을 실행
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 용.
하지만 "마법 번호를 가지고 유형을 삭제했을 때"을 어떻게 의미합니까? 어떤 식 으로든 바이트 코드가 엉망이라면 불가능하지는 않더라도 수정하는 것이 훨씬 더 어려울 수 있습니다.
왜 자바 소스 코드를 보지 않겠습니까? (나는 이것에 대한 답을 알고 있다고 느낀다.) –
@HovercraftFullOfEels : 나는 OP가 이것에 대해 물어볼 것이라고 생각한다 : http://en.wikipedia.org/wiki/Java_class_file#Magic_Number. 이것은 소스 코드와 관련이 없다. –
매직 번호는 어떻게 제거 되었습니까? 저것은 일어나는 아주 이상한 것 같이 보이고, 나는 더 이상 손상이다는 것을 생각해 본다. –