欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

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,其实另外也有一个
这次是最后更新

上传的附件 detect.yml
config.yml
JetbrainsCrack.jar
MyCrackIDEA20190619.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功