suricata7.0.5
一、前提条件
1.1 关键字注册
main
|
--> SuricataMain|--> PostConfLoadedSetup|--> SigTableSetup
sigmatch_table
是一个全局数组,每个元素就是一个关键字节点,是对关键字如何处理等相关回调函数。非常重要的一个结构,后续的规则加载处理都需要此结构。
/* Table with all SigMatch registrations */
SigTableElmt sigmatch_table[DETECT_TBLSIZE];
比如http协议的method注册
sigmatch_table[DETECT_HTTP_METHOD].name = "http.method";
sigmatch_table[DETECT_HTTP_METHOD].desc = "sticky buffer to match specifically and only on the HTTP method buffer";
sigmatch_table[DETECT_HTTP_METHOD].url = "/rules/http-keywords.html#http-method";
sigmatch_table[DETECT_HTTP_METHOD].Setup = DetectHttpMethodSetupSticky;
sigmatch_table[DETECT_HTTP_METHOD].flags |= SIGMATCH_NOOPT|SIGMATCH_INFO_STICKY_BUFFER;
最终的结果如下图
这里主要关注Setup回调,后续规则加载处理时会调用
1.2 DetectBufferType注册
DetectBufferType
结构也是非常重要的,在加载规则处理过程需要使用。
通过HashListTable
结构将所有注册的DetectBufferType进行
这里主要关注name和id
, 其他字段暂时不关注
二、规则加载
后续将以alert http any any -> [192.168.1.27,1.192.137.27] 80 (msg:"HTTP Request Example"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"query.php"; bsize:>9; http.protocol; content:"HTTP/1.1"; bsize:8; http.host; content:"360"; bsize:>3; classtype:bad-unknown; sid:25; rev:1;)
为例,逐一分析加载流程。
DetectEngineAppendSig
|
--> SigInit|--> SigInitHelper
2.1 创建Signature
每条规则对应一个Signature对象
...
Signature *sig = SigAlloc();
...
2.2 解析action
SigParseAction(...)
后续继续header + options