记一次classfinal保护的jar包逆向
字数 1762 2025-12-26 12:14:39
ClassFinal保护的JAR包逆向分析教学文档
1. ClassFinal工具概述
1.1 基本定义
ClassFinal是一款开源的Java Class加密工具,其工作原理类似于加密壳。被ClassFinal加密的JAR包不能直接通过java -jar命令运行,需要配置javaagent参数来启动。
1.2 核心运行机制
- 当加密的类被ClassLoader加载时,真实的方法体会被动态解密并注入
- 程序运行时,JVM通过嵌入的javaagent从加密的JAR包中加载类
CoreAgent.premain()方法作为整个解密过程的入口点
2. ClassFinal技术原理深度解析
2.1 启动流程
- Agent初始化:
CoreAgent.premain()方法开始执行 - 密码获取:通过多种渠道获取解密密码(pwd)
- 转换器初始化:初始化
AgentTransformer组件
2.2 类加载拦截机制
- 在agent初始化完成后,通过
ClassFileTransformer拦截所有类的加载过程 - 挂载
AgentTransformer后,所有被加载的类都会在内存中实时解密 - 内存中运行的已经是解密后的干净类文件
3. 逆向分析实战过程
3.1 分析环境准备
- 启动被ClassFinal保护的JAR包
- 使用Arthas工具attach到运行中的JVM进程
3.2 类结构分析
# 使用Arthas查看已加载的类
sc *
3.3 关键逻辑定位
- 逐一分析已加载的类,寻找注册/激活相关逻辑
- 发现核心验证方法:
validateMachineCode - 验证流程:正确验证激活码后,将
Authorization标志置为1并关闭授权弹窗
4. 破解技术方案
4.1 方案一:内存修改法
实施步骤:
- 使用Arthas定位授权标志变量
- 发现直接修改会因strict模式而失败
- 调整Arthas的options设置,关闭strict模式
- 将
Authorization标志直接修改为true - 授权弹窗关闭,程序可正常使用
优点:操作快速,无需深入分析算法
缺点:每次启动都需要重新修改
4.2 方案二:完全脱壳分析
实施步骤:
- 将内存中解密的所有类文件dump出来
- 尝试绕过
CoreAgent.premain直接启动 - 挑战:许多类在启动时未加载,难以完整获取
4.3 方案三:注册机(Keygen)开发
详细分析过程:
4.3.1 代码重命名与重构
- 对dump出的类进行有意义的重新命名,便于分析
4.3.2 激活码生成逻辑分析
关键发现:
- 程序支持两种激活方式:
- 基于网卡生成的
machineCode - 基于主机信息生成的
systemCode
- 基于网卡生成的
4.3.3 systemCode生成原理
- 从系统properties中获取特定属性
- 如果属性不存在,则随机生成一个MD5值
- 通过
setProperty方法将生成的MD5前16位持久化到.properties文件中 - 该值在首次生成后即被写死,不再变化
4.3.4 激活码计算逻辑
- 使用
systemCode进行对称加密,计算出strDecryptAuthorizationCode - 该计算结果即为有效的激活码
5. 技术要点总结
5.1 ClassFinal保护特点
- 静态分析困难:原始类文件被加密
- 运行时解密:内存中的类为明文状态
- 依赖javaagent机制:必须通过agent启动
5.2 逆向分析关键技巧
- 内存dump技术:从运行中的JVM获取解密后的类
- 动态分析工具使用:熟练掌握Arthas等工具
- 代码重构能力:对混淆的代码进行重命名和结构分析
- 算法逆向能力:理解加密验证逻辑
5.3 防护与反制措施
对于开发者:
- 加强关键代码的混淆程度
- 使用多层级验证机制
- 增加反调试检测
对于安全研究人员:
- 掌握运行时分析技术
- 熟悉JVM内存结构
- 了解常见的加密算法实现
6. 实践建议
- 在进行类似分析时,优先尝试内存修改方案验证可行性
- 开发注册机时需要完整理解算法逻辑,避免遗漏关键步骤
- 注意法律和道德边界,此类技术应仅用于安全研究和授权测试
本教学文档完整呈现了ClassFinal保护机制的逆向分析全过程,从工具原理到实战技巧,为Java应用程序安全研究提供了详细的技术参考。