前言
本文旨在为大家讲解一下 jetbrains 的 license code 的校验原理并提供一个 rust 版本的 server 代码供大家学习交流使用,主要内容为:
- 介绍java-agent 破解 jetbrains 的原理
- 介绍 rust-server 的功能
因为大佬的文章已经写的很详细了,所以我希望能画图尽量做个总结,更具体的内容请参考参考资料。如有错误,希望指出。
原理
通过此图,我们可以知道主要的校验步骤:
- 校验子证书是否合法
- 校验 license_info 是否合法
由于我们的子证书是肯定不合法的,所以我们只能自己生成证书,然后通过类似 java 的 bytebuddy库 的字节码技术来拦截 jetbra 的这一步校验,使其直接使用我们的证书并返回我们希望的结果(公钥解密 LicenseInfo-签名),如下图:
其关键代码示例如下:
public class MyAgent {
public static void premain(String agentArgs, Instrumentation inst) throws Exception {
System.out.println("premain");
AgentBuilder agentBuilder = new AgentBuilder.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
.with(AgentBuilder.TypeStrategy.Default.REDEFINE)
.ignore(ElementMatchers.nameStartsWith("net.bytebuddy."));
// 证书验证需要调用oddModPow,这里检测到后直接重定向导自己写的 BigIntegerAdvice类中
agentBuilder.type(ElementMatchers.named("java.math.BigInteger"))
.transform((builder, typeDescription, classLoader, module, protectionDomain) -> builder
.visit(Advice.to(BigIntegerAdvice.class)
.on(ElementMatchers.named("oddModPow"))))
.installOn(inst);
}
}
public class BigIntegerAdvice {
@Advice.OnMethodExit
public static void intercept(
@Advice.This Object x,
@Advice.Argument(0) Object y,
@Advice.Argument(1) Object z,
@Advice.Return(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object result) {
String x_target = "x_target 的值是一个很大的数字,此处代表子证书签名的值";
String y_target = "65537:固定值,模数,参考参考资料中的 rsa加密算法";
String z_target = "z_target 的值是一个很大的数字,此处代表内置根证书公钥的值";
String r_target = "r_target 的值是一个很大的数字,此处代表子证书用公钥解密LicenseInfo-签名后的值";
// 因为要进行校验肯定需要根证书公钥、模数和子证书签名,这里的几个 if 则可以断定这是在进行 license_code 的校验
if (x.equals(new BigInteger(x_target))){
if (y.equals(new BigInteger(y_target))){
if (z.equals(new BigInteger(z_target))){
result = new BigInteger(r_target);
}
}
}
}
}
至此,原理部分结束。
jetbra-server-rust
最近,我正在学习rust,所以用rust来练练手,代码写得烂,大家见谅。主要功能如下:
- ja-netfilter 包下载,唯一改动就是使用自己生成的证书生成 xyrz 后覆盖 power.conf,使用者可以忽略
- 支持插件的增量更新,每次项目启动时都会获取本地不存在的付费插件信息
- 支持自定义 licentseInfo提供全产品激活码及付费插件激活码
- 提供 docker 镜像
功能很简单,一张图足以看出全部:
按照步骤操作即可。
项目包:jetbra-server-rust.zip (908.4 KB)
同时项目也支持 docker 部署,本地可以进入 rust 项目的根目录执行如下命令生成镜像并启动:
docker build -t jetbrains-cracked-rust .
docker run -d -p 8000:8000 --name jetbrains-cracked-rust-container jetbrains-cracked-rust
我将镜像打包到了docker hub,你也可以拉取 docker hub 中的镜像来启动(就是不知道这个有风险不):
docker pull ohyoungmachine/jetbrains-cracked-rust
然后打开 http://localhost:8000 即可。
总结
以上就是JetBrains的license_code验证过程的解析,以及如何在代码中实现其中的一部分。希望这个初步的介绍可以帮助读者对其中的主要过程有所理解。
请注意, 任何未经授权解码或破解软件的尝试,都可能构成侵犯版权法的行为,读者在了解后,请遵守法律,尊重软件开发人员的权益。
参考资料
排名不分先后,但是顺序是我的参考顺序。感谢各位大佬的付出!