• .class 字节码文件修改


    有个.class文件,用XJad反编译如下:

        public String int()
        {
            String s = null;
            try
            {
                List list = c.if(a).getNeighboringCellInfo();
                if (list != null && !list.isEmpty())
                {
                                .......
                }
            }
    }
      ......

    现在想把它改成下面这样:

    	public String int()
    	{
    		String s = null;
    		try
    		{
    			List list = Support.getNeighboringCellInfo();
    			if (list != null && !list.isEmpty())
    			{
                               ........
                            }
                    }
            }
    

      也就是getNeighboringCellInfo函数返回值从Support类的静态方法getNeighboringCellInfo里面获取。

    Support类如下:

    package com.iGod;
    public
    class Support { ...... public static List getNeighboringCellInfo() { Log.i("com.iLocation", "Support.getNeighboringCellInfo!!!"); return new ArrayList(); }
    }

    我们先看之前代码这一段的字节码文件,使用JavaBite工具查看int函数如下所示:

    特别注意000C这个编号的指令astore_2。

    修改后的字节码文件是这样的:

    在0002指令处我们做了很多修改,之后编译一直报错,原因就是000C以后的指令(没有修改)的index和之前不一样了(跳转语句根据index跳会乱掉)。所以我们要补齐nop指令,一直补到和原来的000C后面的指令相同。比如原来goto 01c处执行,结果删一条指令后,原01c处指令集体向前移动1个字节,就乱了。

    看一下字节码对比

    图中一串00 就是我们填入的 nop指令。01 是aconst_null,4C是astore_1,B8 00 DA是调用Support里面的静态函数。

    附:

    工具没找到靠谱的,java Bytecode Editor 也可以用,但都不好用。还是UE关键时刻能顶住。

    JavaBite 查看Methods的时候,如果两个方法同名,它只显示第一个方法的代码。这时候可以用java Bytecode Editor把要修改的方法前面的同名方法删掉,再用javaBite修改代码,修改完了再把删的方法还原回来。不知道有没有好的办法解决这些问题。

    XJad反编译的时候最给力,修改完的.class文件可以在XJad里面反编译,看一下效果是不是预期。但是它不能编辑。

    参考文献:

    Class文件解析 :字段、方法和属性

    http://www.liuliqiang.com/post-181.html

    http://www.liuliqiang.com/post-182.html

  • 相关阅读:
    [Swift通天遁地]五、高级扩展-(2)扩展集合类型
    [Swift通天遁地]五、高级扩展-(1)快速检测设备属性:版本、类型、屏幕尺寸
    [Swift]LeetCode266.回文全排列 $ Palindrome Permutation
    [Swift]LeetCode265.粉刷房子 II $ Paint House II
    [Swift]LeetCode264.丑数 II | Ugly Number II
    [Swift通天遁地]四、网络和线程-(15)程序内购功能
    [Swift通天遁地]四、网络和线程-(14)创建一个Socket服务端
    hdu 4888 Redraw Beautiful Drawings(最大流,判环)
    【剑指offer】斐波那契序列与跳台阶
    Asp.NET之对象学习
  • 原文地址:https://www.cnblogs.com/chyl411/p/3596301.html
Copyright © 2020-2023  润新知