如何利用JClassLib修改.class文件
来源:互联网 发布:电信宽带无法连接网络 编辑:程序博客网 时间:2024/05/17 06:40
最近在学习逆向分析和反编译,无意之中了解到了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了,怎么用这个工具就看你怎么玩了,有什么问题请随时留言。
- 如何利用JClassLib修改.class文件
- 利用jclasslib修改java编译后的.class文件
- 利用jclasslib修改java编译后的.class文件
- 利用jclasslib修改java编译后的.class文件
- 利用jclasslib修改java编译后的.class文件
- 通过JClassLib修改Class文件
- jclasslib修改class文件内容
- 直接修改class文件 工具:jclasslib
- 【修改jar】jclasslib修改jar包里面的class文件
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 直接修改别人jar包里面的class文件 工具:jclasslib
- 如何修改jar包中的class文件
- weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB转换成String
- Tuxedo不能全部处理并发的客户端,请求是什么原因?
- angular的ngMockE2E中有一个万人坑。。。
- 报表不分页问题
- 面向接口编程
- 如何利用JClassLib修改.class文件
- 对于逆元的理解
- VS2010搭建SVN,实现代码的版本控制----【VS2010插件安装】
- eclipse jvm 调优
- Fedora用Yum安装Apache+PHP+Mysql环境
- linux网络命令详解ifconfig
- MySQL5.0的my.cnf配置说明
- Mysql中的sync_binlog参数
- mysql主从配置步骤