首页
论坛
专栏
课程

[原创]IDEA 2019.1版本的破解文件JetbrainsCrack.jar分析

2019-5-28 16:35 15360

[原创]IDEA 2019.1版本的破解文件JetbrainsCrack.jar分析

2019-5-28 16:35
15360

0x1, 原因:

从网上找到IDEA的破解文件,好像各个版本都进行了保护处理,但是确实想了解它的实现,主要是关心它打补丁的类和对应处理,所以整理一下。
对应分析版本见附件,分析如下。

0x1.1, 反混淆:

这个jar文件从逆向的结果看应该是做了字符加密和混淆,考虑看是否可以反混淆:

λ **java -jar deobfuscator-1.0.0.jar --config detect.yml**
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - Loading classpath
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - Loading input
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - Detecting known obfuscators
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator -
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - RuleSuspiciousClinit: Zelix Klassmaster typically embeds decryption code in <clinit>. This sample may have been obfuscated with Zelix Klassmaster
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator -    Found suspicious <clinit> in fuck_the_regulations/ce
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - Recommend transformers:
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator -    None
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator -
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - RuleEnhancedStringEncryption: Zelix Klassmaster has several modes of string encryption. This mode is similar to the simple mode, but adds an additional layer of decryption by calling a method with signature (II)Ljava/lang/String;
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator -    Found potential enhanced string encrypted class fuck_the_regulations/dF
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator - Recommend transformers:
[main] INFO com.javadeobfuscator.deobfuscator.Deobfuscator -    com.javadeobfuscator.deobfuscator.transformers.zelix.string.EnhancedStringEncryptionTransformer
λ **java -jar deobfuscator-1.0.0.jar --config config.yml**

从上面的信息可以知道是使用了ZKM(Zelix Klassmaster)工具处理保护,所以配置对应的transformers:
由于支持有限,可以进行字符解密,得到了没有字符加密的jar文件。

0x1.2代码分析:

通过Manifest.mf中的配置信息,定位premain为Premain-Class: fuck_the_regulations.fN :
premain()
+-ew.main() # 作者信息打印
+-bk.b(instrumentation) # 重点分析
作者信息字符串:

