すべてのクラス ファイルのマジック ナンバーとタイプが削除された jar がありますが、この特定の領域についてはあまり詳しくありません。0XCAFEBABE を追加し、型を各クラスファイルに戻し、jar を再パックする最善の方法は何でしょうか?
編集:確認しましたが、マジックナンバーのみが欠落しており、手動で追加してもファイルはそのままです。
すべてのクラス ファイルのマジック ナンバーとタイプが削除された jar がありますが、この特定の領域についてはあまり詳しくありません。0XCAFEBABE を追加し、型を各クラスファイルに戻し、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 に対しても同様のスクリプトを作成できるはずです。
しかし、「マジック ナンバーとタイプを削除する」とはどういう意味ですか? バイトコードがなんらかの形で破損している場合、その変更を修正することは、不可能ではないにしても、はるかに困難になる可能性があります。
実行時にこれを行いたい場合は、独自のクラスローダーを作成できます。途中であなたを得るかもしれないいくつかの疑似コードを添付しました:
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ファイルを修正する方が良いと思います。