由于字节码玩的炉火纯青,在工做休闲之余,破解了一大波 Java 系软件。最终的目标是无痛破解,这里的无痛,指的是不须要破坏原始 Jar 包或者 War 包,就能够达到破解目的java
下面列举了一些折腾过的软件git
gceasy
和fastthread
下面是经常使用的一些工具github
这种适用于很是简单,改动一个常量就能够完成的状况vim
解包,经过 asm 工具修改 class 文件,打包 适用于逻辑较为复杂的状况bash
经过-javaagent
启动参数,动态修改(无痛破解) 前面两种都属于破坏了原始的 class 文件,不属于「无痛破解」,若是要破解的软件升级了,须要从新修改打包,很是麻烦。采用 Java agent 的方式,只用在命令行启动参数里面加入一行参数就能够了。后续软件升级了,都不用修改 agent 的源码,很是方便,后面将会重点介绍这种方式服务器
jdgui
打开,发现没有混淆,找到
CensumStartupChecks
类,里面是判断 license 是否合法、是否过时。下面代码作了一些精简。
public class CensumStartupChecks
{
private static int getDayOfMonth() {
return 7;
}
private static int getMonthOfYear() {
return 0;
}
private static int getYear() {
return 2016;
}
public static CanLoadState canLoadCensum()
{
validateLicensing();
GregorianCalendar currentDate = new GregorianCalendar();
GregorianCalendar expiryDate = getExiryDate();
if (currentDate.after(expiryDate)) {
return CanLoadState.LICENSE_EXPIRED;
}
return CanLoadState.SUCCESS;
}
public static GregorianCalendar getExiryDate()
{
return new GregorianCalendar(getYear(), getMonthOfYear(), getDayOfMonth());
}
}
复制代码
能够看到,这个判断是否过时的方法很粗暴,直接拿当前时间与过时时间作对比,若是当前时间晚于过时时间,就返回 license 已过时。工具
要破解这个软件,一个最简单的思路就是把过时的年份2016
修改一下,改成2226
之类的。 咱们知道 jar 包本质上就是一个 zip 压缩包,咱们用 unzip 之后能够拿到全部的 class 文件学习
用 vim 打开vim -b ./com/jclarity/censum/CensumStartupChecks.class
使用 16 进制模式打开:%!xxd
搜索 2016 的十六进制(07e0) ui
08a8
(2216年),回到普通模式
:%!xxd -r
保存退出
zip -r ../censum-crack.jar . *
运行java -jar censum-crack.jar
spa