修改class字节码中的字符串常量
原理Java文件在编译为class文件后,字符串内容会存储在字节码的常量池部分,理论上若有需求,可以修改此部分的值达到修改程序运行结果的目的。
字符串常量的字节码结构如下图:
实验实验文件测试程序为标准的helloworld程序,这里只输出hello,后续操作补上world
12345class My{ public static void main(String[] args) { System.out.println("hello"); }}
修改过程若目的为将hello改为world,则仅需要下载一个vscode插件“Hex Editor”,该插件支持直接修改二进制数据,我们只需要找到常量池部分的hello内容将其修改为world即可。
但该插件只能修改已有字节,如果要更改文件的长度比如添加或删除内容,是不支持的,所以这里写了个Java程序,通过写字节数组到文件的方法,在其中插入内容。
1234567891011121314151617181920212223242526272829303 ...