AndroidAndroid技术性能优化

安卓抓包工具开发

2018-05-26  本文已影响2035人  倦飞知还

前言

目前存在的安卓抓包方法有很多,例如Fiddler、Charels、Packet Capture、tcpdump,其各存在一定的优缺点。

综述,目前存在的抓包工具或多或少都存在一定的缺点,其中最好用的是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.jpg

https步骤说明

https和http整个过程类似,只是多出了步骤7和步骤17以及步骤10和步骤14,多出的不走是对请求和响应进行加解密,在container中的是加密前的请求以及解密后的响应。整个https加密的过程的实现参照Netty。

抓包说明

抓包过程及效果

1.选择需要抓包的APP


抓包精灵3.png

2.开启抓包后会显示每一条连接。


抓包精灵1.png

3.进入查看包内容


C96461B9F0BDF0B7547C38FCC23673A3.jpg

4.可查看历史

抓包精灵5.png

5.在设置页面设为为自动保存解析内容后或者在包查看页面保存解析内容后,可以dump 解析之后的数据,地址为:sdcard/VpnCapture/Parsedata 。
6.也可查看并dump原始数据,原始数据查看地址为:sdcard/VpnCapture/Conversation

参考项目

本项目主要参考的项目有:

项目地址

Github: https://github.com/huolizhuminh/NetWorkPacketCapture
APP下载地址:http://sj.qq.com/myapp/detail.htm?apkName=com.minhui.networkcapture
加入我们QQ群:

安卓VPN抓包研究群二维码.png
上一篇 下一篇

猜你喜欢

热点阅读