0x00 前言

发现 Mac 上的 Charles 试用到期了(虽然也没怎么用过,平时都用的 Burp Suite),但就这样删掉不太甘心,个人授权 $50 又有点贵,于是想试试能不能破解一下试用的限制。

最后发现了一个通用的破解方法,对 4.x 版的应该都没问题,最新的 Charles for Mac 4.1.3 版破解代码见 charles.4.1.3.crack.sh

0x01 初探

网上查了会儿发现已有的破解都是替换一个 charles.jar 文件,由此可以看出 Charles 是用 Java 开发的,破解的关键就在 charles.jar 这个文件中。

不过作为被害妄想症患者,使用互联网上的破解补丁是需要很大的勇气的,能不能自己做一个出来呢?

接着在 Github 上发现了一个有用的东西:charles-hacking,作者只用几行 shell 代码就完成了破解,看起来不错 :)

0x02 深入

贴一下原作者用来破解 Charles 4.1 版的 hack.4.1.sh

charles=/Applications/Charles.app/Contents/Java/charles.jar
dir=charleshack

mkdir $dir
cd $dir
cat >> GFjZ.java <<EOF
package com.xk72.charles;
public final class GFjZ {
    public static boolean VxNA() { return true; }
    public static String eSXN() { return "http://www.gfzj.us"; }
    public static String VxNA(String name, String key) { return null; }
}
EOF
javac -encoding UTF-8 GFjZ.java -d .&& jar -uvf $charles com/xk72/charles/GFjZ.class
cd .. && rm -rf $dir

可以看出修改的是 com.xk72.charles.GFjZ 这个类,至于类名为什么这么怪,估计是做了混淆的缘故。
下载作者提供的 4.1 版补丁 charles.4.1.jar,用 JD_GUI 查找一下 GFjZ 被哪些地方调用了:

4.1.main.class

很明显 GFjZ 这个类在 Charles 4.1 版中是负责 License 验证的,eSXN() 这个函数用来返回购买者的名字。

再打开 4.1.3 版的 charles.jar,直接查找关键字 Registered to: ,定位到 charles 4.1.3 版对应类名是 psPJ

4.1.3.main.class

进入 psPJ 类,部分代码如下:

  private static psPJ mLFE;
  private boolean tCiz = false;
  private String SeSn = "Unregistered";
  
  public static String tCiz()
  {
    psPJ localpsPJ = mLFE;
    switch (bJif.qIvM[localpsPJ.lvYl.ordinal()])
    {
    case 1: 
      return localpsPJ.SeSn;
    case 2: 
      return localpsPJ.SeSn + " - Site License";
    case 3: 
      return localpsPJ.SeSn + " - Multi-Site License";
    }
    return localpsPJ.SeSn;
  }
  
  public static boolean qIvM()
  {
    psPJ localpsPJ;
    return (localpsPJ = mLFE).tCiz;
  }
 
  public static String qIvM(String paramString1, String paramString2)
  {
    try
    {
      paramString1 = new psPJ(paramString1, paramString2);
    }
    catch (LicenseException localLicenseException)
    {
      return (paramString1 = localLicenseException).getMessage();
    }
    paramString1 = paramString1;
    mLFE = paramString1;
    return null;
  }

所以替换掉原脚本中的类名和函数名就 OK 了:

charles=/Applications/Charles.app/Contents/Java/charles.jar
dir=charleshack

mkdir $dir
cd $dir
cat >> psPJ.java <<EOF
package com.xk72.charles;
public final class psPJ {
    public static boolean qIvM() { return true; }
    public static String tCiz() { return "https://0x0d.im"; }
    public static String qIvM(String name, String key) { return null; }
}
EOF
javac -encoding UTF-8 psPJ.java -d .&& jar -uvf $charles com/xk72/charles/psPJ.class
cd .. && rm -rf $dir

14987479474788.jpg

Windows 下的破解类似,只是默认安装路径变成了 C:\Program Files\Charles\lib\charles.jar

0x03 参考