gpt4 book ai didi

java - 直接编辑 .class 文件,使用操作码

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:07 24 4
gpt4 key购买 nike

今天我只是试着在编译的 Java 类文件中尝试一下操作码。插入后

iinc 1,1

Java 虚拟机响应:

Exception in thread "main" java.lang.ClassFormatError: Truncated class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: Test. Program will exit.

这是我的示例源代码:

public class Test {

public static void main(String[] args) {
int i = 5;
i++;
i++;
i++;
System.out.println("Number: " + i + "\n");
}
}

增量的操作码是 0x84 + 2 个字节的操作数。结果类文件中只有一个部分,其中包含 0x84:

[..] 8401 0184 0101 8401 01[..]

所以我会把它翻译成:

iinc 1,1
iinc 1,1
iinc 1,1

对应我的i++;我++;我++;

然后我尝试仅附加 840101 以再次递增变量,但这没有用并导致了 ClassFormatError。

是否有类文件的校验和之类的东西?我在 http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html 中查找了类文件的格式但找不到任何指向某种 bytes_of_classfile 之类的东西。我也不明白为什么错误是“Truncated Class File”,因为我确实附加了一些东西:-)

我知道直接编辑类文件不是个好主意,但我只对这里的 VM 内部结构感兴趣。

最佳答案

(免责声明:我没有反汇编您的示例。)

如果您查看类格式的结构,您会看到 method_info 包含在其属性 Code_attributes (4.7.3) 中,它依次指定其他 code_length

由于您的编辑,您首先违反了声明的长度,其次当然是您修改的方法之后的任何后续数据现在将处于不同的偏移量。

关于java - 直接编辑 .class 文件,使用操作码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com