标签:des style blog http java color
先贴出示例中的代码:
public class Test{ public static void main(String[] args){ System.out.println("123"); System.out.println("345"); } public void m1(){ System.out.println("m1"); } public void m2(){ System.out.println("m2"); } }
Test2中先后调用了Test的m1,m2方法,此处通过修改字节码删除对m1方法的调用。
public class Test2{ public static void main(String[] args){ System.out.println("test2"); Test t1 = new Test(); t1.m1(); t1.m2(); } }
1、找到相对应的方法调用的字节码指令,通过JclassLib或者在命令行通过javap -verbose Test2.class来查看。
此处为16行和17行的aload_1和invokespecial #7,点击此处#7,可确定调用的方法为Test.m1(),如下所示:
此处控制台内容没有全部显示
贴出命令行中未截出的main函数中的方法调用字节码指令
2、通过虚拟机字节码指令集去查询对应的16进制字节码为:2B B6 00 07,此处00 07为B6(调用示例方法)的参数,即为调用Test的m1方法。
3、在UE中选中后右键进行选中16进制插入/删除,删除对应的字节码。此处选择删除,要删除的字节数即为4
4、在删除对应的字节码后,仍有3处需修改。
4.1 此Code属性对一个的attribute_length,在原值的基础上减4
4.2 修改此Code属性对应的code_length,从19修改为15,同样见上图。
43 修改此Code属性对应的LinerNumberTable中的对应的字节码行号,因字节码减少了,如不修改会报错
如上图所示,将00 18和 00 14此两次大于所删除的字节码行号(此处为15和16)的两处行号分别减4。保存,OK!重新运行java Test2,如下图所示,上面异常是在没有修改字节码行号记录表时所报的异常。
标签:des style blog http java color
原文地址:http://www.cnblogs.com/xuelu/p/3840694.html