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
被哪些地方调用了:
很明显 GFjZ 这个类在 Charles 4.1 版中是负责 License
验证的,eSXN()
这个函数用来返回购买者的名字。
再打开 4.1.3 版的 charles.jar,直接查找关键字 Registered to:
,定位到 charles 4.1.3 版对应类名是 psPJ
。
进入 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
Windows 下的破解类似,只是默认安装路径变成了 C:\Program Files\Charles\lib\charles.jar
。
好一个被害妄想症患者,自己动手学一技能丰衣足食。
让我想起此前用Frida来Hook关键函数,绕过检测。
加油~
厉害厉害~
—— 来自想玩移动安全但懒死了的 Web 狗