首页 > 其他 > 详细

通过修改字节修改方法体

时间:2014-07-13 21:39:04      阅读:428      评论:0      收藏:0      [点我收藏+]

先贴出示例中的代码:

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来查看。

bubuko.com,布布扣

此处为16行和17行的aload_1和invokespecial #7,点击此处#7,可确定调用的方法为Test.m1(),如下所示:

bubuko.com,布布扣

此处控制台内容没有全部显示

bubuko.com,布布扣

 

贴出命令行中未截出的main函数中的方法调用字节码指令

bubuko.com,布布扣

 

2、通过虚拟机字节码指令集去查询对应的16进制字节码为:2B B6 00 07,此处00 07为B6(调用示例方法)的参数,即为调用Test的m1方法。

3、在UE中选中后右键进行选中16进制插入/删除,删除对应的字节码。此处选择删除,要删除的字节数即为4

bubuko.com,布布扣

 

4、在删除对应的字节码后,仍有3处需修改。

     4.1 此Code属性对一个的attribute_length,在原值的基础上减4

bubuko.com,布布扣

      4.2 修改此Code属性对应的code_length,从19修改为15,同样见上图。

      43 修改此Code属性对应的LinerNumberTable中的对应的字节码行号,因字节码减少了,如不修改会报错

bubuko.com,布布扣

如上图所示,将00 18和 00 14此两次大于所删除的字节码行号(此处为15和16)的两处行号分别减4。保存,OK!重新运行java Test2,如下图所示,上面异常是在没有修改字节码行号记录表时所报的异常。

bubuko.com,布布扣

通过修改字节修改方法体,布布扣,bubuko.com

通过修改字节修改方法体

原文:http://www.cnblogs.com/xuelu/p/3840694.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!