记一次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 启动流程

  1. Agent初始化CoreAgent.premain()方法开始执行
  2. 密码获取:通过多种渠道获取解密密码(pwd)
  3. 转换器初始化:初始化AgentTransformer组件

2.2 类加载拦截机制

  • 在agent初始化完成后,通过ClassFileTransformer拦截所有类的加载过程
  • 挂载AgentTransformer后,所有被加载的类都会在内存中实时解密
  • 内存中运行的已经是解密后的干净类文件

3. 逆向分析实战过程

3.1 分析环境准备

  1. 启动被ClassFinal保护的JAR包
  2. 使用Arthas工具attach到运行中的JVM进程

3.2 类结构分析

# 使用Arthas查看已加载的类
sc *

3.3 关键逻辑定位

  1. 逐一分析已加载的类,寻找注册/激活相关逻辑
  2. 发现核心验证方法:validateMachineCode
  3. 验证流程:正确验证激活码后,将Authorization标志置为1并关闭授权弹窗

4. 破解技术方案

4.1 方案一:内存修改法

实施步骤:

  1. 使用Arthas定位授权标志变量
  2. 发现直接修改会因strict模式而失败
  3. 调整Arthas的options设置,关闭strict模式
  4. Authorization标志直接修改为true
  5. 授权弹窗关闭,程序可正常使用

优点:操作快速,无需深入分析算法
缺点:每次启动都需要重新修改

4.2 方案二:完全脱壳分析

实施步骤:

  1. 将内存中解密的所有类文件dump出来
  2. 尝试绕过CoreAgent.premain直接启动
  3. 挑战:许多类在启动时未加载,难以完整获取

4.3 方案三:注册机(Keygen)开发

详细分析过程:

4.3.1 代码重命名与重构

  • 对dump出的类进行有意义的重新命名,便于分析

4.3.2 激活码生成逻辑分析

关键发现:

  • 程序支持两种激活方式:
    • 基于网卡生成的machineCode
    • 基于主机信息生成的systemCode

4.3.3 systemCode生成原理

  1. 从系统properties中获取特定属性
  2. 如果属性不存在,则随机生成一个MD5值
  3. 通过setProperty方法将生成的MD5前16位持久化到.properties文件中
  4. 该值在首次生成后即被写死,不再变化

4.3.4 激活码计算逻辑

  • 使用systemCode进行对称加密,计算出strDecryptAuthorizationCode
  • 该计算结果即为有效的激活码

5. 技术要点总结

5.1 ClassFinal保护特点

  • 静态分析困难:原始类文件被加密
  • 运行时解密:内存中的类为明文状态
  • 依赖javaagent机制:必须通过agent启动

5.2 逆向分析关键技巧

  1. 内存dump技术:从运行中的JVM获取解密后的类
  2. 动态分析工具使用:熟练掌握Arthas等工具
  3. 代码重构能力:对混淆的代码进行重命名和结构分析
  4. 算法逆向能力:理解加密验证逻辑

5.3 防护与反制措施

对于开发者:

  • 加强关键代码的混淆程度
  • 使用多层级验证机制
  • 增加反调试检测

对于安全研究人员:

  • 掌握运行时分析技术
  • 熟悉JVM内存结构
  • 了解常见的加密算法实现

6. 实践建议

  1. 在进行类似分析时,优先尝试内存修改方案验证可行性
  2. 开发注册机时需要完整理解算法逻辑,避免遗漏关键步骤
  3. 注意法律和道德边界,此类技术应仅用于安全研究和授权测试

本教学文档完整呈现了ClassFinal保护机制的逆向分析全过程,从工具原理到实战技巧,为Java应用程序安全研究提供了详细的技术参考。

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 类结构分析 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应用程序安全研究提供了详细的技术参考。