最近需要对安卓应用发出的网络数据进行抓包分析,除了常见的HTTP还包括MQTT协议。
本文总结归纳了。手机端抓包的各种方法和思路
在PC端抓过包的人一定不会对Wireshark感到陌生,该软件可以直接抓取流经网络适配器(网卡)的所有数据包,意味着局域网内其它主机发出的数据包也可以截获(这种模式叫作混杂模式)。此外该软件能够解析下至数据链路层,上至应用层的绝大多数网络协议。
那么在手机端如何使用wireshark进行抓包分析呢?大致的思路有两种:
把手机端的网络流量导流到PC上。在PC上直接使用Wireshark进行抓包并分析。
这种方案要求手机与PC处于同一局域网内。
可行的办法是,手机连接电脑开的热点。对于没有无线网卡的电脑,可以使用随身WIFI来创建WIFI热点
在手机端使用tcpdump抓包,然后在PC端使用wireshark分析。
tcpdump是linux上的一个命令行抓包工具。它直接在网卡抓取数据包,所以需要root权限。
具体步骤可以参考:详解使用tcpdump、wireshark对Android应用程序进行抓包并分析
Wireshark很强大,但是它在解析SSL层加密过的信息时,需要配置秘钥。
如果拥有服务器证书的私钥,那一切就很简单了。简单在wireshark的首选项中设置一下即可。
另一种方法只针对浏览器发出的HTTPS数据,Chrome和Firefox会在日志中记录会话的秘钥。
只要在系统环境变量中增加SSLKEYLOGFILE变量,重启浏览器即可。
具体实践可参考:Wireshark对HTTPS数据的解密
显然,这种方案对手机APP产生的HTTPS数据无能为力。
将手机的HTTP请求导流至代理服务器,那么便可以在代理服务器中抓取到网络数据包了.
可以使用的工具有Fiddler或者Charles
该思路的不足是,只能抓取http的数据,如果要抓取别的应用层协议,就无能为力了。
在PC端打开Fiddler作为HTTP代理服务器。
在手机端设置HTTP代理。这样就可以把手机端的HTTP流量导流只PC端。
对于HTTPS流量,可以在手机端安装Fiddler的证书。这样代理就可以解密加密的数据了
具体实践可参考:Fiddler实现手机抓包
通过SDcard安装证书的方法:Fiddler证书安装(查看HTTPS)
对于不处于同一局域网的设备,还可以使用Chrome游览器的设备远程调试功能,具体步骤如下:
这个工具是手机端的一个VPN,也相当于是一个代理。
它还可以把抓取到的数据保存为pcap格式,这样就可以在PC上使用Wireshark来分析。相比较于Tcpdump,它的好处是不需要root手机。
在实践中,并不能解析SSL加密的数据包。查资料,说是因为高版本安卓不再信任用户添加的CA证书列表。或者是客户端APP对CA证书进行了校验。总之是没法解析TLS数据。
一种解决办法是使用Xposed 插件just trust me。来跳过CA证书的校验过程。
扩展阅读:
手机抓包工具汇总
其实抓到包很容易,难的是如何解析SSL层加密的数据。
抓包的目的就是分析网络数据,如果有APP的源码,其实可以换个思路,不用在网络侧抓包,而是在代码里调用网络接口前,将数据打印出来。
注意这里的目的是获取到应用层协议的报头,而不仅仅是应用层协议的载荷。
这是一种比较野的路子,在尝试的过程中失败了。但是可以把思路写出来
利用Xposed框架,Hook网络请求的相关代码,将数据打印出来。
能够在不修改源代码的前提下,截获网络数据。
在代码里自定义一个Socket/SSLSocketFactory,对Socket进行一层包装,增加自定义的逻辑。
自定义逻辑可以是统计流量,也可以是记录。
这种思路同样可以获得应用发出的网络数据。
然后在OkhttpClient.Bulder中设置SSLSocketFactory/SocketFactory。网络库一般都会提供设置SocketFactory的方法。