由於字節碼玩的爐火純青,在工做休閒之餘,破解了一大波 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