欢迎来到天天文库
浏览记录
ID:11901527
大小:38.31 KB
页数:18页
时间:2018-07-14
《suricata源码阅读main函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、main()函数位于suricata.c文件,其主要流程如下:1.定义并初始化程序的全局实例变量。·SCInstance类型的suri变量用来保存程序当前的一些状态、标志等上下文环境,通常是用来作为参数传递给各个模块的子函数,因此为了更好的封装性而放到一个结构体变量中,而不是使用零散的长串参数或一堆全局变量。·SCInstanceInit函数,顾名思义,即是对suri中各个字段进行初始化。注意,这里对所有字段都进行了显示初始化,因为虽然一个memset清零已经基本达到目的了,但显示地将各个成员设成0/NULL/FALSE对于可读性来说还是有好处的,可以明确地说
2、明各个字段的初始值,且对扩展性也会有好处,例如若后续初始化需要设置一些非0值(如用-1表示无效值),直接更改就好了。2.初始化sc_set_caps为FALSE–>标识是否对主线程进行特权去除(dropprivilege),主要是出于安全性考虑。3.初始化原子变量engine_stage–>记录程序当前的运行阶段:SURICATA_INIT、SURICATA_RUNTIME、SURICATA_FINALIZE4.初始化日志模块,因为后续的执行流程中将使用日志输出,所以需要最先初始化该模块。5.设置当前主线程名字为“Suricata-Main”。线程名字还是挺重
3、要的,至少在gdb调试时infothreads可以看到各个线程名,从而可以精确地找到想要查看的线程。另外,在top-H时,也能够显示出线程名字(然而ps-efL时貌似还是只是显示进程名)。6.初始化ParserSize模块–>使用正则表达式来解析类似“10Mb”这种大小参数,其中正则引擎用的是pcre,因此初始化时就是调用pcre_compile、pcre_study对已经写好的正则表达式进行编译和预处理。7.注册各种运行模式。Suricata对“运行模式”这个概念也进行了封装。运行模式存储在runmodes数组中,定义为RunModesrunmodes[RU
4、NMODE_USER_MAX]。·首先,数组中每一项(例如runmodes[RUNMODE_PCAP_DEV]),对应一组运行模式,模式组包括(RunModes类型):“IDS+Pcap”模式组、“File+Pcap”模式组、“UnixSocket”模式组等(另外还有其他一些内部模式,如:“列出关键字”模式、“打印版本号”模式等,这些没有存储在runmodes数组中)。·然后,每一个模式组,其中可以包含若干个运行模式(RunMode类型),例如:single、auto、autofp、workers。·运行模式的注册,则是为各个模式组(如RunModeIdsPc
5、apRegister)添加其所支持的运行模式(通过调用RunModeRegisterNewRunMode),并定义改组的默认运行模式,以及非常重要的:注册各个模式下的初始化函数(如RunModeIdsPcapSingle),等后续初始化阶段确定了具体的运行模式后,就会调用这里注册的对应的初始化函数,对该模式下的运行环境进行进一步配置。8.初始化引擎模式为IDS模式。引擎模式只有两种:IDS、IPS,初始默认为IDS,而在nfq或ipfw启用时,就会切换成IPS模式,该模式下能够执行“Drop”操作,即拦截数据包。9.初始化配置模块,为配置节点树建立root节点
6、。10.解析命令行参数。其中,与包捕获相关的选项(如“-i”)都会调用LiveRegisterDevice,以注册一个数据包捕获设备接口(如eth0)。全局的所有已注册的设备接口存储在变量live_devices中,类型为LiveDevice。注意,用多设备同时捕获数据包这个特性在Suricata中目前还只是实验性的。“-v”选项可多次使用,每个v都能将当前日志等级提升一级。11.若运行模式为内部模式,则进入该模式执行,完毕后退出程序。12.FinalizeRunMode,即为运行模式的处理划上句号。主要是设置offline标志、对unknown运行模式进行报
7、错,以及设置全局的run_mode变量。13.若运行模式为单元测试模式,则跑(用户通过正则表达式指定的)单元测试,并输出测试结果。14.检查当前模式是否与daemon标志冲突。Pcap文件模式及单元测试模式都不能在daemon开启下进行。15.初始化全局变量。包括:数据包队列trans_q、数据队列data_queues(干嘛的?)、对应的mutex和cond、建立小写字母表。16.初始化时间。包括:获取当前时间所用的spinlock,以及设置时区(调用tzset()即可)。17.为快速模式匹配注册关键字。调用SupportFastPatternForSigM
8、atchList函数,按照优先级大小插
此文档下载收益归作者所有