Android7.0 抓取第三方的APP数据方案探究
问题出现
最近在分析某款软件的数据时,发现无法通过抓包工具抓取。而且只要连上代理,就算安装上了证书也无法正确的获取导数据。我以为时flidder的问题,后来尝试了多种抓包工具,都无法正确的获取到数据。
偶然测试了电脑上的模拟器,居然可以正确拿到数据。
猜想和Android版本有关系,于是一顿搜索终于找到答案。
问题原因
简单来说就是:
Android 7.0 之后,默认不再信任用户自己安装的证书,只信任系统证书。但是引入配置文件可配置相关策略。
但是如果是想抓第三方的app包,就没那么简单了。因为你不能更改别人的配置文件。
解决方案
方案1.逆向工程
参考:Android7.0无法使用Fiddler抓取HTTPS问题
这位博主的思路非常清晰,既然你不信任我的证书。我大不了反编译你,强行加上我的证书信任不就行了吗。
大概步骤如下:
-
1.首先需要使用apktool反编译APK
-
2.更改res/xml中的network_security_config.xml
<network-security-config>
<base-config>
<trust-anchors>
<!– Trust preinstalled CAs –>
<certificates src=”system” />
<!– Additionally trust user added CAs –>
<certificates src=”user” />
</trust-anchors>
</base-config>
</network-security-config>
- 3.重新打包APK安装,抓包即可
这里加上信任user域下的证书,(这个一般是在调试的时候才会信任),这里强行打开就可以达到抓包的目的。
这个方案看起来思路简单,但是实现起来颇有难度。且不说有多少人会逆向工程,就算花钱请个人来逆向。也未必能真正的打开这个开关。
先PASS这个方案。
方案2:JustTrustMe + xposed
首先这个方案是在Android 系统各个版本上https的抓包看到的,但是我没有看清楚这个方案所解决的问题。大概花了一小时折腾后发现这个方案所解决的问题不是证书信任的问题,而是证书验证的问题。
也就是JustTrustMe + xposed
这套方案是用来解决使用自签名证书的应用和双向验证的应用
而不是解决只信任系统证书不信任第三方证书的应用
这个问题。
方案失败
方案3:使用沙盒环境(VirtualApp)
这个方案同样来自Android 系统各个版本上https的抓包
包括这篇文章 https://github.com/MegatronKing/HttpCanary/blob/master/zh-CN/README.md 的 2.2中的说明
1.先下载 VirtualApp 自行编译,保证沙盒环境低于24
2.运行分身应用
3.抓取分身应用(VirtualApp )的包
方案成功,确实能事实获取到包的数据。算是一个比较完美的方案。不用root,且沙盒自带root。只是稳定性有待考验。
方案4:安装证书到系统证书目录
既然只信任系统证书,那我能不能把我的证书装成系统应用呢?
答案是可以的。
不过过程有点繁琐,而且需要root。
参考文章主要是下面两篇:
抓包分析安卓手机的HTTPS请求
BrupSuit证书导入Android7.0以上手机
我来通俗的讲一遍整个过程,因为整个步骤花了我挺多时间的。我希望后面的人可以看到这篇文章,轻松的解决问题。
1.工具:root手机一台(7.0以上) --- 特别申明 我用的红米6A
带adb 电脑一台
2.软件下载: openssl签名工具
下载后配置环境变量指定到bin文件夹即可。
3.手机软件RE文件管理器
用于把签名文件写入文件夹
4.准备 签名文件cer或者pem
用openssl工具获取hash:
最后一个参数指向文件的绝对路径
openssl x509 -inform DER -subject_hash_old -in xxx.cer
openssl x509 -inform PEM -subject_hash_old -in xx.pem
你将得到一个 8位数的hash 值和 一串以 数字
就像这样:
首先把新建一个文件命名为这个8位hash.0(如果发现写入到系统里面的时候有文件冲突,可以重新命名为xx.1/xx.2/xx.3一直加下去)
再用文本工具打开文件,写入前面除了8位hash值以外的所有代码。
5.文件导入手机,再用RE文件浏览器将文件写入/system/etc/security/cacerts/
目录下面。
文件内容查看:
6.重启即可抓包成功
总结
最后采用装系统证书方案,简单高效。证书生成一次即可用在所有设备上。