假设我想获取一个java类文件,反汇编它,调整java字节码输出,然后重新组装它。
我需要重命名常量池表中的一个符号。我也不能访问源代码,而且使用反编译器似乎对此有点杀伤力。我并没有试图优化任何东西- java在这方面做得很好。
有没有..。一种简单的方法来做到这一点?我已经找到了几个用于反汇编或重新汇编的工具,但没有一个同时用于这两个工具;或者没有一对工具似乎使用相同的格式在文本中表示字节码。
发布于 2010-11-16 00:54:17
你检查过ASM应用程序接口了吗?
下面是一个代码示例(改编自官方文档),解释了如何修改类字节码:
ClasssWriter cw = new ClassWriter();
ClassAdapter ca = new ClassAdapter(cw); // ca forwards all events to cw
// ca should modify the class data
ClassReader cr = new ClassReader("MyClass");
cr.accept(ca, 0);
byte[] b2 = cw.toByteArray(); // b2 represents the same class as MyClass, modified by ca然后,可以将b2存储在.class文件中以供将来使用。如果您定义了自己的类加载器,也可以使用方法ClassLoader.defineClass(String,byte[],int,int)来加载它。
发布于 2013-07-02 22:49:40
Krakatau提供了一个开放源码的反汇编程序和汇编程序,使这项工作变得非常容易。Krakatau被设计成Jasmin的替代品。它使用了类似Jasmin的语法来实现向后兼容性,但扩展了该格式以支持类文件格式中的所有模糊功能,并修复了Jasmin中的but。它还允许您轻松地反汇编、修改和重新组装类。
Krakatau唯一真正的缺点是它目前没有很好的文档记录。但如果您有任何问题,请随时提出。(披露:我写了Krakatau)。
发布于 2010-11-16 00:54:15
找到原始源代码,修改它,然后重新编译它不是更容易吗?或者这是来自一些你没有源代码的二进制代码?
专业技巧:内置Java Class Library的源代码作为OpenJDK项目的一部分提供,特别是在OpenJDK 6 Source中。
https://stackoverflow.com/questions/4186726
复制相似问题