MyBatisCodeHelper-Pro 破解教程
免责声明
本软件和技术仅供学习和研究使用,禁止将其用于商业用途。如果您使用本软件和技术用于商业化而产生任何损失、风险或法律纠纷,作者将不承担任何责任。
作者不保证本软件和技术的完整性、准确性、可靠性、适用性或及时性。使用本软件和技术产生的任何后果,作者将不承担任何责任。
本软件和技术中的任何意见、建议或信息,均不构成作者或作者所在组织的任何形式的保证或担保。
任何人不得对本软件和技术进行反向工程、破解或其他非法行为。任何未经作者或作者所在组织授权的行为,均可能构成侵权或违法行为,一经发现作者将保留追究其法律责任的权利。
使用本软件和技术将被视为您已经完全接受本免责声明的所有条款和条件。如果您不同意本免责声明的任何部分,请勿使用本软件和技术。
本次演示版本为3.4.1
破解准备
依赖
<dependencies>
<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- javassist -->
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.18</version>
</dependency>
</dependencies>
查找需要反编译的类
- 1.需要先解压 MyBatisCodeHelper-Pro.zip 不同版本名称不同
- 2.找到解压过的文件夹 下的 lib 有个 instrumented-MyBatisCodeHelper-Pro xxxx .jar 拷贝出来开始进行破解
- 3.使用 cfr-0.152.jar(请自行去github查找) 反编译jar包
- java -jar cfr-0.152.jar instrumented-MyBatisCodeHelper-Pro xxxx .jar --renamedupmembers true --hideutf false >> b.txt
- 4.找到需要破解的类名和方法名 b.txt 中搜索private static Gson
找到类似下面的代码 确定 类名 方法名 方法参数类型 方法返回类型 注意:参数名称请忽略 使用 $1 的形式表示第一个参数 不然后续执行会报错
package com.ccnode.codegenerator.af.f;
import com.ccnode.codegenerator.af.d.f;
import com.ccnode.codegenerator.af.f.b;
import com.ccnode.codegenerator.af.f.c;
import com.ccnode.codegenerator.af.f.d;
import com.google.gson.Gson;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
import kotlin.text.Charsets;
public class e {
private static Gson a = new Gson();
public static f a(String string) {
String string2;
byte[] byArray = null;
try {
byArray = d.b(d.java_security_interfaces_RSAPublicKey_a(new String(Base64.getDecoder().decode("TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZzUyUjExV0h1MysvNUV2WnhkS0l2a3ovekpnS2VNUUhNLytMVkxSZS9zWUpFQlUxbUUrODc3MmJJckk4UThscldqSHc5cmVjQ1RWVVhXUnhWYXBndk1HYTZ3KzU4STZwYXdSaFhwZDBrRkhUY2xxeUZGWFpoS3ZiQUtoblphRGNuZkJtSkhObTQwR0JFTGpCTmx5MXpha2FIblFmUzF0QlhaSGQwOUV0c2VRSURBUUFC"), Charsets.UTF_8)), Base64.getDecoder().decode(string));
}
catch (b b2) {
byArray = d.b(new c(), Base64.getDecoder().decode(string));
}
f f2 = null;
try {
string2 = new String(byArray, "UTF-8");
}
catch (UnsupportedEncodingException unsupportedEncodingException) {
throw new RuntimeException(unsupportedEncodingException);
}
try {
f2 = (f)a.fromJson(string2, f.class);
}
catch (Exception exception) {
throw new RuntimeException("gson catch exception, the json string is" + string2, exception);
}
return f2;
}
}
核心执行
public class App {
public static void main(String[] args) {
try {
/**
* 适用于3.2.4版本后的
* 1.需要先解压 MyBatisCodeHelper-Pro.zip 不同版本名称不同
* 2.找到解压过的文件夹 下的 lib 有个 instrumented-MyBatisCodeHelper-Pro xxxx .jar 拷贝出来开始进行破解
* 3.使用 cfr-0.152.jar(请自行去github查找) 反编译jar包
* java -jar cfr-0.152.jar instrumented-MyBatisCodeHelper-Pro xxxx .jar --renamedupmembers true --hideutf false >> b.txt
* 4.找到需要破解的类名和方法名 b.txt 中搜索private static Gson
*
*/
String replacement = "\\";
//项目所在前缀
String prefix = "G:\\code";
//项目 需要破解的jar 所在目录
String project = "\\practical-projects\\z-a-lib\\";
// 直接使用 jar 路径
String allPathJar = prefix + project + "instrumented-MyBatisCodeHelper-Pro241-3.4.1+2321.jar";
//破解后的class 存放目录 注意:完整地址为prefix+project+folderName
String folderName = "11";
//需要修改的类名
String className = "com.ccnode.codegenerator.af.f.e";
//需要修改的方法名
String classMethodName = "a";
//方法参数类型
String classMethodParameterTypeName = "java.lang.String";
//方法第一个参数
String classMethodParameterName = "$1";
//方法返回类型
String classMethodReturnClassType = "com.ccnode.codegenerator.af.d.f";
//private static Gson
MybtaisPro_324_Af(replacement, prefix, project, allPathJar, folderName, className, classMethodName, classMethodParameterTypeName, classMethodParameterName, classMethodReturnClassType);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 3.2.4 ~ 3.4.1
* @param replacement 需要替换的字符
* @param prefix 项目所在前缀
* @param project 需要破解的jar 所在目录
* @param allPathJar 直接使用 jar 路径
* @param folderName 破解后的class 存放目录 注意:完整地址为prefix+project+folderName
* @param className 需要修改的类名
* @param classMethodName 需要修改的方法名
* @param classMethodParameterTypeName 方法参数类型
* @param classMethodParameterName 方法第一个参数
* @param classMethodReturnClassType 方法返回类型
* @throws NotFoundException
* @throws CannotCompileException
* @throws IOException
*/
private static void MybtaisPro_324_Af(String replacement, String prefix, String project, String allPathJar, String folderName, String className, String classMethodName, String classMethodParameterTypeName, String classMethodParameterName, String classMethodReturnClassType) throws NotFoundException, CannotCompileException, IOException {
// 加载类
ClassPool classPool = ClassPool.getDefault();
//classPool.appendClassPath(allPathJar);
classPool.insertClassPath(allPathJar);
classPool.insertClassPath(new ClassClassPath(com.google.gson.Gson.class));
// 通过绝对定位,加载指定的类
//CtClass cc = pool.get(classname);
// 获取指定类
CtClass ctClass = classPool.get(className);
CtMethod parseLicenseMethod = ctClass.getDeclaredMethod(classMethodName, new CtClass[]{classPool.get(classMethodParameterTypeName)});
StringBuffer bodyBuff = new StringBuffer();
bodyBuff.append("{")
.append(" com.google.gson.Gson gson = new com.google.gson.Gson();")
.append(" ")
.append(classMethodReturnClassType)
.append(" e = ")
.append(String.format("(%s)gson.fromJson(%s,%s.class);", classMethodReturnClassType, classMethodParameterName, classMethodReturnClassType))
.append(" return e;")
.append("}");
String src = bodyBuff.toString();
parseLicenseMethod.setBody(src);
// 对修改的文件,写出到一个新文件
ctClass.writeFile(prefix + project + folderName);
String tempJar = UUID.randomUUID() + ".jar";
String s1 = "cp " + allPathJar + " " + tempJar;
String classFlie = className.replace(".", replacement) + ".class";
String pathDir = prefix + project + folderName + replacement;
String s = "jar uvf " + tempJar + " -C " + pathDir + " " + classFlie;
String s3 = "rm " + tempJar;
System.err.println("1. " + s1);
System.err.println("2. " + s);
String name = FileUtil.getName(allPathJar);
System.err.println("3. " + tempJar + "修改名称为" + name);
System.err.println("4. " + s3);
System.err.println("5. 请将" + name + "移到到解压过的文件lib下替换 后重新压缩文件并在idea安装该zip");
System.err.println("6. 请使用离线激活 请要要求填写以下json即可 ");
LocalDateTime of = LocalDateTime.of(9999, 12, 31, 23, 59, 59);
long tolong = DateUtils.LocalDateTimeTolong(of);
System.err.println("7. " + String.format("{\n" +
" \"paidKey\": \"激活码,随便填\",\n" +
" \"valid\": true,\n" +
" \"userMac\": \"激活窗口的唯一码\",\n" +
" \"validTo\": %s\n" +
"}", tolong));
}
}
执行完方法后按照控制台提示执行即可
插件安装完成后 完成激活