我有一个 jar,其中所有类文件都删除了它们的幻数和类型,我对这个特定领域不是很了解。将 0XCAFEBABE 和类型重新添加回每个类文件并重新打包 jar 的最佳方法是什么?
编辑:我检查过,只有幻数丢失,如果我手动添加文件是完整的。
我有一个 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);
}
}
但我想最好使用一些操作系统工具来修复 jar 文件。
如果您只想将幻数添加回类文件,您可以为此使用一个简单的 shell 脚本(假设您在 Linux 上,或者在 Windows 上拥有 Cygwin)。
首先创建一个只有 4 个字节头的文件 (CAFEBABE)。
然后,将 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 中运行,但是您应该能够为任何 shell 甚至 Windows 编写类似的东西。
但是“删除他们的幻数和类型”是什么意思?如果字节码以任何方式被破坏,即使不是不可能,更改也可能更难以修复。