.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函数如下所示:

.class 字节码文件修改_第1张图片

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

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

.class 字节码文件修改_第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

你可能感兴趣的:(Class)