声明:本文所讲内容只用于学习相关技术,勿用于其它用途

最近在帮人写一些自动签到的脚本,涉及到了在安卓7.0+系统中如何对 app 和微信小程序进行抓包的问题。这里记录一下有效的抓包方案。

众所周知,不管是用 httpCanary、Fiddler 还是其它工具对手机进行抓包,都需要在手机上安装这些工具提供的根证书。但安卓从7.0版本开始已经不再信任用户自己安装的证书 —— 你仍然可以安装,但证书不会起作用,典型表现就是在开启抓包工具的情况下,被抓包的 app 是处于断网状态的。那么如何解决这个问题呢?有下面的方案可供选择:

root

究其根本,不能抓包是因为系统不信任用户证书,那么只要想办法将用户证书放到系统证书目录下,证书就可以被当作系统证书而得到信任了。但这个操作的前提是手机需要 root,这样才能操作系统证书目录。而 root 有一定的风险,所以 pass。

虚拟空间 + httpCanary

有很多 app 可以实现在手机中开辟虚拟空间。

(1)VMOS pro:可以在手机中开一个虚拟机,而这个虚拟机是很容易 root 的,对其 root 后将目标应用导入并安装证书,最后在真机中用 httpCanary 抓包即可。但实际下载 VMOS pro 之后,由于 rom 一直下不来,导致连应用都没进去,遂放弃。

(2)平行空间:可以在谷歌商店下载,它不支持导入 64 位应用,所以还得下载一个 64 bit support 补丁。平行空间应用的版本必须适配 httpCanary 的版本,否则还是无法抓包,而 httpCanary 虽然内置了对应版本的平行空间下载入口,但点击下载始终没有反应。最终,在我终于找到版本适配的 httpCanary 和平行空间,并且也成功进入目标应用之后,仍然还是遇到了抓包断网的问题,于是也只能放弃。

(3)VirturalXposed + justTrustMe:还是类似的应用,justTrustMe 模块的作用是禁止在虚拟空间中运行的 app 进行证书校验,所以自然也就不存在证书信任问题。但我将目标应用导入 VirturalXposed 之后,发现应用一打开就闪退,所以这个方法也不行,只能放弃。

反编译

对应用的 apk 文件进行反编译,修改其中的配置,让用户自己安装的证书被信任。由于我不是专业搞安卓的,同时这个方案要求第三方的开发者没有采取防止反编译的措施,所以 pass。

安卓模拟器 + Fiddler

没错,模拟器不仅能用来打游戏,也能用来抓包,而且这个方案出奇奏效。

还是回到最开始的问题,我们需要的其实只是一台低版本的安卓机,或者高版本但是能操作系统证书目录的安卓机,这样就无需担心证书问题 —— 而模拟器刚好都能满足这两个条件。考虑到目标应用无法在低版本安卓中运行,所以我在模拟器中使用的版本是安卓7.0,因为在模拟器中操作证书目录非常简单,所以版本高低也不是问题,有没有 root 更不是问题。下面讲一下关键步骤。

1)下载夜神模拟器,将目标应用的 apk 文件拖入到模拟器中安装,确保可以正常打开

2)将 Fiddler 的根证书 FiddlerRoot.cer 导出(高版本安卓拒绝超过两年有效期的证书,为了以防万一,可以用 Fiddler CertMaker 生成新的证书导入到 Fiddler 中,再导出来)

3)下载 64 位的 openssl,并将 openssl 的 bin 目录配置为系统环境变量。接着命令行执行如下操作。

将 cer 证书转化为 pem 证书:

openssl x509 -inform DER -in C:\Users\Chor\Desktop\FiddlerRoot.cer -out C:\Users\Chor\Desktop\FiddlerRoot.pem

获取 pem 证书的哈希值:

openssl x509 -inform PEM -subject_hash_old -in C:\Users\Chor\Desktop\FiddlerRoot.pem

使用哈希值重新命名 pem 证书:

ren C:\Users\Chor\Desktop\FiddlerRoot.pem abcdefgh.0

4)将证书 abcdefgh.0 转移到目录 C:\Users\Chor\Nox_share\ImageShare 下,这样证书就位于模拟器中了。

5)使用模拟器自带的文件管理器,打开 Pictures 目录,将证书 abcdefgh.0 转移到系统证书目录 system/etc/security/cacerts 中。这样,这个证书就成为了一个被信任的系统证书。

6)现在这个证书还不是可读的,所以需要修改证书的读写权限。而文件系统本身也是只读的,所以还得先解除系统的只读状态。如下:

su
mount -o remount,rw /system
cd /system/etc/security/cacerts
chmod 777 abcdefgh.0

这样,证书就有了最高读写权限,而且在系统设置中也可以看到这个证书。

7)电脑连接 wifi 或者手机热点,通过 ipconfig 获取 WLAN 的 IPv4 地址,同时 Fiddler 开放 8888 端口。此时,充当手机的模拟器和电脑位于同一网络,进入模拟器的网络设置界面,手动设置网络代理,将代理服务器地址设置为前面的 IPv4 地址,端口设置为 8888。这样,模拟器中收发的数据包就会经过 Fiddler 这个中间代理服务器。

8)所有准备工作都已经完成了,接下来在模拟器中打开目标应用,然后到 Fiddler 中愉快抓包吧~

小程序如何抓包?

前面介绍的都是对安卓 app 进行抓包,那么怎么对小程序抓包呢?这里提供三种方法:

(1)安卓模拟器 + Fiddler:

基本步骤和前面介绍的差不多。需要注意的是,我们的用户证书只是被系统信任了,还没有被微信信任 —— 微信 7.0+ 版本不会信任用户证书,它有自己的一个证书列表。如果要抓包,我们必须下载 7.0 以下的微信并导入到模拟器中,或者在模拟器中使用 7.0 以下的安卓系统,这样就可以无视微信版本。

(2)VirturalXposed + justTrustMe + 抓包工具:

基本步骤和前面介绍的差不多。虽然某些应用导入 VirturalXposed 之后无法打开,但微信不会,这个方法针对微信小程序是实测有效的。

(3)电脑端微信小程序 + Fiddler:

最简单的方法,不过最近小程序的架构升级了,所以在使用这个方法之前需要先进行额外的工作。打开任意一个小程序,在任务管理器中定位到微信小程序的进程,右键打开所在目录,然后跳转到 WMPFRuntime 文件夹。关闭微信,将整个 WMPFRuntime 文件夹删掉,然后重新打开微信并进入目标小程序,这时候发现 Fiddler 可以成功抓包了。

微信公众号如何抓包?

微信公众号的抓包只需要在 PC 端微信客户端操作即可,要点是必须使用微信内置浏览器打开公众号链接(其它浏览器无法打开公众号)。

参考文章:

Android 7.0+模拟器Fiddler抓包详细教程