前言
本文旨在为大家讲解一下 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验证过程的解析,以及如何在代码中实现其中的一部分。希望这个初步的介绍可以帮助读者对其中的主要过程有所理解。
请注意, 任何未经授权解码或破解软件的尝试,都可能构成侵犯版权法的行为,读者在了解后,请遵守法律,尊重软件开发人员的权益。
参考资料
排名不分先后,但是顺序是我的参考顺序。感谢各位大佬的付出!
- Idea agent 激活原理
- RSA加密&签名
- 自定内容并生成Idea激活码,已废弃,请考虑自己部署
- 【Jetbrains License】纯Java版本地搭建,了解/学习/质疑/解决/熟悉/掌握/改造,一站式证书/Agent/ActiveCode生成
|