近期研究Xdea激活的总结

0x0 背景

也是无意中浏览看雪论坛发现https://bbs.kanxue.com/thread-285675.htm别人实现了一个多次试用的实现。
注意到发布者在帖子中解释是通过系统变量中的USERNAME变量的值进行匹配的(在Linux和Windows系统下)。
于是乎我也在我本地搭建一套环境来进行窥探Xdea试用注册的秘密。

0x1 基础环境

操作系统:Windows 11
Jdk Version: 21
Xdea 版本:2024.3.4
还准备了一些其他工具:
反编译工具:jadx、jd-gui
字节查看工具:jclasslib
java依赖管理工具:maven
抓包工具:fiddler

我只总结我的思路

0x0 我第一想到的突破口就是通过抓包

这个方法还是很给力,通过抓包观察发现有一个有/service***/trial?特征的一个GET请求;
通过接口名基本就能判断这是试用注册的请求。所有参数都在URL里:
productFamilyId:II
hostName:肉眼观察是一个Base64编码后的值
salt:猜测是一个当前的时间戳
ideProductCode:II
buildDate:20241113
clientVersion:20
secure:false
userName:也是经过Base64编码的值
buildNumber:2024.3.4 Build IU-243.25659.39
machineId:肉眼观察是一个UUID
productCode:II
machineUUID:疑似也是UUID

这个接口返回的数据应该是加密过的:
关键数据应该是EncodeAsset.data下的内容

0x1 既然是加密的数据那么Xdea中一定会有解密相关的操作

通过在jadx通过搜索到了EncodeAsset相关的类并且是public,那么我是否可以直接通过idea添加idea的类库来实例化这个类呢。
还别说通过new EncodeAsset();然后setdata(“***”)还真的可行;System.out.println打印这个类就能直接获取到解密后的内容了。
不过这个解密我并没有深入的跟踪。当然现在写搜索EncodeAsset相关的类感觉很容易的样子,其实我都是一个一个jar拖到jadx
中进行搜索的最终是在product.jar中发现。

0x2 接下来就来到的试用请求的参数生成了

我主要关注hostName、userName、machineId、machineUUID这几个参数是如何生成的;
其他几个参数都比较好理解,大部分都是和版本相关的信息。通过搜索这几个参数的名字
最终确定是通过一个名为ObtainAnonTrialRequest的类进行组装的;进一步跟踪到获取这些参数的
函数发现都是获取的一些静态数据(都是在Xdea启动时已经构建好的数据了),而且这几个参数的值使固定的。
观察到获取这几个数据的函数都是public,我就在idea中掉了一下测试;没想到还真能获取
不过machineUUID这个参数并没有正确打印,这里走了弯路我还以为这个参数是依赖启动时的一些东西
中间使用了asm插桩不过并没有发现生成的核心都是停留在表面,唯一值得有用的那就是发现了反射调用了一些
标准库里的函数。最终还是通过调试获取machineUUID的函数,一步一步跟踪后发现依赖了jna的native没找到导致
获取值异常了。这几个参数最终都是通过引用idea的类库直接调用相关函数获取到的,具体算法
都是通过调试函数来窥探的。

hostName跟踪生成

这个参数是machineId的值经过了加密计算后再编码成了Base64

userName跟踪生成

这个参数是System.getProperty(“user.name”)的值经过了加密计算后再编码成了Base64,和上面hostName的生成算法是一样的
只是传入的值不一样。

machinheId跟踪生成

这个参数是在PermanentInstallationID.calculateInstallationId()函数中获取的,大致逻辑是检查注册表中是否存在
user_id_on_machine的值,如果存在直接返回这个值,不存在就调用UUID.randomUUID()生成一个并且存入到注册表中。

machineUUID跟踪生成

这个参数计算比较复杂首先会读取注册表键为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography的值,如果没有
这个值,就会调用native函数进行读取硬件的ID,具体读取的啥我并没有细究;
然后将System.getProperty(“user.name”)获取到的值加上”Licensing”转换成bytes,再交给了sha256,这个sha256算法
我没有细究是否是魔改过的,因为我是直接将反编译的代码复制过来测试的并且能够良好工作;最后是将sha256生成的结果
给UUID.nameUUIDFromBytes()进行了计算后得到了machineUUID。

0x3 最后总结

在看雪发布者提供的网站中生成的内容发现Windows会修改PermanentUserId文件的内容,但是经过我的测试就算生成新的用户名
获取到的lincese不修改这个文件也是可行的,我是直接修改了user.name中获取的用户名来实现的(通过修改idea启动参数-Duser.name=**来实现的);目前工作良好。