iOS端socket流量采集

Posted 58无线技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS端socket流量采集相关的知识,希望对你有一定的参考价值。

前言

在“百团项目”中,我们需要实现ios 端的网络流量采集,目前已经通过FaceBook的SK工具实现了http层面的网络流量采集。我们希望更进一步,对于流经socket的流量进行采集,本文将针对此问题,介绍两种方案:

 

·  基于hook的思想,通过fishhook对socket相关函数进行hook,从而采集流经函数内的流量

·  基于CFNetwork 提供的网络诊断机制,对应用内流经CFSocketStream层的数据进行统计


Hook方案

在OC中,我们可以方便地通过runtime对oc 方法进行替换,从而实现方法的hook。而socket相关的方法都以C 函数的方式实现,要实现C函数级的hook,我们利用了facebook提供的fishhook框架。

fishhook通过Mach-O的动态符号绑定机制实现了C函数的hook

https://github.com/facebook/fishhook


 

 

通过fishhook,我们可以对socket相关的函数进行替换,我们主要关注作为客户端的IOS App 向服务器发送的流量信息,因此在demo中,我们重点hook了:connect、send 函数。

 

connect:用于建立与指定socket的连接,可从中提取出相应的ip 及 端口

iOS端socket流量采集

 

输出:

iOS端socket流量采集

 

send:   可用于向某socket发送数据,从中可以提取到发送数据的length

iOS端socket流量采集

 

输出:

iOS端socket流量采集

 

 

CFNetwork网络诊断

苹果在CFNetwork框架中提供了一套完善的网络诊断机制,可用于分析CFNetwork内部状态 及 网络数据信息。

 

https://developer.apple.com/library/archive/qa/qa1887/_index.html

回顾一下CFNetwork 的整体架构:

 

iOS端socket流量采集

 

 

CFNetwork Diagnostic 可以提供CFSocketStream 之上的流量信息,同时也包含socket的相关信息。

 

开启诊断功能的操作非常简单,通过xcode edit scheme或setenv 设置CFNETWORK_DIAGNOSTIC环境变量即可,其值从1~3,对应不同的诊断级别:

 

1、包含CFNetwork事件,如request、response、时间、流量等

2、包含header信息,socket连接信息

3、包含加密流量(如https)内容

 

以下是级别为3的部分诊断报告内容(socket相关):

 

iOS端socket流量采集

 

 

 

报告导出:

 

由于苹果官方提供的诊断报告查看方式仅仅局限于,通过xcode及 控制台查看,不便于通过程序来操作和分析报告。

为了便于分析与数据收集,我们通过文件重定向的方式将控制台stderr描述符重定向到app沙盒内的某个自定义文件,从而完整地将控制台信息导出到了应用内部,程序可以直接在应用内部对报告进行操作和统计。

 

   

结语

 

以上两种方式,可以从不同角度实现socket相关的流量信息采集。

Hook的方式,需要知道所调用的确切的socket相关函数,从而进行hook并采集所关心的数据信息。

而CFNetwork diagnostic不需要考虑所网络相关的具体调用,只要是数据最终流经了CFSocektStream,其都能提供相关的流量及诊断信息,不过对于调用CFSocektStream之下的网络API进行的网络请求,无法提供诊断及流量报告


以上是关于iOS端socket流量采集的主要内容,如果未能解决你的问题,请参考以下文章

即时通讯:服务端SpringBoot+Netty-Socket.io,客户端Socket.io.js+Java版Socket.io-client

如何使用 socket.io 断开所有套接字服务端?

socket.io客户端API

通过 websockets 的 Socket.io - 随机“传输端”断开连接

websocket 实现 前端vue-socket.io 服务端 koa2(socket.io)

Socket.IO入门原理