移动测试开发 初识网络抓包 (一)

opentest-oper@360.cn · 2018年12月17日 · 897 次阅读

一、背景

        众所周知,抓取电脑的网络包的方法最常用的莫过于 wireshake 和 tcpdump,而本篇所讲的内容主要针对的是手机抓包(抓取流经手机的网络包)。
        抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。那为什么需要手机抓包呢?
        因为在移动数据业务(移动逆向分析以及 App 开发)中,需要对手机的网络行为进行监控测试。由于 Android 系统是当前的主流系统之一,因而实现在 Android 系统手机端进行抓包分析对常规测试用例具有重要作用。
        此处说明:云真机平台支持大量手机,若要实现抓包功能,通用方法存在局限性。
        而对于一个真机平台如何在耗费最小下实现对手机抓包呢?
        在公布答案之前,先简单连接下大家熟知的有几种常见的抓包方式,有以下几种方式:

        (1)手机内部启动 tcpdump 进程

                具体操作:

                a.下载 Android 版本的 tcpdump,将其拷贝至手机目录下。
                b.通过与电脑相连,使用 adb 命令启动该进程并将抓包文件保存手机目录下。
                c.将文件拷贝出来使用包解析工具解析。

                缺点:

                a.必须是 root 状态
                b.开启 tcpdump 影响手机使用时性能,会对结果造成误差

        (2)Fiddler 软件

                具体操作:

                a.本地配置 wifi 热点,将手机连接该热点。
                b.设置 Fiddler 相关配置抓取该 wifi 的网络包进行分析。

                缺点:

                本地的 wifi 热点连接数量有限制(对于一个真机平台而言,是没办法一次配置抓取所有手机的网络包)。

        (3)基于 VpnService 框架的抓包 apk(最常用)

                具体操作:

                要实现 Android 设备上的 *** 程序,一般需要分别实现一个继承自 Activity 类的带 UI 的客户程序和一个继承自 VpnService 类的服务程序。

                缺点:

                a.仅仅允许一个 *** 连接运行在同一时间。当一个新的网卡被创建,已经存在的虚拟网卡接口将失效。这对于要测试某些抓包 apk 来说和不能同时运行的。
                b.apk 运行时,会消耗大量的系统性能。

二、核心技术与架构图

        

        核心思路:默认每个需要测试抓包的手机连接一个指定 wifi,而该 wifi 是个路由器会连接到某台交换机上,我们采取在交换机上启动一个服务,该服务会将指定 wifi 的网络包 copy 一份到 A 服务器的某个网口,最终只需要监听 A 服务器的相关网卡就可以获得所有连接指定 wifi 的数据包,并进行相应解析。
        注:最简单的就是起个临时 wifi,这样可以直接在某台机器上进行该 wifi 的网络数据的抓取了。

        具体操作:

        a.测试抓包的手机连接一个指定 wifi
        b.wifi 连接的交换机上启动进程将流经指定 wifi 的网络包 copy 至电脑的某个网口。
        c.监听流经该电脑的网卡的网络包,将其 dump 到本地就可以使用 wireshark 等工具去解析了。
此处不使用抓包工具,使用的一个 Go 的库:gopacket,该库是基于 libpcap(数据包捕获函数库)实现。(github:https://github.com/google/gopacket

        本技术前提:批量管理手机时(将手机放置云平台管理)
        本技术优势:

        a.在不涉及手机的任何操作下,抓取手机的网络包,损耗小。
        b.抓取的数据包可直接分析、存储,采用网络包分析软件分析。
        c.整个架构简单、易操作、可拓展。
        本技术缺陷:当某个手机未接入云平台时无法进行抓包分析。

三、技术实现效果

        web 端发送抓包请求,点击启动按钮,访问网页等,即可看到实时网络数据传输,并支持下载对应的 pcap 文件。

        下面根据实现效果分析,需要得到两部分数据,一部分是页面上所显示的通俗易懂的表格数据;另一部分是 pcap 文件所需要的数据字段。
        

        试用地址:http://opentest.360.cn/phonerenter.html

        

        那如何来获取这两部分数据呢?又如何实时的存储数据呢?

四、设计程序流程图

        目的:抓包服务主要负责将手机的实时包存储至数据库,存储内容分为 targetPacket(可获取可写成 pcap 文件的)、showInfo(前端页面上直观显示的信息:包含:源 IP、目的 IP、源 Port、目的 Port、包长度、包数据)。

        根据这个目的设计代码结构:

        

        前端设计是当开启某个手机的抓包服务后,再开始往数据库存储 showInfo。
        主进程启动了三个协程:
        (1) 收到广播信息,得到手机抓包动作
        (2) 根据 phoneip 删除数量过多的包
        (3) 调用 pcap 接口抓取包并执行存储操作(主协程)

五、后续期待

        下一篇将大量讲解实现抓包功能的细节以及开发过程中的相应优化方案。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册