-
Notifications
You must be signed in to change notification settings - Fork 338
拦截点选择
hueng edited this page Apr 29, 2020
·
5 revisions
流量录制必然要在某个点上对流量进行拦截并镜像,常见的拦截方式如下:
分析:
- 为了做到尽量无业务浸入、具体框架无关,业务代码和rpc框架拦截方式不适合。
- syscal拦截成本高,到tcp/ip协议栈的时候线程等信息丢失更不容易区分,所以后面几种方式都不适合。
综上,比较适合拦截的方式是libc、语言标准库。
- 对于底层使用libc的语言,如php,可以在libc进行拦截。参考:rdebug
- 对于没有使用libc的语言,如golang,可以在语言标准库上修改做拦截。
socket通信基本流程图如下,需要在Connect、Accept、Send、Receive、Close等阶段加钩子拦截并镜像流量。
修改golang源码,相应提供OnConnect、OnAccept、OnRead、OnWrite、OnClose等函数,详见:sharingan-go
- inbound请求经历的Hook如下:
OnAccept() -> OnRead() -> OnWrite() -> OnClose()
- outbound请求经历的Hook如下:
OnConnect() -> OnWrite() -> OnRead() -> OnClose()
- 核心OnRead拦截函数如下:
- 核心OnWrite拦截函数如下: