游客发表
抓包这件事,在Android上从来不是点一下按钮就能搞定的。我见过太多人卡在“证书装上了但抓不到HTTPS”这一步,然后开始怀疑人生。问题出在Android 7.0之后,系统不再信任用户安装的CA证书——你的Charles证书装是装了,App根本不认。
先解决这个。最直接的办法是root手机,把证书塞进系统证书目录。具体操作不复杂:导出Charles的.pem文件,算出hash值,改名成hash.0,push到/system/etc/security/cacerts/,改权限644,重启。但root本身就有门槛,而且现在很多手机解锁BL都费劲。另一条路是用VirtualXposed或者太极这类框架,配合JustTrustMe模块绕过SSL Pinning。我用过一段时间VirtualXposed,说实话不太稳定,偶尔会闪退,但胜在不用root。
如果你只是抓自己开发的App,那最简单——在network_security_config.xml里加一行<debug-overrides>信任用户证书就行。但现实是大多数人想抓的是别人的App,比如某个电商或者社交软件。
工具选择上,Charles和Fiddler Classic是老牌选手,界面成熟,但Charles要收费,Fiddler Classic只支持Windows。我最近更常用mitmproxy,命令行界面,写脚本方便,配合Python做流量分析很顺手。HttpCanary在手机上直接跑,不用连电脑,适合快速排查,但免费版有广告。
抓包过程中最烦的是SSL Pinning。有些App不只验证证书链,还把证书公钥硬编码在代码里。JustTrustMe能干掉大部分基于OkHttp和TrustManager的校验,但遇到Flutter或者自定义Native层的校验就歇菜。这时候得上Frida,hook掉SSL_write或者直接改内存里的证书校验逻辑。我去年抓一个Flutter App,JustTrustMe完全没反应,最后用Frida脚本hook了BoringSSL的SSL_CTX_set_custom_verify才搞定。
还有个坑是代理检测。有些App会检查系统代理设置,发现走了代理就直接断网或者返回假数据。解决办法是用iptables把流量重定向到透明代理,或者用VPN模式抓包。Packet Capture就是VPN模式,不用设代理,但只能抓HTTP/HTTPS,而且需要装它的CA证书。
说个具体案例。之前帮朋友分析一个跑步App的轨迹上传接口,Charles连上后发现所有请求都是加密的二进制数据。看Content-Type是application/octet-stream,不是常规的JSON。用mitmproxy的脚本把body dump出来,发现是protobuf序列化后的数据。找到对应的.proto文件反序列化,才看到经纬度、时间戳这些字段。整个过程花了快两个小时,大部分时间在猜数据格式。
抓包本质上是和App开发者博弈。他们加一层校验,你就得找对应的绕过方法。没有一劳永逸的方案,每个App都可能不一样。我现在的习惯是先用HttpCanary快速看能不能抓到明文,不行再上Charles+JustTrustMe,还不行就Frida伺候。三层下来,90%的App都能搞定。剩下的10%,要么放弃,要么去逆向so文件——那是另一个故事了。
最后提醒一句:抓包拿到的数据别乱传,尤其是涉及用户隐私的接口。技术本身中立,怎么用看人。
友情链接