Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java反汇编和重新组装_Java_Bytecode Manipulation - Fatal编程技术网

java反汇编和重新组装

java反汇编和重新组装,java,bytecode-manipulation,Java,Bytecode Manipulation,假设我想获取一个java类文件,将其分解,调整java字节码输出,然后重新组装 我需要重命名常量池表中的符号。我也没有访问源代码的权限,因此使用反编译器似乎有点过头了。我不想优化任何东西——java在这方面做得很好 有没有。。。一个简单的方法来做到这一点? 我已经找到了几种拆卸或重新组装的工具,但没有一种同时适用于这两种工具;或者没有一对工具似乎使用相同的格式来表示文本中的字节码。找到原始源代码,修改它,然后重新编译不是更容易吗?或者这是来自一些你没有来源的二进制代码 专业提示:内置Java类库

假设我想获取一个java类文件,将其分解,调整java字节码输出,然后重新组装

我需要重命名常量池表中的符号。我也没有访问源代码的权限,因此使用反编译器似乎有点过头了。我不想优化任何东西——java在这方面做得很好

有没有。。。一个简单的方法来做到这一点?
我已经找到了几种拆卸或重新组装的工具,但没有一种同时适用于这两种工具;或者没有一对工具似乎使用相同的格式来表示文本中的字节码。

找到原始源代码,修改它,然后重新编译不是更容易吗?或者这是来自一些你没有来源的二进制代码

专业提示:内置Java类库的源代码作为项目的一部分提供,特别是在中。

您是否检查了API

下面是一个代码示例(改编自官方文档),解释如何修改类字节码:

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)
来加载它。

您描述的是现代编译器已经在做什么。除此之外,大多数JVM可以(并尝试)在应用程序运行时继续优化字节码

从研究现有编译器/JVM对字节码的作用开始。最好的情况是,您可以改进JVM的优化器,这是可能的,但概率很低,而且无论哪种方式,您都可能是在重新发明轮子。最糟糕的情况是,您的更改实际上会干扰运行时优化器,并导致总体性能下降

  • 研究编译器和JVM
  • 基准
  • 基准
  • 基准

  • [编辑]找到了一篇相关文章:

    这个问题现在有点老了,但由于我在stackoverflow的任何地方都找不到答案,让我记录下来:

    有一个标准的jasper/jasmin组合,我过去曾成功使用过:

    • 用于反汇编为jasmin兼容的格式
    • 这将重新组装jasper的输出
    jasper唯一的麻烦是它忘了为switch default子句创建一个标签,然后jasmin会给您以下错误

    Main.j:391:JAS错误标签:LABEL0x48尚未添加到代码中

    这意味着您必须进入.j文件并手动修复它。“javap-c”可能在这方面对您有所帮助。对于这个bug,我建议您使用jasper,并立即使用jasmin,在进行任何修改之前,确保它能够正常工作

    通过将此修补程序应用于jasper,您实际上可以修复标签错误:

    --- Code_Collection.java.orig   1999-06-14 14:10:44.000000000 +0000
    +++ Code_Collection.java        2011-02-05 07:23:21.000000000 +0000
    @@ -1210,6 +1210,7 @@
         -----------------------------------------------------------------------*/
        void getLabel(Code_Collection code) {
           for (int i = 0; i < count; i++) code.setLabel(pc+branch[i]);
    +      code.setLabel(pc+tableDefault);
        }
    
        /*-----------------------------------------------------------------------
    
    我把它提交给了作者,但我感觉这个项目已经很多年没有工作了,所以我不知道它是否会被合并

    编辑:已应用上述修补程序的Jasper现在可在

    然后是Eclipse字节码大纲,如下面的回答所述:

    提供了一个开源的反汇编程序和汇编程序,使之非常简单。喀拉喀托旨在取代茉莉花。它使用类似于Jasmin的语法实现向后兼容性,但扩展了该格式以支持类文件格式中的所有模糊特性,并修复了Jasmin中的bug。它还允许您轻松地分解、修改和重新组装类


    喀拉喀托唯一真正的缺点是它目前没有很好的记录。但如果你有任何问题,请随时提问。(披露:我写了喀拉喀托)。

    从现在起,我将为我的错误修复做些什么,修改源代码!:)我同意。。。但你猜对了:我没有访问源代码的权限。如果你添加一些示例代码、教程链接或只是一两句描述性的句子,我会+1这个答案。从概念上看,这看起来很有希望。虽然文档非常密集。。。让我困惑的是:这是一个工具吗?它是图书馆吗?我看不出一个直接的使用方法。。。你能解释一下吗?你对我所做的假设是错误的:我需要重命名常量池表中的一个符号。我也没有访问源代码的权限,因此使用反编译器似乎有点过头了(而且可能不太合法)。我不想优化任何东西-java在这方面做得很好。从实用的角度来看,这个工具几乎完成了我需要做的事情:-但它不做任何拆卸/重新组装的工作。哦,好吧。@Lunpa,你说得对,我突然得出结论,你为什么要修改字节码。您是否尝试过手动调整.class文件?您所描述的内容听起来像人们在Unix机器上使用“sed”的内容。如果搜索/替换足够直截了当,并且重命名符号(如对齐)没有问题,那么这可能会起作用。@Lunpa,如果您只是在进行符号重命名,则链接中的类编辑器可能就是您所需的全部。对于那些不清楚或不确定如何使用上述修补程序的人,请打开Code_Collection.java,转到第1210行(记事本中的ctrl+g),在getLabel方法中添加第二行:code.setLabel(pc+tableDefault);然后重新编译(需要正确安装JDK和Paths设置):javac*.java然后将jasper.jar重命名为jasper.zip在zip中有一个jasper文件夹,打开它,在该文件夹中,将Code_tableswitch.class替换为刚刚在编译步骤中创建的Code_tableswitch.class。从那里,将.zip重命名回.jar,您就可以开始了。不幸的是,Jasmin对更晦涩或不寻常的cl没有很好的支持就个人而言,我建议使用Krakatau,尽管Jasmin对于普通类来说可能已经足够好了。第1013行之后缺少一行类似的内容。Add code.setLabel(pc+lookupDefault)