2012-05-19 7 views
0

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

편집 : 마법 번호 만 누락되었습니다. 수동으로 추가하면 파일이 손상되지 않습니다.

+1

왜 자바 소스 코드를 보지 않겠습니까? (나는 이것에 대한 답을 알고 있다고 느낀다.) –

+0

@HovercraftFullOfEels : 나는 OP가 이것에 대해 물어볼 것이라고 생각한다 : http://en.wikipedia.org/wiki/Java_class_file#Magic_Number. 이것은 소스 코드와 관련이 없다. –

+2

매직 번호는 어떻게 제거 되었습니까? 저것은 일어나는 아주 이상한 것 같이 보이고, 나는 더 이상 손상이다는 것을 생각해 본다. –

답변

0

런타임에이 작업을 원할 경우 고유 한 클래스 로더를 만들 수 있습니다. 나는 길에 당신을 얻을 수있는 몇 가지 의사 코드 첨부 :

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 파일을 수정하는 것이 좋습니다 같아요.

0

마법 파일 번호를 다시 클래스 파일에 추가하려면 간단한 쉘 스크립트를 사용하면됩니다 (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 용.

하지만 "마법 번호를 가지고 유형을 삭제했을 때"을 어떻게 의미합니까? 어떤 식 으로든 바이트 코드가 엉망이라면 불가능하지는 않더라도 수정하는 것이 훨씬 더 어려울 수 있습니다.