.class 字节码文件修改

摘要:
“);returnnewArrayList() ;}} 让我们首先查看上一节代码的字节码文件,并使用JavaBite工具按如下方式查看int函数:特别注意000C指令astore_ 2修改后的字节码文件如下:我们在0002指令中做了许多更改,然后编译时出错。原因是000C之后的指令索引与之前的不同。此时,您可以使用javaBytecodeEditor删除要修改的方法前面的同名方法,使用javaBite修改代码,修改后恢复已删除的方法。当反编译XJad时,它是最棒的。已修改。类文件可以在XJad中进行反编译,以查看效果是否符合预期。

有个.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
classSupport { ...... public staticList getNeighboringCellInfo() { Log.i("com.iLocation", "Support.getNeighboringCellInfo!!!"); return newArrayList(); }
}

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

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

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

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

.class 字节码文件修改第2张

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

看一下字节码对比

.class 字节码文件修改第3张

图中一串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 字节码文件修改》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇idea安装SonarLint语法检测插件C#参数化(防止SQL注入)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

新闻发布系统(分页显示)

根据上次的新闻发布展示页面效果,进行分页操作: 分页实现: 实现数据的分页显示,需要以下几个关键步骤: ①确定每页显示的总页数 ②计算显示的总页数 ③编写SQL语句   一.页面效果图 1、创建util包,Page类,定义相关属性并进行封装: package cn.news.util; import java.util.List; im...

arcgis中邻接矩阵文件的生成

首先我要说明的是,arcgis 9.2中已经实现基于基本一阶邻接关系的空间自相关计算,也就是说arcgis系统本身已通过一定算法解决了本文以及之前blog中涉及的相关问题。以下内容仅限于算法设计的兴趣及对arcgis相关功能实现的探讨。arcgis 9.2中对于空间关联矩阵文件的构建做了拓展,你可以DBF属性中任意值为Unique的字段来建立矩阵。原先矩阵...

List的输出方法

1、for (int i = 0; i < list.size(); i++) {    System.out.println(list.get(i));} 2、List list = new HashList();Iterator it = list.iterator();while(it.hasNext()){list.next();//返回值是...

Thinkphp的Volist标签

Volist标签主要用于在模板中循环输出数据集或者多维数组。 volist标签(循环输出数据) 闭合 非闭合标签 属性 name(必须):要输出的数据模板变量 id(必须):循环变量 offset(可选):要输出数据的offset length(可选):输出数据的长度 key(可选):循环的key变量,默认值为i mod(可选):对key值取模,...

js和java中使用join来进行数组元素的连接

  合理地使用join来进行数组中元素的连接,代码简洁,比自己编码也更为方便。   js中join的用法 var arr = new Array(3) arr[0] = "a" arr[1] = "b" arr[2] = "c" arr.join(".") a.b.c ------------------ arr.join(",") a,b,c   ja...

OpenWRT UCI API的使用 (libuci库的使用)

摘自:http://www.openwrt.pro/post-37.html OpenWRT UCI API的使用 LUCI配置文件简介 LUCI的配置文件一般存储在 /etc/config目录下。比如网络配置文件则是 /etc/config/network 无线的配置文件是 /etc/config/wireless. 跟多配置文件的含义参考官方 WIKI...