将幻数插入类文件中

时间:2012-05-19 14:01:11

标签: java .class-file magic-numbers

我有一个jar,其中所有类文件都删除了它们的幻数和类型,我对这个特定区域不是很了解。将0XCAFEBABE和类型添加回每个类文件并重新打包jar的最佳方法是什么?

编辑:我已经检查过,只有幻数丢失,如果我手动添加文件,文件就完好无损。

2 个答案:

答案 0 :(得分: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);



  }

}

但我想最好只使用一些操作系统工具修复jar文件。

答案 1 :(得分:0)

如果您只想将幻数添加回类文件,可以使用简单的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。

但你的意思是“将他们的幻数和类型删除”是什么意思?如果字节码以任何方式被破坏,那么如果不是不可能的话,修改可能要困难得多。