使用jclasslib直接修改.class文件中的字符串和整型Long型数值

我的情况如下:

只有服务器一个class文件,里面限制了一些文件上传大小,我还想改几个字符串常量值,这个class文件里面依赖太多的外部类,没办法反编译处理,需要补的东西太多,客户关系找过来的(白嫖不给钱),没时间成本去补,只能想到直接修改class文件。

我的需求如下(为什么看到源代码了?这个是直接把.class文件拖进idea就可以看到的,如果你不用idea就下载个Bytecode-Viewer-2.9.22.jar,我下面给的下载地址也有这个jar,双击即可运行):

第一步下载需要的jar包(有资源自行别处下载,没资源我给个链接):

jclasslib-browser.jar、jclasslib-library.jar、kotlin-stdlib-1.3.70.jar、kotlin-stdlib-common-1.3.70.jar、kotlinx.dom-0.0.10.jar

下载链接:点击下载

第二步装个IDEA开发工具,创建一个java工程项目,将上述jar全部导入并做项目的依赖库,然后新建一个ChangeClassUtils.java,里面创建main方法,如下:

    public static void main(String[] args) throws Exception {
        //【修改点】FileUtils.class是我要修改的文件,C:\Users\Administrator\Desktop\新建文件夹是这个文件所在位置
        String filePath = "C:\\Users\\Administrator\\Desktop\\新建文件夹\\FileUtils.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;
        System.out.println(count);
        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].toString());
               /* //【修改点】这里是要修改的位置点号码和字符串内容
                if(i == 454){
                    ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
                    uInfo.setString("all");
                    infos[i]=uInfo;
                }
                //【修改点】这里是要修改的位置点号码和Long值
                if(i == 502){
                    ConstantLongInfo uInfo = (ConstantLongInfo)infos[i];
                    uInfo.setLong(10240000);
                    infos[i]=uInfo;
                }*/
                
            }
        }
        cf.setConstantPool(infos);
        fis.close();
        File f = new File(filePath);
        ClassFileWriter.writeToFile(f, cf);
    }

第三步运行main方法,在控制台中会看到我们要修改的所有字符列表,按ctrl+f搜索我要改的字符串,找到红框中ConstantUtf8Info类型的信息,最前面的454就是位置点,同理搜索10240找到位置点是502:

  

第四步就是设置修改内容,放开文章第二步代码段中唯一注释的地方并根据自己的需求修改红框处的信息:

第五步运行main方法即可修改成功:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改jar包变量 或者长量 步骤如下: 1.用jd-gui打开该jar 怎么打开不用我说了吧? 打开之后找到 要修改提示信息 的class文件 这里找到的是GenEntity 找到对应需要修改的代码所在的方法名 我这里包含提示信息的这段代码在方法 getAllDataBase() 如下图: 2.用jd-gui或者winrar把GenEntity.class 解压出来到C盘 (目录无所谓) 3.双击桌面上安装好了的 jc lasslib bytecode viewer ,点击软件的 File -- Open Class File 打开你刚解压出来的class文件 4.点击methods--getAllDataBase--Code methods是表示方法不用说吧 getAllDataBase是刚在jd-gui里面找到的方法名 Code包含了getAllDataBase方法里所有的信息 找到"不能打开数据库连接,请检查!" 这里这个工具没有提供搜索功能 如果这里很多内容 那么你可以点击 copy to clipboard把这里的内容复制到一个文本文件里面然后再搜索 这里找到的是第82行 5.点击第 82行后面的 #34 会跳转到Constant Pool常量池的第34个常量 6.再点右边的 cp info #362 会跳转到第362个常量 这里能看到String: 不能打开数据库连接,请检查! 也就是最后输出的信息 7.找到GenEntity.class的关键常量了现在就该修改它了 在eclipse里面新建一个Test来处理GenEntity.class [java] view plain copy 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 Test { public static void main(String[] args) throws Exception { String filePath = "C:\\GenEntity.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 == 362){ ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i]; uInfo.setBytes("芝麻不开门!".getBytes()); infos[i]=uInfo; } } } cf.setConstantPool(infos); fis.close(); File f = new File(filePath); ClassFileWriter.writeToFile(f, cf); } } 这里需要注意"C:\\GenEntity.class"是我存放class的目录 if(i == 362) 这里是刚我在第七步找到的常量序号 "芝麻不开门!"这里是我想修改的文字信息! 运行Test.java 会有如下提示信息 没有报错就证明正常的 如果报错那么就有问题 9.把C盘刚修改后的GenEntity.class替换掉原来的GenEntity.class 怎么替换不用我说了吧.. 用winrar打开.jar 然后把GenEntity.class拖进去覆盖就行了 10.运行效果..
要计算给定 IP 范围内的所有 IP,可以将起始 IP 和结束 IP 转换为长整数,并使用循环递增来生成每个 IP。以下是一个示例代码: ```java import java.net.InetAddress; import java.net.UnknownHostException; public class IPRangeCalculator { public static void main(String[] args) { String startIP = "192.168.0.1"; String endIP = "192.168.0.10"; try { long start = ipToLong(InetAddress.getByName(startIP)); long end = ipToLong(InetAddress.getByName(endIP)); for (long i = start; i <= end; i++) { System.out.println(longToIP(i)); } } catch (UnknownHostException e) { e.printStackTrace(); } } private static long ipToLong(InetAddress ip) { byte[] octets = ip.getAddress(); long result = 0; for (byte octet : octets) { result <<= 8; result |= octet & 0xff; } return result; } private static String longToIP(long ip) { StringBuilder sb = new StringBuilder(15); for (int i = 0; i < 4; i++) { sb.insert(0, Long.toString(ip & 0xff)); if (i < 3) { sb.insert(0, '.'); } ip >>= 8; } return sb.toString(); } } ``` 在上述代码,`startIP` 和 `endIP` 分别表示起始 IP 和结束 IP。我们首先将它们转换为长整数,然后使用一个循环递增的方式,从起始 IP 一直遍历到结束 IP,并将每个 IP 输出。`ipToLong` 方法用于将 IP 地址转换为长整数,而 `longToIP` 方法则是将长整数转换回 IP 地址的字符串表示形式。 请注意,在运行此代码之前,请确保输入的起始 IP 和结束 IP 是合法的,并且起始 IP 小于或等于结束 IP。另外,由于此代码使用了网络相关的操作,因此需要处理可能抛出的 `UnknownHostException` 异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值