Jetbrains cracked 原理简介及 rust 版 server 介绍

前言

本文旨在为大家讲解一下 jetbrains 的 license code 的校验原理并提供一个 rust 版本的 server 代码供大家学习交流使用,主要内容为:

  1. 介绍java-agent 破解 jetbrains 的原理
  2. 介绍 rust-server 的功能

因为大佬的文章已经写的很详细了,所以我希望能画图尽量做个总结,更具体的内容请参考参考资料。如有错误,希望指出。

原理

通过此图,我们可以知道主要的校验步骤:

  1. 校验子证书是否合法
  2. 校验 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来练练手,代码写得烂,大家见谅。主要功能如下:

  1. ja-netfilter 包下载,唯一改动就是使用自己生成的证书生成 xyrz 后覆盖 power.conf,使用者可以忽略
  2. 支持插件的增量更新,每次项目启动时都会获取本地不存在的付费插件信息
  3. 支持自定义 licentseInfo提供全产品激活码及付费插件激活码
  4. 提供 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验证过程的解析,以及如何在代码中实现其中的一部分。希望这个初步的介绍可以帮助读者对其中的主要过程有所理解。

请注意, 任何未经授权解码或破解软件的尝试,都可能构成侵犯版权法的行为,读者在了解后,请遵守法律,尊重软件开发人员的权益。

参考资料

排名不分先后,但是顺序是我的参考顺序。感谢各位大佬的付出!

  1. Idea agent 激活原理
  2. RSA加密&签名
  3. 自定内容并生成Idea激活码,已废弃,请考虑自己部署
  4. 【Jetbrains License】纯Java版本地搭建,了解/学习/质疑/解决/熟悉/掌握/改造,一站式证书/Agent/ActiveCode生成
96 个赞

这个好,这个好,真就一图胜千言

6 个赞

好东西

6 个赞

马克学习

5 个赞

好东西,马克

4 个赞

666 坛佬牛蛙

4 个赞

感谢大佬!

4 个赞

好东西 mark

5 个赞

好东西

5 个赞

点个赞,mark一下。

3 个赞

mark,图好评,不过有些地方感觉有错误。

  1. 验证证书的时候,并不需要私钥参与,只需要拿根证书的公钥去解密我们生成的证书的签名,再通过SHA256之类的算法(取决证书的算法)hash一下证书除签名的部分,最后判断这两个值是否相等
  2. 验证签名的时候,同上,也不需要私钥去参与,因为证书一般只有公钥,不带私钥的。
4 个赞

好东西 :+1:

3 个赞

图解通俗易懂

4 个赞

感谢指导,我再去确认下!

2 个赞

感谢大佬!

3 个赞

厉害,大佬:+1:

2 个赞

佬,部署到render的时候跨域问题,怎么解决啊


3 个赞

render是啥子? :thinking: 你详细描述一下你的过程,我明天看看我会不会!

1 个赞

感谢分享 :+1:

1 个赞


直接用你的镜像

1 个赞