IDEA MyBatisCodeHelper Pro插件高版本解密

声明,该方法仅仅作为个人研究学习使用,请勿传播

版本说明

  1. 系统:macOS(Windows同理)

  2. IDE:IntelliJ IDEA 2024.4

  3. MyBatisCodeHelper Pro 3.4

    环境准备

  4. 从插件市场下载MyBatisCodeHelper Pro

找到MyBatisCodeHelper Pro的jar包

  1. Windows:在地址栏输入%appdata%\JetBrains\找到idea安装目录,里面有个plugins文件夹,然后里面有个文件夹MyBatisCodeHelper-Pro
  2. MacOS:/Users/用户名/Library/Application Support/JetBrains/IntelliJIdea2023.1/plugins/MyBatisCodeHelper-Pro

MacOS的有一点特殊,注意用户名目录和你的idea版本号

然后进入到lib文件夹,找到instrumented-MyBatisCodeHelper-Pro241-3.4.0+2321.jar。(以后升级版本,估计应该同名,变更的只是版本号)

instrumented-MyBatisCodeHelper-Pro241-3.4.0+2321.jar复制出来,解压得到class文件夹,打开

此时,你去点击离线激活

会弹出如下报错信息

java.lang.RuntimeException: java.lang.IllegalArgumentException: Illegal base64 character 7b at java.base/java.util.Base64Decoder.decode0(Base64.java:852) at java.base/java.util.Base64Decoder.decode(Base64.java:570) at java.base/java.util.Base64$Decoder.decode(Base64.java:593) at com.ccnode.codegenerator.af.f.e.a(SourceFile:17) at com.ccnode.codegenerator.af.b.a.a(SourceFile:412) at com.ccnode.codegenerator.af.c.a(SourceFile:65) at com.ccnode.codegenerator.b.a.doOKAction(SourceFile:208)...

确认报错信息在class中如图地方,分析是在208行报错,往上分析到com.ccnode.codegenerator.af.f.e.a(SourceFile:17) 则个class的a方法出现问题,定位class文件

发现是gson解析字符模版报错

解决办法,跳过插件的一系列算法,直接返回f对象

  1. 导入Javassist依赖,导入gson依赖

    复制代码
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
             <version>2.13.0</version>
         </dependency>
         <!-- javassist -->
         <dependency>
             <groupId>org.javassist</groupId>
             <artifactId>javassist</artifactId>
             <version>3.28.0-GA</version>
         </dependency>
  2. 修改com.ccnode.codegenerator.af.f.e.a方法

java 复制代码
import org.apache.ibatis.javassist.*;

import java.io.IOException;


public class PJNew {

    public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {
        ClassPool classPool = ClassPool.getDefault();
        classPool.appendClassPath("YOUR_PATH/instrumented-MyBatisCodeHelper-Pro241-3.4.0+2321.jar");
        CtClass ctClass = classPool.get("com.ccnode.codegenerator.af.f.e");

        CtMethod parseLicenseMethod = ctClass.getDeclaredMethod("a", new CtClass[] { classPool.get("java.lang.String") });
        StringBuffer bodyBuff = new StringBuffer();
        bodyBuff.append("{")
                .append("  com.google.gson.Gson gson = new com.google.gson.Gson();")
                .append("  com.ccnode.codegenerator.af.d.f e = (com.ccnode.codegenerator.af.d.f)gson.fromJson($1,com.ccnode.codegenerator.af.d.f.class);")
                .append("  return e;")
                .append("}");
        parseLicenseMethod.setBody(bodyBuff.toString());

//         对修改的文件,写出到一个新文件
        ctClass.writeFile("YOUR_PATH");

    }
}

会得到改写后的class文件

直接跳过其他逻辑,解码

{

"paidKey": "XXX",

"valid": true,

"userMac": "XX-XX-XX-XX-XX-XX",

"validTo": 4859711999000

}这个字符串信息(为什么是这个对象,可以从刚才的doAction方法中自己找找)

#下一步 替换Class文件

java 复制代码
jar uvf instrumented-MyBatisCodeHelper-Pro241-3.4.0+2321.jar com/ccnode/codegenerator/af/f/e.class

# 最后一步

  1. 将修改后的jar包放回MyBatisCodeHelper-Pro/lib目录下,建议先删除原来的那个jar包,再把新的jar包放入
  2. 重启IDEA
  3. IDEA中打开设置------其他设置------MyBatisCodeHelperPro------翻到最后,点离线激活,输入
  4. {
    "paidKey": "XXX",
    "valid": true,
    "userMac": "XX-XX-XX-XX-XX-XX",
    "validTo": 4859711999000
    },paidKey:你的名字,userMac是你的唯一码,validTo是时间戳,这个时间到2123年,够用了点击激活,你就会发现,哇,成功了,恭喜你,完成了根据报错信息反编译源码,查找问题,解决问题的这一伟大工程。

题外话,在写这篇文章的时候,本来已经激活,

我退出激活之后再走一遍流程,发现版本又从3.4.0升级到了3.4.1,我又重新走了一遍流程,当我输入激活码的时候,提示

