マジックナンバーをクラスファイルに挿入する
-
11-12-2019 - |
質問
私はすべてのクラスファイルにマジックナンバーとタイプが削除されているjarがあります。0xCafebabeに戻すこととタイプを各クラスファイルに戻してJARを再梱包することについての最善の方法がありますか?
編集:私はチェックしました、マジックナンバーだけが見つからないだけで、手動で追加した場合はそのファイルはそのままです。
解決
実行時にこれをやりたい場合は、独自のクラスローダーを作成できます。途中であなたを得るかもしれない疑似コードを取り付けました:
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