本文主要用于介绍我们在常规App抓包过程中遇到的各种问题以及解决方案
现阶段关于App抓包使用的较多的软件有以下两个:
Fiddler
下载地址
使用教程
Charles
下载地址
使用教程
在App抓包过程中常见有以下几类问题:
1.App正常运行,但是抓包工具中没有对应的请求记录
2.App部分正常运行或不能正常运行,抓包工具中对应的请求记录标记为失败,且报网络错误
3.App不能正常运行,报请求失败或网络错误
下面来对这些问题进行一一解决。
这个问题有两种可能性:
1、该App不使用传统Http/https协议进行网络通信,而使用一些底层协议或自定义协议进行网络通信,因此抓不到包,目前常见的有QUIC和Spdy协议。
2、App运行于无代理模式,因此我们的抓包代理抓不到数据包。
分析
我们常规抓包工具的原理是设置一个代理服务,然后手机里的http这类底层库主动识别到了系统代理的变化,然后主动去连接的代理服务器,后面的请求都会直接发往代理服务器。但是在非HTTP/HTTPS协议场景下,其会无视系统代理的设置。
解决方案
目前遇到这种情况,一般是使用App自带属性,我们关闭其相关底层协议的功能,让其强行走Http/Https协议进行网络通信。
参考:https://bbs.pediy.com/thread-267274.htm
分析
在App开发过程中,开发人员通过配置,让当前App运行于无代理模式,常见的Okhttp设置代码如下:
在无代理模式下任何请求都不会走代理,而我们的抓包软件原理又是通过设置代理来对数据请求进行抓取的,因此不能够在抓包软件上看到对应的请求记录。
解决方案
现阶段我们用的较多的是通过安装Drony应用来解决这一问题
Drony下载地址
使用也非常简单,方法如下:
1、打开Drony,并右滑至SETTING标签页,选择Networks,点击当前在用的wifi名,进入Network details设置页
2、点击Proxy type,选择manual(手动)
3、点击Hostname,输入当前电脑的局域网IP,比如192.168.1.123
4、点击Port,输入抓包软件的端口号,比如8888
5、点击Filter default value,选择Direct all
6、点击Rules,进入Rules详情页,点击右上角的加号,进入Add filter rule,action选择Local proxy chain,Application选择需要抓包的应用,然后保存,返回主页
7、左滑到LOG标签页,点击底部到OFF按钮,启用Drony,同时确保Drony进程在后台不会被杀掉
问题分析
这一问题多在安卓7.0及以上版本手机抓Https包时出现,这主要是因为手机安卓7.0及以上版本我们抓包软件安装在手机上的证书不被系统层面所信任
解决方案
解决方法也比较简单,只需要把抓包软件安装在手机的证书从用户层面提升到系统层面即可,相关教程如下:
https://blog.csdn.net/weixin_43900244/article/details/111909176
这个问题在对如今主流App分析中都会遇到,主要也是出现在对Https请求进行抓取的过程中,多是由于Https证书校验不通过所导致的。这里与上一点可能会有重叠的情况,因此如果出现该情况首要就是把系统级证书装好。下面先对Https证书校验进行一个简单的介绍。
Https请求介绍
首先看一下Https请求的建立过程:
单向认证: 核心在于客户端要对服务端证书进行校验,客户端使用服务端公钥加密通讯密钥,该通讯密钥用于后续的数据来往。
双向验证: 核心在于客户端要对服务端证书进行校验,且服务端也要对客户端证书进行校验,客户端使用服务端公钥加密通讯密钥,服务端使用客户端公钥加密所选的对称加密方法,使其更为安全。
上面所写的单向认证和双向认证都会导致App不能正常运行,报请求失败或网络错误的问题,下面首先来说一下单向认证。
上面介绍到,单向认证其本质就是客户端存在对服务端证书的校验逻辑,而关于单向认证的具体实现又分为以下两种情况:
证书锁定(Certificate Pinning)
需要在客户端代码内置仅接受指定域名的证书,而不接受操作系统或浏览器内置的CA根证书对应的任何证书,通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此客户端与服务端(例如API网关)之间的通信是可以保证绝对安全。但是CA签发证书都存在有效期问题,缺点是证书续期后需要重新内置到APP中
公钥锁定(Public Key Pinning)
提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。制作证书密钥时,公钥在证书的续期前后都可以保持不变(即密钥对不变),所以可以避免证书有效期问题,一般推荐这种做法。
解决单向认证主要有以下两种方法:
找到证书校验的代码逻辑,对相关校验代码逻辑进行覆盖或者修改(非root)
关于如何找到证书校验的代码逻辑,大概有两种方法:
对于相关校验代码逻辑的覆盖或修改,大概有两种方法:
Xposed框架+JustTrustMe 绕过(root)
Xposed(Xposed安装)
Xposed框架是一款开源框架,其功能是可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。Xposed 就好比是 Google 模块化手机的主体,只是一个框架的存在,在添加其他功能模块(Modules)之前,发挥不了什么作用,但是没了它也不行。也正因为如此,Xposed 具有比较高的可定制化程度。Moto X 用户可定制手机的外观、壁纸、开机动画等,Xposed 则允许用户自选模块对手机功能进行自定义扩充。
JustTrustMe(JustTrustMe模块下载)
JustTrustMe 一个用来禁用、绕过 SSL 证书检查的基于 Xposed 模块。简单来说,JustTrustMe 是将 APK 中所有用于校验 SSL 证书的 API 都进行了 Hook,从而绕过证书检查。``
关于SSL pinning最后补充一下,目前大部分APP的校验都放在Java层,但是现在有少数校验放在Native层校验的,这种情况下需要去进行so文件的动态调试来查找出校验的方法,然后进行方法拦截修改或者直接修改ARM代码,因此遇到Native层做SSL pinning的解决起来会十分麻烦!有兴趣可以去了解下flutter的证书校验。
关于双向认证主要卡住的地方是服务端校验客户端证书出现问题,解决方案有两个思路:
1、查找.p12证书文件以及相关的证书密码, 然后把该证书安装到抓包工具中即可。
2、App运行时如果使用到双向认证则必定有打开打开证书的过程,打开证书会调用相关的方法,我们直接hook这些方法拿到证书并且保存到我们的本地文件中,然后安装到抓包工具中即可。
将证书文件装入抓包工具
1、找到client.p12文件
对于client.p12文件,我们直接解压Apk文件,然后在assets文件夹中直接拿就可以了
2、找证书密码
对于证书密码查找,一般是直接使用jadx等工具查看Apk源码,然后全局搜索client.p12、PKCS12、client.cer等等关于证书验证的关键字,然后查看这些关键字的调用情况,找到加载证书时用到的密码。
3、使用.p12证书文件和上一步找到的密码将证书安装到抓包工具中
证书Dump
主要是通过hook KeyStore来获取相关证书,hook可以使用xposed也可以使用frida
详情可以参考http://91fans.com.cn/post/socialsignone/
最后总结一下,在抓包过程中会遇到很多奇奇怪怪的问题,上面罗列的可能只是比较典型的几种情况,现在大的趋势是基于UDP来自定义通信协议,以后抓包只会更难。
参考文章:
https://www.cnblogs.com/woaixuexi9999/p/9247705.html
https://www.cnblogs.com/hongyankuang/p/9961284.html
https://bbs.pediy.com/thread-267274.htm
https://blog.csdn.net/weixin_43900244/article/details/111909176
https://www.cr173.com/soft/170920.html
https://www.jianshu.com/p/ada10d2976f2
http://91fans.com.cn/post/socialsignone/