这个时候不要慌,所有的提示都在前面的doAction中可以找到错误逻辑

这里的逻辑就是,从你的输入框中获取信息,如果你的验证信息解绑过,那么会判断以前是否使用过这个验证信息,如果是,就会弹出激活码不正经的提示。那么解决办法就是,把过期时间加一点就可以了

至此,大功告成

如果还有任何不懂的地方,欢迎私信交流

2026年1月26日进行补充

由于换了笔记本,装了最新的IDEA2025.3版本,下载了最新的MyBatisCodeHelpPro 3.5.0版本,原来的包肯定就不能用了,现在又来重新激活一遍,有些坑给大家说明一下。

1,核心包的名称没有改变,还是instrumented-MyBatisCodeHelper-Pro241-3.5.0+2321.jar,后续版本更新估计也只有版本号有改变

2,进行反编译查看代码时,请确保你的本地JAVA版本和代码版本一致,目前该jar包使用java8版本。进行反编译代码查看,请使用JD-GUI工具,比IDEA反编译查看更正确。

3,核心报错分析

复制代码
激活码不正常java.lang.RuntimeException: java.lang.IllegalArgumentException: Illegal base64 character 7b
at java.base/java.util.Base64$Decoder.decode0(Base64.java:852)
at java.base/java.util.Base64$Decoder.decode(Base64.java:570)
at java.base/java.util.Base64$Decoder.decode(Base64.java:593)
at com.ccnode.codegenerator.ag.f.e.a(SourceFile:17)
at com.ccnode.codegenerator.ag.b.a.a(SourceFile:412)
at com.ccnode.codegenerator.ag.c.a(SourceFile:65)
at com.ccnode.codegenerator.b.a.doOKAction(SourceFile:228)
at com.intellij.openapi.ui.DialogWrapper$OkAction.doAction(DialogWrapper.java:2023)

自己可以去看反编译代码com.ccnode.codegenerator.b.a.doOKAction,这里不方便贴图

在于bool1 bool2 bool3解析失败,最终追踪到代码就是

复制代码
com.ccnode.codegenerator.ag.f.a方法解析json失败。

一点要明确com.ccnode.codegenerator.ag.f.e.a 的返回对象,com.ccnode.codegenerator.ag.d.f对象,

复制代码
import javassist.*;

import java.io.IOException;

public class PJNew {

    public static void main(String[] args) throws NotFoundException, CannotCompileException, IOException {
        ClassPool classPool = ClassPool.getDefault();
        classPool.appendClassPath("YOUR_PATH/instrumented-MyBatisCodeHelper-Pro241-3.5.0+2321.jar");
        CtClass ctClass = classPool.get("com.ccnode.codegenerator.ag.f.e");


        CtMethod parseLicenseMethod = ctClass.getDeclaredMethod("a", new CtClass[]{classPool.get("java.lang.String")});
        StringBuffer bodyBuff = new StringBuffer();
        bodyBuff.append("{")
                .append("  com.google.gson.Gson gson = new com.google.gson.Gson();")
                .append("  com.ccnode.codegenerator.ag.d.f e = (com.ccnode.codegenerator.ag.d.f)gson.fromJson($1,com.ccnode.codegenerator.ag.d.f.class);")
                .append("  return e;")
                .append("}");
        parseLicenseMethod.setBody(bodyBuff.toString());

//         对修改的文件,写出到一个新文件
        ctClass.writeFile("YOUR_PATH");
    }
}

这段代码时,一定要把返回对象弄正确。

4,对生成的class进行替换,命令 jar uvf xxx.jar com.ccnode.codegenerator.ag.f.e.class. 注意,一定要把class文件放到这个文件夹目录下,这个目录自己建一个,一定要是这个目录。如果后面解析json的类的包目录变了,就和那个包目录保持一致。

5,进行替换之后核对是否替换完成

显示是这样的代码就算替换ok,如何替换插件中的jar包,重启IDEA即可。

目前这就是我时隔一年再次研究的一点心得。仅供大家参考!

破解文件放在我的资源里面,大家可以下载

相关推荐
洋不写bug13 分钟前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
xcl092515 分钟前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet20 分钟前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly768928 分钟前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
IT小白杨39 分钟前
eBay多账号如何应对关联判定:主体、收款、IP、环境四层配置清单一次讲清
java·网络·网络协议·tcp/ip·自动化·指纹浏览器
無a伟1 小时前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
长谷深风1112 小时前
Agent 跑了 30 分钟宕机,如何从断点继续?
java·大数据·人工智能·ai·大模型·memory·aiagent
慧都小妮子2 小时前
DevExpress Java 文档处理 API 免费 CTP:PDF、PowerPoint、条码与跨平台部署
java·pdf·powerpoint·devexpress·文档处理·条码生成
泡海椒2 小时前
告别反射低效:JQuick-Java ASM动态调用链性能优化实战
java·python·性能优化
土司大王2 小时前
LeetCode 17 电话号码的字母组合:Java 回溯模板、多叉决策树与复杂度分析
java·leetcode·决策树