suricata的代码核心

2020-03-20  本文已影响0人  明翼

想了解一个程序的核心逻辑,最好调试下,跑跑程序,在调试的过程中,对整个结构才有个很好的把握。
suricata有多种模式,其中,single这种单线程模式,容易了解整个程序的核心逻辑,其他的多线程模式调试起来相对来说更加麻烦,而各种抓包模式显然要比读本地pcap的方式复杂,所以最简单的办法是调试单线程读取pcap的模式的办法。

一 单线程跑pcap模式线程情况

如下图所示,加了马赛克的非suricata的原生线程,可以忽略。其他线程说明:

  1. main 线程,主线程,最终一直定时执行循环,做文件定期滚动标志;如果需要重新加载规则库的,则加载规则库。
  2. 管理线程分出两个: 流超时管理线程和流重应用线程。
  3. 统计唤醒线程和统计管理线程。

最重要的就是现在光标指出来的W#1线程,核心的函数就是FlowWorker,这个函数就是flow-worker.c中的FLowWorker函数。

单线程读取pcap包模式

二 FLowWorker的总体说明

学习FlowWorker,先了解下其整体执行过程,总的来说主要有三大核心功能:

三 调用解析

如下图所示,tcp包需要先进行包重组和状态更新,只有状态是连接状态后,才会进入流分析。
流分析的特点:

TCPProtoDetect
-->AppLayerProtoDetectGetProto
      -->AppLayerProtoDetectPPGetProto;
             --> pe->ProbingParserTs/pe->ProbingParserTc
                    -->进入到各个协议注册的检测函数

协议解析:

AppLayerParserParse
   -->p->Parser[(flags & STREAM_TOSERVER) ? 0 : 1](f, alstate, pstate,
                input, input_len,
                alp_tctx->alproto_local_storage[f->protomap][alproto]) 

调用指针进行协议的解析。

调用解析
上一篇 下一篇

猜你喜欢

热点阅读