前言
目前存在的安卓抓包方法有很多,例如Fiddler、Charels、Packet Capture、tcpdump,其各存在一定的优缺点。
- Fiddler、Charels利用电脑,利用代理的方式的方式进行抓包,其要依赖于电脑,只能在WIFI环境下运行,代码不开源。
- tcpdump 需要root,并且数据包分析复杂,一般需要使用到第三方分析工具,没法解析https。
- Packet Capture 利用安卓vpn的方式进行抓包,无需root,可以分析https包内容。解析文件不可以下载,代码不开源。
- AndroidHttpCapture利用手机本地代理的方式进行抓包,无需root,可以分析https包内容。可以下载解析文件,代码开源。缺点是需要在wifi环境下操作。
综述,目前存在的抓包工具或多或少都存在一定的缺点,其中最好用的是PacketCapture。本项目参照PacketCapture,提供和PacketCaptrue基本类似的交互体验,但是有远比PacketCapture强大的包解析功能,能够解析GZIP、PNG、JPEG、GIF等各种格式的包,并且提供保存解析后的包内容的功能,支持https,代码开源。
方案设计
本方案主要参考Firewall,http抓包流程图:
packetcapture-2-4.jpg在流程开始前需要打开VPNService,并在本地新建ServerSocket。
以上流程的步骤说明:
1.被代理的Local Socket发起网络请求,由于打开了VPN接口,网络IP包被转发到了虚拟网卡上。
2.VPNService被打开之后获得了虚拟网络的文件地址,从文件上读取IP包。本步骤和步骤14其实是一个同一个动作。
3.解析IP包,获得其源端口,通过源端口判断此IP包是由Local Socket还是Local Tunnel,如果是由Local Socket发出的则修改了目标IP和目标端口为本地建立的ServerSocket的IP和端口,并将源IP修改成需要目标的IP,合成新包,并建立Session,保存此链路的源端口、目标IP,目标端口。如果是由Local Tunnel发出来的则进行步骤16。
4.将新包写在虚拟网络的文件地址上。
5.新的Ip包被转发到由ServerSocket所建立的LocalTunnel上。
6.LocalTunnel将其保存到请求容器中。请求容器由ConcurrentLinkedQueue来实现。
7.与LocalTunnel配对的RemoteTunnel从请求容器中取出请求。
8.RemoteTunnel将取出的请求转发给服务器,并将请求保存起来,作为抓包的请求。
9.服务器产生响应的IP包。
10.RemoteTunnel收到服务器的响应,并将响应保存起来,作为抓包的响应。
11.RemoteTunnel将收到的响应保存到响应容器,响应容器也由ConcurrentLinkedQueue来实现。
12.与RemoteTunnel配对的LocalTunnel从容器中取出响应。
13.LocalTunnel将响应发给LocalSocket,响应又被转发到了虚拟网络设备上。
14.VPNService从虚拟网络上读取请求IP包。本步骤和步骤二是同一个动作。
15.解析获得源端口,如果源端口是由Local Tunnel发出来的,则修改了目标IP为Session所保存的源IP,源IP为Session所保存的目标IP,源端口为Session所保存的目标端口,合成新包。
16.将新包写到虚拟网络设备上。
17.响应被转发到Local Socket,整个过程结束。
采用以上技术方案的原因
方案的绝妙之处在于步骤3和步骤15,通过步骤3和步骤15可以建立LocalTunnel作为LocalSocket的假想服务器。LocalTunnel只需要负责和Local Socket通信,其内部也是由SocketChannel来实现。使用SocketChannel来负责Local Socket无需自己实现复杂的TCP/IP协议,同时有更大扩展性,可以快速的实现TSL/SSL,以对https进行抓包。
笔者曾经自己实现TCP/IP协议(项目地址 :https://github.com/huolizhuminh/NetWorkPacketCapture 版本号:1.0.3)和Local Socket进行通信,但是稳定性一直没有Java的SocketChannel要好。也有其它的项目例如ToyShark:https://github.com/LipiLee/ToyShark 采用直接实现TCP/IP协议,效果也不理想。
https步骤
packetcapturehttps-2.jpghttps步骤说明
https和http整个过程类似,只是多出了步骤7和步骤17以及步骤10和步骤14,多出的不走是对请求和响应进行加解密,在container中的是加密前的请求以及解密后的响应。整个https加密的过程的实现参照Netty。
抓包说明
- 抓包前手机需要安装app生成的根证书。
- 不是所有的APP都支持https抓包,目前测试支持的APP有简书、腾讯新闻、qq浏览器、腾讯视屏,淘宝、拼多多,不支持的有链家、知乎、58同城等,也有半支持的如百度新闻。
- 不支持https的原因是在7.0之后,App默认不支持手机自身安装的根证书,如果是开发者,可以在Manifest清单文件中进行设置。可以设置为所有版本都支持,也可以仅设置为debug模式下支持,具体的设置方法可参考博客:https://www.cnblogs.com/wytings/p/6954293.html ,也可以参考参考我的项目:https://github.com/huolizhuminh/AndroidSkills/tree/master/OkhttpDemos 。
抓包过程及效果
1.选择需要抓包的APP
抓包精灵3.png
2.开启抓包后会显示每一条连接。
抓包精灵1.png
3.进入查看包内容
C96461B9F0BDF0B7547C38FCC23673A3.jpg
4.可查看历史
抓包精灵5.png5.在设置页面设为为自动保存解析内容后或者在包查看页面保存解析内容后,可以dump 解析之后的数据,地址为:sdcard/VpnCapture/Parsedata 。
6.也可查看并dump原始数据,原始数据查看地址为:sdcard/VpnCapture/Conversation
参考项目
本项目主要参考的项目有:
- Okhttp:https://github.com/square/okhttp, 参考了其包解析功能。
- Netty: https://github.com/netty/netty ,参考了其利用JAVA的NIO的方式使用
https。 - Firewall:https://github.com/zheying/Firewall,参考了vpn方案。
- IP-Monitor:https://github.com/zhao007z4/IP-Monitor,参考了通过端口获得包名的方案。
- AndroidHttpCapture:https://github.com/JZ-Darkal/AndroidHttpCapture 参考了证书的生成方案。
项目地址
Github: https://github.com/huolizhuminh/NetWorkPacketCapture
APP下载地址:http://sj.qq.com/myapp/detail.htm?apkName=com.minhui.networkcapture
加入我们QQ群:
网友评论