zoukankan      html  css  js  c++  java
  • 如何利用JClassLib修改.class文件

    最近在学习逆向分析和反编译,无意之中了解到了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.ClassFile;

    import org.gjt.jclasslib.structures.Constant;

    import org.gjt.jclasslib.structures.InvalidByteCodeException;

    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);
            Constant[] 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].getConstantType().toString());
                    if (i == 261) {//刚刚找到的是21位置
                        ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //刚刚那里是CONSTANT_Utf-8_info所以这里要用这个
                        uInfo.setString("baidu");
                        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了,怎么用这个工具就看你怎么玩了,有什么问题请随时留言。
     

  • 相关阅读:
    实验5
    实验4
    实验3
    《整数计算器》
    《写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示》
    《把一个英语句子中的单词次序颠倒后输出》
    个人简介
    学习《构建之法》的感想
    把一个英语句子中的单词次序颠倒后输出。例如输入“how are you”,输出“you are how”;
    写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”);
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317293.html
Copyright © 2011-2022 走看看