教你用 Java 字节码做点有趣的事 ——无痛破解 Java 系软件

Aspose Word Java字节码分析与破解研究 周六闲来无事,想到之前很容易对aspose.cell v21.4完成破解研究(见博客),但是对aspose.words没有完成破解分析。 这次换个思路,基于License进行class文件分析。 一:从官网下载 下载地址:https://downloads.aspose.com/words/java; 或者使用maven方式进行jar包下载: <!-- maven配置 --> <repositories> <repository> 阅读详情

在软件开发领域,Java 是一种非常流行的编程语言,由于其跨平台的特性和简洁的语法,它被广泛应用于各种应用程序和系统开发中。然而,Java 系软件的一大特点是其安全性,为了保护软件的知识产权和防止盗版行为,开发者常常对软件进行加密和保护。本篇文章将教你如何利用 Java 字节码技术,来进行无痛破解 Java 系软件,带你领略 Java 字节码的神奇之处!

本文会用到之前讲过的javaagent, 字节码修改框架ASM.不清楚的童鞋可以看下字节码合集里面前面的文章.

项目准备

假如我们有一个swing写了一个图形化程序demo.jar, 注意我们是没有源代码的. 使用java -jar运行这个demo.jar程序会先去校验license是否到期, 到期的话则会弹窗提示: alt

jar 包本质上就是一个 zip 压缩包,用 unzip 命令将 jar 包解压到一个临时文件夹 tmp 中,对应的目录结构如下所示:

.
├── META-INF
│   ├── MANIFEST.MF
│   └── maven
│       └── LicenseCheckSwing
│           └── LicenseCheckSwing
│               ├── pom.properties
│               └── pom.xml
└── me
    └── ya
        └── swing
            ├── AppMain.class
            └── StartupChecks.class

借助JD-GUI等反编译工具去查看StartupChecks.class反编译后的源码可以看到,这里判断 license 是否过期的方法比较简单,是拿当前时间与过期时间做对比,如果当前时间大于过期时间,就返回 license 已过期

public class StartupChecks {
  private static int getDayOfMonth() {
    return 7;
  }
  
  private static int getMonthOfYear() {
    return 0;
  }
  
  private static int getYear() {
    return 2019;
  }
  
  public static boolean canLoad() {
    validateLicensing();
    GregorianCalendar currentDate = new GregorianCalendar();
    GregorianCalendar expiryDate = getExiryDate();
    if (currentDate.after(expiryDate)) {
      return false;
    }
    return true;
  }
  
  private static void validateLicensing() {}
  
  public static GregorianCalendar getExiryDate() {
    return new GregorianCalendar(getYear(), getMonthOfYear(), getDayOfMonth());
  }
}

无痛破解

有了之前的字节码知识可以知道, 我们只需要将验证license是否过期的方法通过字节码修改的框架进行修改, 在canLoad()方法里面插入"return true;"让这个方法始终返回true即可.

public static boolean canLoad() {
    // 在这里强行插入 return true;
    return true;
    // 下面的语句不会执行到
    validateLicensing();
    GregorianCalendar currentDate = new GregorianCalendar();
    GregorianCalendar expiryDate = getExiryDate();
    if (currentDate.after(expiryDate)) {
        return false;
    }
    return true;
}

"return true;" 语句对应的字节码语句如下所示。

ICONST_1
IRETURN

下面我们使用ASM字节码改写框架来看具体的代码.

  1. 首先实现一个自定义的 MethodVisitor,在方法开始处插入 "return true;" 逻辑,代码如下所示。
public static class MyMethodVisitor extends AdviceAdapter {
    @Override
    protected void onMethodEnter() {
        // 强行插入 return true;
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
    }
}

  1. 接下来实现一个自定义的 ClassVisitor,只处理 canLoad 方法,代码如下所示。
public static class MyClassVisitor extends ClassVisitor {
    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
        MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
        // 只注入 canLoad 方法
        if (name.equals("canLoad")) {
            return new MyMethodVisitor(mv, access, name, desc);
        }
        return mv;
    }
}

  1. 随后实现一个自定义的 ClassFileTransformer,在 transform 方法中进行字节码改写,代码如下所示。
