一、写在前面

实现对安卓应用的抓包,主要讲述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框架

1

2

重启后激活完成

3

2.安装ProxyDroid和Trustme++

把这两个安装包拖进来即可
4

5

3.打开ProxyDroid设置代理

类型选择http即可。
6

4.fiddler查看

访问一下百度,不出意外的话,已经抓到了。
http和https的都能抓到。
7

六、疑难解答:

  1. Xposed框架安装失败,请检查安卓镜像是否为X86。GitHub有墙,自行解决下载失败问题。

  2. Trustme++插件安装后需重启激活,然后用了这个东西是不需要安装fiddler证书的。直接忽略ssl证书错误,如果你还是抓不到的话,也可以安装fiddler证书试试。

七、安卓5和安卓11思路:

本篇(暂时)完结。