如何利用JClassLib修改.class文件

原创 2013年11月08日 14:27:22

最近在学习逆向分析和反编译,无意之中了解到了JClassLib。JClassLib不但是一个字节码阅读器而且还包含一个类库允许开发者读取,修改,写入Java Class文件与字节码。其他的用途我就不说了,先看一下效果。


第一步、准备下载工具,一个是jd-gui,阅读jar包和.class源码的工具,jclasslib就修改.class文件的包

下载地址

第二步、示范
1、比如说这个就是原来的java文件,很简单就是输出 google 这个字符串
package com.qx;

public class Main {
	public static void main(String[] args) {
		print();
	}
	
	static void print() {
		System.out.println("google");
	}
}


2、编译之后,控制台执行结果为 google,为什么用 javac -d . Main.java 去编译java文件,这个我就不解释了,不懂的话去恶补一下


3、找到Main.class文件,并用 jd-gui打开,效果如下


4、在这里很明显看到源码,可惜不能修改呀,现在就准备修改工具,搞定它。解压jclasslib,目录如下

5、在eclipse里面创建一个java工程,然后把src文件覆盖到工程目录下,并且执行BrowserApplication.java,得到一个工具叫做Bytecode viewer,如下图

6、现在咱们可以利用工具找到我们修改的部分,我们就是要修改Main.class文件中google,修改成 baidu。
结构目录很清楚,methods就是方法,print是打印google字符串的方法,main是主函数,在这里我们找到print并打开

7、打开code,我们会看到第二行 lbc #4 <google>,这时我们点击#4

8、这个效果如下,通过这个,我们知道google字符串的地址在哪里了,在#21, 这个时候 点击 cp info #21

9、这时,我们看到的google字符是在[21]这个位置,并且CONSTANT_Utf-8_info,这些信息待会修改的时候 很有用。


10、现在我们可以用代码去把 google 修改成 baidu。首先创建一个工程,把刚刚下载jclasslib文件夹下bin目录下jclasslib.jar引入,如下图

11、Main.java函数代码如下
package cc.cc.c;

import java.io.*;
import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.CPInfo;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class Main {
	public static void main(String[] args) throws Exception {

		String filePath = "C:\\Main.class";
		FileInputStream fis = new FileInputStream(filePath);
		DataInput di = new DataInputStream(fis);
		ClassFile cf = new ClassFile();
		cf.read(di);
		CPInfo[] infos = cf.getConstantPool();

		int count = infos.length;
		for (int i = 0; i < count; i++) {
			if (infos[i] != null) {
				System.out.print(i);
				System.out.print(" = ");
				System.out.print(infos[i].getVerbose());
				System.out.print(" = ");
				System.out.println(infos[i].getTagVerbose());
				if (i == 21) {//刚刚找到的是21位置
					ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //刚刚那里是CONSTANT_Utf-8_info所以这里要用这个
					uInfo.setBytes("baidu".getBytes());
					infos[i] = uInfo;
				}
			}
		}
		//这种方式也可以,一样的
/*		if(infos[count] != null) {
			ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //刚刚那里是CONSTANT_Utf-8_info所以这里要用这个
			uInfo.setBytes("baidu".getBytes());
			infos[count] = uInfo;
		}*/
		
		cf.setConstantPool(infos);
		fis.close();
		File f = new File(filePath);
		ClassFileWriter.writeToFile(f, cf);
	}
}
12、不报错,就代表成功了,然后再执行Main.class文件


这个时候,我们就把class文件中google修改成baidu了,怎么用这个工具就看你怎么玩了,有什么问题请随时留言。

版权声明:本文为博主原创文章,转载请说明出处。

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半...
  • hexin373
  • hexin373
  • 2011年08月08日 16:50
  • 104100

利用jclasslib修改java编译后的.class文件

修改class文件
  • hoho_12
  • hoho_12
  • 2016年07月18日 15:56
  • 1450

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

jclasslib修改class文件内容

 1.用jd-gui打开该jar或 打开之后找到 要修改提示信息 的class文件 这里找到的是GenEntity 找到对应需要修改的代码所在的方法名 我这里包含提示信息的这段代码在方法...
  • djun100
  • djun100
  • 2014年05月01日 18:37
  • 4495

利用jclasslib修改java编译后的.class文件

在Eclipse中新建一个test类,通过IO流来修改class中的值 [java] view plain copy   import java.io...
  • dhdhxgx
  • dhdhxgx
  • 2016年11月08日 17:40
  • 787

Java中的局部变量表及使用jclasslib进行查看

文章搬家自:https://my.oschina.net/itsyizu/blog/548686 直接上下载地址jclasslib是一个独立的工具,不是包含在JDK中的工具,需要自己进行下载。一个栈帧...

直接修改class文件 工具:jclasslib

1、用class file editor打开要修改的class,找到要修改的行号(如果597行) 2、编写main方法来修改 package test; import java.io.Dat...

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半...
  • dhdhxgx
  • dhdhxgx
  • 2016年11月03日 15:02
  • 1004

直接修改别人jar包里面的class文件 工具:jclasslib

出于某些原因 需要把别人jar包里面的class修改一下信息 配置文件*.properties MANIFEST.MF 这些东西可以直接用记事本打开修改 然后替换掉就OK.. 在网上游荡了半天,...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何利用JClassLib修改.class文件
举报原因:
原因补充:

(最多只允许输入30个字)