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 及 端口
输出:
send: 可用于向某socket发送数据,从中可以提取到发送数据的length
输出:
CFNetwork网络诊断
苹果在CFNetwork框架中提供了一套完善的网络诊断机制,可用于分析CFNetwork内部状态 及 网络数据信息。
https://developer.apple.com/library/archive/qa/qa1887/_index.html
回顾一下CFNetwork 的整体架构:
CFNetwork Diagnostic 可以提供CFSocketStream 之上的流量信息,同时也包含socket的相关信息。
开启诊断功能的操作非常简单,通过xcode edit scheme或setenv 设置CFNETWORK_DIAGNOSTIC环境变量即可,其值从1~3,对应不同的诊断级别:
1、包含CFNetwork事件,如request、response、时间、流量等
2、包含header信息,socket连接信息
3、包含加密流量(如https)内容
以下是级别为3的部分诊断报告内容(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
通过 websockets 的 Socket.io - 随机“传输端”断开连接