安卓抓包工具开发

作者: 倦飞知还 | 来源:发表于2018-05-26 13:32 被阅读2035次

    前言

    目前存在的安卓抓包方法有很多,例如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.jpg

    https步骤说明

    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.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

    相关文章

      网友评论

      • f445eaf5955e:我们有个APP在安卓4G环境下访问慢,苹果或安卓WIFI都正常,用其他手机版网络测试软件发现解析APP域名长达30s,下载安装抓包精灵pro闪退,小米MIUI10 正式版
        倦飞知还:用应用宝上的吧 给到链接不对
        空_66c3:安装抓包精灵pro,红米note4x miui9也闪退,用模拟器也闪退
        f445eaf5955e:红米4x miui9.6下也是闪退。
      • 起风了你追得上我吗:想学习下https,大神来源了吗
        倦飞知还:@起风了你追得上我吗 不开源
      • 剑涵:楼主,请教一个问题,我在测试中发现一些使用okhttp的app使用fiddler抓不到包,用楼主的vpn方式是可以的,想知道是什么原因造成的呢?
        倦飞知还:@剑涵 不是所有的https都做证书中间人
      • 黑狗狗哥:求https源码
      • 进击的NickMao:非常不错,楼主的部分源码可以被借鉴在项目中吗?
        倦飞知还:肯定可以啦
      • 叶大帅1012:我把这个应用打开了,为什么腾讯新闻无法连接网络
        倦飞知还:@ca7fe2a213cb 你是什么机型,什么系统呢,我试了下可以的
      • 772908402265:demo运行起来个别的的请求体,响应体是乱码 是因为是https的吗
        倦飞知还:@fly940912 可能是加密的原因,有也可能是响应体格式没法解析。
      • 772908402265:楼主我想请教一下 http抓包,第三步,将源ip修改为目标ip是因为什么
        倦飞知还:@fly940912 整个vpn代码使用的是firewall的,之前我也研究过它为什么那样做,后来想想其实不是必须的,只需要把它的ip保存下来就可以了。在接收到数据之后用保存到session进行替换。不过我没有尝试过,你可以试一下。
      • 本朲纯属虚构:站在巨人的肩膀上,我也可以很高...
      • 2efbb7e5a4d8:灰常不错,学习了。

      本文标题:安卓抓包工具开发

      本文链接:https://www.haomeiwen.com/subject/qttpjftx.html