System.out.print("\n\n ====================================================\n 
                 =======        Jetbrains License Crack       =======\n 
                 =======           https://zhile.io           =======\n ====================================================\n\n 
                 @See: https://zhile.io/2018/08/17/jetbrains-license-server-crack.html\n\n 
                 @Version: 2.0.1, @Build Date: 2019-04-03\n\n\n");

调用处理函数:

         public static void b(final Instrumentation instrumentation) {
             final int[] b = b();
             try {
                 try {
                     aP.a("jetbrains-license-server", InetAddress.getByName("v2.wowchina.me").getHostAddress());
                 }
                 catch (Exception ex4) {}
                 final StringBuilder sb = new StringBuilder("fuck_the_regulations.c0");
                 sb.reverse();
                 instrumentation.addTransformer((ClassFileTransformer)Class.forName(fa.a(sb.reverse().toString())).getDeclaredConstructor((Class<?>[])new Class[0]).newInstance(new Object[0]));
             }
                    ......
         }

可以看到字符串已经解密了,对于javaagent的关键代码应该是addTransformer操作,从上面的字符串信息应该在fuck_the_regulations.c0处理。
找到对应的fuck_the_regulations.c0:
transform函数就是进行破解修改的核心函数,它的原型:
public byte[] transform(final ClassLoader loader, final String className, final Class<?> classBeingRedefined, final ProtectionDomain protectionDomain, final byte[] classfileBuffer)
至此对这个破解文件中的热代理修改就清楚了,通过查找类sun/security/rsa/RSASignature和sun/net/www/protocol/https/Handler,再定位到修改类,调用javaassist进行代码更新.

关键jar中的类信息,进行混淆关键代码还原:

通过和javassist的代码分析:
bN ===> javassist.CtClass
aO ===> javassist.ClassPool
dd ===> javassist.CtField
dc ===> javassist.CtConstructor
dL ===> javassist.CtBehavior ###
dH ===> javassist.CtNewMethod

0x1.3 破解调试:

在配置了对应的javaagent参数后,开始进行激活,同时监控idea发送的数据包信息:
1,PING
/rpc/ping.action
2,获取证书信息:
/rpc/obtainTicket.action
因此从这个分析中,它会配置激活服务器:http://jetbrains-license-server,上面的代码中有一处对应处理:

 aP.a("jetbrains-license-server", InetAddress.getByName("v2.wowchina.me").getHostAddress());

通过分析数据抓包,上面的两个请求目标IP为:47.88.242.176 ,但是这个地址是w2.wowchina.me的DNS解析结果,原来上面的这句操作是动态更新JVM的DNS缓存,基本就是自动修改hosts文件吧。
另外,测试服务器请求:

http://47.88.242.176/rpc/obtainTicket.action?buildDate=20190326&buildNumber=2019.1.2+Build+IU-191.7141.44&clientVersion=6&hostName=hangzhou.wawaha&machineId=6d244116-d184-4219-asdf-dac34567890c&productCode=49c202d4-ac56-452b-bb84-735056242fb3&productFamilyId=49c202d4-ac56-452b-bb84-735056242fb3&salt=1559706767295&secure=false&userName=wawaha&version=2019100&versionNumber=2019100

就不上结果了,可以自己测试,会返回一个XML格式结果。
同时,因为IDEA又更新了2019.1.3,作者5.29号又更新了文件,这次使用了新的加密,上面的反混淆不太好用了,不过作者没有重写逻辑,应该是做了适应Patch修改,其实关健字符串通过手工添加println的方式输出就OK了,因为加密都是静态变量,附件代码补充了新的版本的破解信息,不过没有测试和完成,有兴趣的同学可以交流继续,本文只是学:
1, 了解反混淆;
2, 分析了反混淆框架deobfuscator;
3, 了解了字节码,在最新的版本中,通过Recaf直接给字节码插入打印语句,输出结果还是比较好玩的,不需要那么费事。
4, TODO:附件代码测试可以破解2019.1.2 版本,但是依赖作者的认证服务器:v2.wowchina.me,不过发现作者在做服务器发现的时候,能自动填上,不太清楚怎么做的,没有去找代码分析了。

0x2, 分析结论:

从上面的处理中,应该包括两部分:
1,需要认证服务器: 网上有一些版本的代码;没有测试,从返回的认证XML内容估计逻辑差不多。
2,处理授权,通过替换Public Key.
3,处理在线验证,通过对“sun/net/www/protocol/https/Handler”解决。
4,其实另外也有一个作者:rover12421作了一个本地颁发激活码的方式,不过他的jar真恶心,全是不可见字符的混淆,不和他磕了,查找他早期的keygen, patch还是有不少内容的,有他们及时更新就OK了。
这次是最后更新



[招生]科锐逆向工程师培训(3月6日远程教学班首开特惠, 第37期) !

最后于 2019-12-26 09:30 被nevinhappy编辑 ,原因: Upload My Source code .
上传的附件:
最新回复 (14)
UzJu 7 2019-5-28 16:45
2
0
周癫 2019-5-28 16:53
3
0
nevinhappy 2 2019-6-5 18:59
4
0
更新了测试代码,算是结束了,这个作者的思路和其它在码云上找到的版本还有一些不同,学习了一把。
nevinhappy 2 2019-6-19 19:24
5
0
整了这么久,怎么没人出来提点啥? 哪怕说上次提供的代码不能用也行!!!
zpob 2019-6-19 20:17
6
0
不错啊,还差生成证书自签就完整了
nevinhappy 2 2019-6-20 09:04
7
0
已经有参考了,估计需要按版本区分验证算法和生成公、私钥就可以了。
https://gitee.com/zrla/JetBrains-License-Server
kalikaikai 1 2019-6-20 12:00
8
0
感谢分享思路 
kyleo 2019-6-22 15:57
9
0
感谢楼主!!
最后于 2019-6-22 16:16 被kyleo编辑 ,原因: 无
MrChuck 2019-12-26 00:03
10
0
0x1.1, 反混淆 执行下面的命令后
java -jar deobfuscator-1.0.0.jar --config detect.yml 
没有生成 jar,是为何?
nevinhappy 2 2019-12-26 09:28
11
0
MrChuck 0x1.1, 反混淆 执行下面的命令后 java -jar deobfuscator-1.0.0.jar --config detect.yml 没有生成 jar,是为何?
进行反混淆有两步,第一步是使用detect.yml,进行混淆探测,通过查看探测到的信息,进行反混淆transformer的配置;第二步,通过配置后的config.yml,再生成反混淆后的结果。
MrChuck 2019-12-26 22:13
12
0
nevinhappy 进行反混淆有两步,第一步是使用detect.yml,进行混淆探测,通过查看探测到的信息,进行反混淆transformer的配置;第二步,通过配置后的config.yml,再生成反混淆后的结果。
多谢
kekeY 2020-1-6 11:49
13
0
所以作者的认证服务器挂了, 那些激活码都没用了。 如果有本地的更好
git_57087fredrik93-tech 2020-1-11 23:47
14
1
The line
       aP.a("jetbrains-license-server", InetAddress.getByName("v2.wowchina.me").getHostAddress());
resolves v2.wowchina.me and adds the ip to java hosts file associating the simbolic name jetbrains-license-server

It modifies
       sun.security.rsa.RSASignature.engineInitVerify(java.security.PublicKey p)
adding
       private static final PublicKey __k_joca;
    private static final PublicKey __k_jnca;
    private static final PublicKey __k_loca;
    private static final PublicKey __k_lnca;
    private static final BigInteger ______e=new BigInteger("65537");

 try{
       __k_joca=KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger("<JetProfileCAModulus>"),______e));
       __k_jnca=KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger("<FakeJetProfileCAModulus>"),______e));
       __k_loca=KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger("<JetbrainsModulus"),______e));
       __k_lnca=KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(new BigInteger("<FakeJetbrainsModulus>"),______e));
       } catch(Exception e){
               throw new RuntimeException(e);
       }
       if($1.equals(__k_joca))
               $1=__k_jnca;
       else if($1.equals(__k_loca))
               $1=__k_lnca;
       
So here is the key replacement.
       
There are two other transformers that are similar among them but seems that are not used:
       fuck_the_regulations.eQ
       fuck_the_regulations.Y
       
Seems that xml response contains a comment with signature and fake certificate that should pair with server fake private key.
jon1scr 2020-1-15 21:27
15
0
https://bayfiles.com/d0d7S5Mcna/jetbrains-agent-latest_zip
游客
登录 | 注册 方可回帖
返回