破解 Java 系軟件入門

由於字節碼玩的爐火純青,在工做休閒之餘,破解了一大波 Java 系軟件。最終的目標是無痛破解,這裏的無痛,指的是不須要破壞原始 Jar 包或者 War 包,就能夠達到破解目的java

下面列舉了一些折騰過的軟件git

  • 分析 GC 日誌的桌面端軟件 censum
  • 分析 GC 日誌和線程的 gceasyfastthread
  • Intellij 上 Mybatis 插件(低版本),高版本使用了代碼混淆,致使閱讀比較困難,沒有去折騰
  • ELK 鉑金版
  • 供應商的jar包對指定 Mac 地址受權,切換服務器或者切換到Docker環境之後,就沒辦法使用

工欲善其事必先利其器

下面是經常使用的一些工具github

  • 字節碼反編譯查看工具 jdgui,luyten
  • 字節碼瀏覽工具 jclasslib
  • asm(後面會專門介紹)
  • vim、hex editor

破解的幾種方式

  • 解包,直接修改 class 文件,打包

這種適用於很是簡單,改動一個常量就能夠完成的狀況vim

  • 解包,經過 asm 工具修改 class 文件,打包 適用於邏輯較爲複雜的狀況bash

  • 經過-javaagent啓動參數,動態修改(無痛破解) 前面兩種都屬於破壞了原始的 class 文件,不屬於「無痛破解」,若是要破解的軟件升級了,須要從新修改打包,很是麻煩。採用 Java agent 的方式,只用在命令行啓動參數裏面加入一行參數就能夠了。後續軟件升級了,都不用修改 agent 的源碼,很是方便,後面將會重點介紹這種方式服務器

第一個破解項目 censum

項目 censum jar 包地址放在了 github 上,使用 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

使用vim命令修改爲 08a8(2216年),回到普通模式 :%!xxd -r保存退出

而後使用zip包打包 zip -r ../censum-crack.jar . *

運行java -jar censum-crack.jarspa

能夠看到,這種方式比較麻煩,咱們會講如何不修改源 class 文件的方法來無痛破解Java系軟件,不過這以前,咱們須要學習 ASM 和 Java agent 的原理
相關文章
相關標籤/搜索