socket介绍
socket是系统提供用于网络通信的方法,它并不是一个协议但是很多协议间的通信数据是通过socket中方法来传递数据的,目前在APP中用的最多就是即时通讯和直播,这两年比较火的直播的音视频数据就是通过socket传递的,有RTMP协议和Http-flv协议,如果有想了解这两个协议的可以在下面留言,之后我会介绍如何进行直播监控使用代码解析这两个协议,这篇文章主要介绍socket监控实现。
在iOS中socket有两种,一种是c层的socket.h中纯C的写法,还有就是CFNetwork中的CFSocket,这两种方式在iOS中可以杂在一起使用导致socket创建的方式有很多种。
socket监控
其实监控原理都是大同小异的都会使用hook机制,运行时动态替换将原方法替换成一个新方法,参数和原来方法相同,AOP编程和swizzle就是普通的hook,接下来介绍的就是不同于这两种机制的hook。
对于C方法的监控我们需要借助于facebook提供的一个工具fishhook,fishhook的实现是利用iOS中Mach-o的编译原理,使用内存地址的偏移来替换原有的方法,至于如何实现的这里就不讲了,网上有很多资料特别是iOS安全攻防中讲的特别详细,我们这里来说说如何使用。
首先我们需要定义一下静态方法,静态方法的参数和你需要监控方法参数一样。
再定义一个开关方法open,然后使用fishhook提供的rebind_symbols函数进行hook,替换成一想要实现功能的方法,open这个方法可以在appdelegate的didFinishLaunchingWithOption中调用,实现全局监控。
最后在这个函数中,有返回值的你需要将返回值return回调回去,connect方法的返回值是int值,需要用静态方法传递参数获取返回值回调。这中和AOP切面编程还有swizzle一样了,只是上面的实现步骤不一样,最后你就可以在my_connect中实现你想要做的事,获取IP、端口号、链接错误等等,当然不止这些,一些协议层的数据分析也可以通过这些方法来监控,至少这样就能做到socket的监控了。
说了这么多,不了解使用的小伙伴可能还是不清楚,我写了个demo,我把github代码链接发在这里,觉得对你有用的话请给个星星。
https://github.com/LonelyWise/SocketMonitor.git
运行的时候最好使用真机,原因是在模拟器上网络请求会走socket就会导致模糊,但是在真机上苹果系统就会将系统的和网络请求的给屏蔽了,不主动调用就不会运行到socket。
如果有对直播协议感兴趣的的可以私聊我,我接下来会写一下关于RTMP和http-flv协议层数据的解析,也是基于本篇文章socket监控的基础,对APM有兴趣的也可以私聊我,一起探讨。