Charles Web Debugging Proxy可能是最好用的网络代理,用Java写的,跨平台。用起来比Fiddler顺手很多,而且更强大。由于是Java写的,所以更容易「破解」。

对于Java反编译,jad已经过时了。强烈推荐jadx,设置好参数,几乎可以完美反编译Charles的Licence.class。

jadx setting

Licence.java是一个独立类,没有引用其他第三方文件,所以调试起来非常方便。虽然有了代码,但是想做一个「注册机」还是有难度的。各种位操作眼花缭乱,还不如直接在验证函数上返回true,然后替换原有的Licence.class更省事儿。

一下操作仅适用于3.10.1,其他版本请自行解决,方法类似。

#  0 如果已经安装了其他版本,请先移除
rm -rf /Applications/Charles.app

#  1. 下载3.10.1并安装
wget http://www.charlesproxy.com/assets/release/3.10.1/charles-proxy-3.10.1-applejava.dmg
open charles-proxy-3.10.1-applejava.dmg
cp -r /Volumes/Charles\ Proxy\ v3.10.1/Charles.app /Applications/
#  测试一下,打开试用版,确认可以打开(必选步骤)
open /Applications/Charles.app
#  现在可以退出Charles了。

#  2 替换Licence
cd /Applications/Charles.app/Contents/Resources/Java/
wget https://raw.githubusercontent.com/100apps/charles-hacking/master/Licence.java
javac -source 1.6 -target 1.6 -d . Licence.java
jar -uvf charles.jar com/xk72/charles/gui/Licence*
rm -rf com
rm Licence.java
open /Applications/Charles.app
#  此时启动的是已经注册过的版本了。

如果你不想自己DIY,可以拿我做好的charles.jar替换即可。

wget https://raw.githubusercontent.com/100apps/charles-hacking/master/charles.jar -O /Applications/Charles.app/Contents/Resources/Java/charles.jar

额外收获

研究Charles破解的过程中,学习了java的-agentpath参数。并且体会到了btrace的强大功能。

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

// @BTrace annotation tells that this is a BTrace program
@BTrace
public class HelloWorld {

    // @OnMethod annotation tells where to probe.
    // In this example, we are interested in entry
    // into the Thread.start() method.
    @OnMethod(
        // clazz="/.*\\.Licence/",
        // method="/.*/"

        // clazz="com.xk72.charles.gui.Licence",

        clazz="/com.xk72.*/",
        method="/.*/"

    )
    public static void func(@Self Object self, @ProbeClassName String pcn, @ProbeMethodName String pmn) {
        println(self+"\t"+pcn+"\t"+pmn);
    }

}

注意btrace现在的版本还不能在oracle jvm over mac上运行,可以参考:https://github.com/jbachorik/btrace/pull/128