在类文件中插入幻数



我有一个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编写类似的东西。

但是,">删除其幻数和类型"是什么意思?如果字节码以任何方式被破坏,则更改可能更难修复,如果不是不可能的话。

相关内容

  • 没有找到相关文章

最新更新