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