public static class MyClassFileTransformer implements ClassFileTransformer {
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classBytes) throws IllegalClassFormatException {
        // 只注入 StartupChecks 类
        if (className.equals("me/ya/swing/StartupChecks")) {
            ClassReader cr = new ClassReader(classBytes);
            ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES);
            ClassVisitor cv = new MyClassVisitor(cw);
            cr.accept(cv, ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG);
            return cw.toByteArray();
        }
        return classBytes;
    }
}

  1. 执行 mvn clean package 编译生成 my-crack-agent.jar,执行 java -javaagent:/path/to/my-crack-agent.jar -jar crack-demo.jar. 此时发现已经成功地绕过了过期检查,弹出了 license 合法的提示框 alt

改写后的字节码如下所示。

public static boolean canLoad();
Code:
  stack=1, locals=2, args_size=0
     0: iconst_1
     1: ireturn
     2: nop
     3: nop
     4: nop
     ...

可以看到经过改写以后 canLoad 在字节码开始处插入了 "return true;",旧指令被替换为了无用的 nop 指令。

总结

这篇文章,我们讲解了如何通过 javaagent 和 ASM 的方式来破解软件,回顾一下重点:要通过反编译工具找到相关的 license 检查函数在哪里,然后通过 javaagent 的 premain 函数在类加载之前动态修改字节码,绕过 license 检查机制。 希望本文能够帮助到对 Java 字节码感兴趣的读者,并能够进一步拓展你对 Java 系软件破解的知识和技能。Java 字节码是一种强大而神奇的编程工具,通过深入理解和应用,我们可以实现更多有趣的事情!

本文由 mdnice 多平台发布

Java的破解和反破解之道 java字节码能够很容易被反编译大家都晓得啦, 今天下午我为了得到一个心仪已久的jbuilder opentools(昨天1.0 Released,新鲜出炉!但只能用14天,这怎么行~@@#!@#!#@!@#%%^@,少说也要140天嘛!),于是我不惜放下其他工作,研究了一把该软件加密方法的破解和反破解,结合以前的一些经验,作文一篇与大家共飨,并不是鼓励大家...破解之道:如今市面上的ja 阅读详情

相关推荐

xxx@xxx.com

lorem ipsm dolor sit amet

2025软考网络工程师--基础知识精讲视频

对软考网络工程师教材进行了详细解析,通过对考查知识点的细致讲解,让考生掌握解题思路和方法,做到举一反三,事半功倍。小任老师帮你把握考试重点,用短的时间,让你学到应该掌握的软考网络工程师内容。

Magnet磁力资源

Magnet磁力资源,超强的磁力资源器,磁力资源,磁力资源

FFmpeg播放器理论与实战(Qt+QSS)

1.比较系统地讲解音视频基础理论:音频基础、视频基础、编解码基础、等。2.比较系统地学习ffmpeg,剖析ffmepg sdk,可以进行二次开发。3.使用Qt,Qss开发专业的基于ffmpeg的播放器。梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。 

caoporn-video-address-extractor:双击以获取CaoPorn的视频地址

caoporn视频地址提取器 双击获取视频地址!

几个好看实用的网站导航

几个好看实用的网站导航 自己辛苦整理 今天吐血 分享 哈哈 网站 导航 使用 好看

教你一招破解字节码加密

字节码加密的需求 java的字节码是可以反编译的,所以很多时候,做商用产品的时候,防止别人看你的核心代码是一个必要手段,字节码加密的需求就诞生了,本质就是防止别人反编译看代码。加密的方式有很多,不是本文的主要目的。 如何破解字节码加密 只要还是ibm,oracle,hp等通用的jvm,那么字节码加载到内存必须...

weixin_33910385的博客 1782

TorrentToMagnet

PHP 转换BT种子到 磁力链

java 字节码 对照表 编辑工具 与 jar破解实战

java 字节码解析与jar破解实战 1) 关于字节码的相关介绍,尤其是字节码对照表 可以参考Oracle官网Java8的jvms(Java虚拟机规范):https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5第6.5节详细介绍了相关操作说明; 其它版本的jvms和jls(Java语言规范)亦可以在官网查看,建议下载PDF文件以便于随时查看:https://docs.oracle.com/javase/spec...

sword_happy的博客 1198

XXX.rar_39xxx俄罗斯_JAVA俄罗斯方块_XXX俄罗斯_俄罗斯xxx_俄罗斯xxx动漫

俄罗斯方块游戏,用Java编,可在ECLIPSE环境下运行

xxxx.rar_tube24XXXX_数码管动态显示

数码管显示一般分静态显示及动态显示两种驱动方式,静态显示占用口线比较多,本文介绍的是如何实现数码管动态显示,应该说数码管动态显示是单片机外部指令输出的重要途径,因此如何设计数码管以及数码管的工作原理、数码管显示的方法、数码管显示的抗干扰设计等在单片机系统设计中占有重要地位。这个例子在系统硬件的基础上设计了软件查询程序、软件延时程序(防止干扰),大致讲述了一种数码管动态显示的工作原理与读取方式。

