0

すべてのクラス ファイルのマジック ナンバーとタイプが削除された jar がありますが、この特定の領域についてはあまり詳しくありません。0XCAFEBABE を追加し、型を各クラスファイルに戻し、jar を再パックする最善の方法は何でしょうか?

編集:確認しましたが、マジックナンバーのみが欠落しており、手動で追加してもファイルはそのままです。

4

2 に答える 2

0

マジック ナンバーをクラス ファイルに戻すだけの場合は、簡単なシェル スクリプトを使用できます (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 に対しても同様のスクリプトを作成できるはずです。

しかし、「マジック ナンバーとタイプを削除する」とはどういう意味ですか? バイトコードがなんらかの形で破損している場合、その変更を修正することは、不可能ではないにしても、はるかに困難になる可能性があります。

于 2012-05-19T14:21:55.163 に答える
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ファイルを修正する方が良いと思います。

于 2012-05-19T14:13:22.913 に答える