一、写在前面
实现对安卓应用的抓包,主要讲述Android 7.0+的具体实现,因为大多新生app不再支持sdk6.0以下,高版本安卓(10,11)的抓包在不装有Magisk等等繁琐的操作下难以实现。
探寻过程中读到一篇文章,对计算机网络的知识讲解的十分透彻,覆盖https通信过程以及安卓底层代码的原理,文章很长但确实给了我很大的帮助,希望有兴趣的同学也能读一读。
附链接:legalwyy的法学笔记跨越Android 11监听https数据包的三道难关
二、 不同安卓版本抓包所遇到的困难
- Android5.0:无困难,但是新版app陆续不再支持。
-Android7.0以上:开始不再信任用户级别证书,需要将其放到根目录。并且app有权限绕过安卓系统本身的代理。
-Android10:引入的动态分区阻止用户将system分区挂载为可读写,无法将证书放入根目录。
-Android11:同上,趋势朝更难。
因国产厂商深度定制的原因,用Httpcanary(黄鸟)等手机抓包app依然能对其导入的用户证书添加信任,也就是说你的手机是安卓10及以下或许仍然能用抓包app进行简单抓包。还有华为的HarmonyOS截止文章发布前,最高版本基于安卓9,仍可添加信任。(玄学因素。)
安卓11凉凉透顶,必须root设备+Magisk+Trustme插件(hook)才能完美抓包,此处先按下不表,最后再说。
三、软件厂商反抓包的措施
除上面遇到的系统性的困难,各类软件厂商还想出了一些反抓包措施,又给我们增添了超级多的麻烦。
1.客户端内置根证书
2020年前后,各大软件厂商都纷纷跟进反抓包检测手段,以至于现在大厂app都将自己的证书内置在了手机软件里,在建立链接传输数据前先检测接收到的证书是否与内置根证书一致,否则直接中断链接。
确实恶心,如何解决?
我们不得不root手机,然后装上Xposed框架,再安装JustTrustMe一类的插件,才能勉强解决。
JustTrustMe原理:
基于一种Hook技术(钩子),App检测ssl证书与内置根证书是否一致时,此插件将app中检测证书的api钩住,不管一致与否,直接强行通过,类似于忽略ssl证书错误。
其中的坑:
JustTrustMe只能识别未被混淆的变量名称,一旦厂商做了混淆(容易),我们就比较难识别,也就Hook不出来了。
还好有大佬对插件做了更新,并在GitHub上开源,叫TrustMe++,使其也能识别混淆的变量。
但这并不是长久之计。
2.服务端检测
客户端验证就结束了吗?No,为数不多的厂商为了保证通信绝对安全,会在服务器端再次检测客户端证书是否一致,一旦服务端收到错误证书的Hash值,便会主动断开连接。。。
真的心累了。
我们看似是手机的主人,却发现系统在防着我们,app在防着我们,甚至远在云端的后台也在防着我们。
有解吗?
有,要看厂商采用的具体验证措施了,这意味着要进行一次超级彻底的安卓逆向工程,脱壳、去签名验证、反编译、反混淆,etc...,最后找到加密验证的源代码,然后一顿分析,试图发现证书秘钥或绕过加密,亦或想办法将正确的证书hook发给服务器。
不过现在用这条路的app比较少,但如果互联网环境继续恶化下去的话,mabye....
四、小结
抓包目前推荐方案:
- 雷电4.0X的模拟器
- 安卓7.1.2的镜像
- ProxyDroid代理软件
- Xposed框架
- Trustme++插件
- Fildder抓包工具
解释:
- ProxyDroid为代理app,因为安卓7.0 设置了wifi代理后,应用可以选择绕过系统代理。故直接用VPN代理,使所有流量都走此app。
贴个链接:Xposed安装教程
五、安装步骤:
1.安装雷电模拟器,安装Xposed框架
重启后激活完成
2.安装ProxyDroid和Trustme++
把这两个安装包拖进来即可
3.打开ProxyDroid设置代理
类型选择http即可。
4.fiddler查看
访问一下百度,不出意外的话,已经抓到了。
http和https的都能抓到。
六、疑难解答:
-
Xposed框架安装失败,请检查安卓镜像是否为X86。GitHub有墙,自行解决下载失败问题。
-
Trustme++插件安装后需重启激活,然后用了这个东西是不需要安装fiddler证书的。直接忽略ssl证书错误,如果你还是抓不到的话,也可以安装fiddler证书试试。
七、安卓5和安卓11思路:
略
本篇(暂时)完结。