理解JVM字节码,做点有意的事儿

作者:侯树成来源:Tomcat那些事儿JVM 字节码,做为虚拟机执行的指令,对于平时做 Java 应用开发来说,一直像蒙着一层神秘面纱,朦朦胧胧。但其实理解了字节码指令,对于 Jav...

华章IT官方博客 350

guochan.rar_guochan在线_taoh18.com guochan_www.guochan._www.guocha

仿百度贴吧的单版面,实为简单的论坛,分匿名和注册发贴两种 解压密码:无 值得一看

理解 JVM 字节码 ,做些有意思的事儿

JVM 字节码,做为虚拟机执行的指令,对于平时做 Java 应用开发来说,一直像蒙着一层神秘面纱,朦朦胧胧。但其实理解了字节码指令,对于 Java 虚拟机的工作原理,对于基于「栈」的指令...

Tomcat那些事儿 142

超详细的YOLOv8安装与测试指南:让计算机视觉任务变得简单

python3+、Anaconda3或Miniconda3 Ultralytics提供了多种安装方法,包括pip、conda和Docker。通过pip包安装最新稳定版的YOLOv8,或者克隆Ultralytics GitHub仓库以获取最新版本。Docker可用于在隔离容器中执行包,避免本地安装。 最简单直接的方式就是直接使用pip方法直接安装。 也可以直接从GitHub仓库安装包。如果你想要最新的开发版本,这可能会很有用。确保你的系统上安装了Git命令行工具

CDBmax的博客 1万+

防火墙旁挂组网

分析拓扑结构,涉及路由器、交换机、防火墙。步骤包括基础 IP 配置、OSPF、防火墙双机热备、安全策略等。第一步,路由器配置。R5、R6 连接 ISP 和核心交换机,配置接口 IP,然后 OSPF。然后防火墙,双机热备的 HRP、VRRP,还有安全策略。接着交换机,划分 VLAN,配置 TRUNK,加入 OSPF。

weixin_73298423的博客 902

Charles破解项目源码解析:深入理解jar文件修改原理与Java字节码注入技术

Charles代理工具是开发者必备的网络调试神器,但官方版本需要付费授权。本文将通过**Charles破解项目源码解析**,为您揭开jar文件修改的神秘面纱,理解Java字节码注入的技术原理。无论您是网络调试新手还是经验丰富的开发者,这篇**Charles破解教程**都将帮助您深入理解软件逆向工程的核心概念。 ## 🎯 Charles破解项目概述 Charles Web Debugging

gitblog_00765的博客 350

Python新手必看:5分钟搞定睿尔曼机械臂基础控制(附代码示例)

本文为Python新手提供了快速上手睿尔曼机械臂基础控制的实战指南。通过详细的步骤讲解和代码示例,介绍了从环境搭建、网络配置、SDK安装到建立连接、执行关节运动(movej)、直线运动(movel)等核心控制指令的全过程,帮助零基础开发者快速实现机械臂的基础操控。

hp777的博客 328

别再到处找破解版了!手把手教你用Java字节码修改Aspose.Cells 20.7水印限制

本文深入解析了Java字节码修改技术,以Aspose.Cells为例探讨其许可验证机制。通过Javassist框架实现字节码修改,详细介绍了去除水印的技术方法,但强调这些技术仅用于学习研究,商业使用应购买正版授权。

weixin_30756499的博客 471

使用sysbench对Oracle做基准测试(-) 安装篇

sysbench是一款开源的多线程性能测试工具, 可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL。

道行尚浅(老道)的博客 7810

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1125

浅谈JAVA程序破解(转)

浅谈JAVA程序破解http://www.blogjava.net/galaxyp/archive/2006/04/19/41833.html作者:舵手申明:如转载请保证文章的完整性以及出处    最近对JAVA程序的破解比较感兴趣,拿几个行业软件练了一下手,略有心得,拿出来与菜鸟分享!注意只是一点心得,本文并不涉及具体软件的破解。初学破解,失误之处在所难免,敬请高手赐教!    直接进入正题,对

villa123 的专栏 3727

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+
上一篇: 10个必备的IntelliJ IDEA插件,提高开发效率
下一篇: 字节码操作的手术刀-Javassist
yue_stack
博客等级 码龄3年 6粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值