suricata的主要功能就是将规则和指定的报文进行匹配。有的是二进制协议的字段匹配,主要就是数值的比较。有的是针对传输层协议的内容匹配,主要是字符串的匹配查找。其中字符串的匹配分单模匹配以及多模匹配,本篇就简单的聊聊这两种匹配在suricata中的体现。

单模匹配即用单个字符串去匹配报文的的内容部分,例如payload。多模匹配即多个字符串同时去匹配报文的payload部分。其中多模匹配主要发生在prefilter阶段,而单模匹配发生在单条规则的匹配阶段。

多模匹配

为什么说prefilter阶段是单模匹配呢?在Prefilter函数中,执行的匹配函数代码为engine->cb.Prefilter,而该函数是在PrefilterPktPayloadRegister函数中注册的,详细的见我前面分析prefilter的文章,这里。在PrefilterPktPayloadRegister函数中,注册的匹配函数为PrefilterPktPayload,其中mpm_table即多模匹配的算法函数,可以是AC的多模匹配算法,也可以选择HS的多模匹配算法。匹配的内容是p->payload,匹配的多模模式是pectx。那么多模的模式是怎么构建的呢?

模式的来源即每一个规则的fast pattern构成,在规则被加载解析之后,会进行规则的build,在规则的build阶段就会将这些fast pattern构建成多模的模式。具体构建多模模式的函数为MpmStorePrepareBuffer,该函数针对不同的分组进行多模模式的建立。首先通过MpmStoreLookup查找模式是否存在,如果不存在通过MpmStoreSetup建立。在MpmStoreSetup中,最重要的是找到符合条件的fast pattern,即 const DetectContentData *cd = (DetectContentData *)s->init_data->mpm_sm->ctx;,然后将其加入到 ms->mpm_ctx中,即:

PopulateMpmHelperAddPattern(ms->mpm_ctx,cd, s, 0, (cd->flags & DETECT_CONTENT_FAST_PATTERN_CHOP));

前面提到,多模模式的个数是由系统的分组决定的,在一个多模的模式创建完成之后,会将该模式加入de_ctx->mpm_hash_table哈希表进行统一的管理,即MpmStoreAdd函数的内容。

单模匹配

单模的匹配主要是将规则的一个个pattern依次去匹配报文的payload部分,即DetectRulePacketRules->DetectEnginePktInspectionRun
DetectEnginePktInspectionRun函数中e->v1.Callback回调函数的注册位于DetectEnginePktInspectionSetup处。可以看到匹配函数为DetectEngineInspectRulePayloadMatches->DetectEngineInspectPacketPayload->DetectEngineContentInspection->SpmScan。同样的在SpmScan函数中,spm_table可以采用AC的单模匹配算法也可以采用HS的单模匹配算法,匹配的内容sbuffer通常是报文的payload部分,匹配的字符串cd->spm_ctx即规则解析阶段的每个规则中的一个个字符串pattern。

多模匹配的消耗通常要高于单模的匹配,同时经过prefilter阶段的匹配之后,符合条件的规则数量会大大的减少,在单模匹配阶段的消耗也会变的更少。这也是在测试性能的时候,规则检测阶段性能消耗最大的往往是prefilter函数。

本文为CSDN村中少年原创文章,转载记得加上原创出处,博主链接这里。

suricata中的单模匹配和多模匹配相关推荐

  1. python使用esmre代替ahocorasick实现ac自动机[多模匹配]

    Toggle navigation Home saltstack ansible zabbix docker python Golang web开发 运维开发 运维 文艺 python使用esmre代 ...

  2. AC多模匹配+完整实现源码

    前段时间同事讲了一下AC多模匹配的原理,就试着写了下代码,现在再看代码的时候有些地方连自己都快看不懂了,所以想做一个笔记 查找10M的日志文件,即使最后一行,用时不到0.2毫秒能正确查找出ssss串中 ...

  3. 【模式匹配】之——多模匹配 Wu-Manber算法

    本文对应代码下载地址: http://download.csdn.net/detail/sun2043430/5323248 本文参考以下两篇文章,在此表示感谢 https://memorycn.wo ...

  4. Python实现多模匹配——AC自动机

    Python实现多模匹配--AC自动机 目标:学习AC自动机,多模匹配. 要求:尽可能用纯Python实现,提升代码的扩展性. 一.什么是AC自动机? AC自动机,Aho-Corasick autom ...

  5. 路由表中没有与提供的值匹配的路由

    ASP.Net MVC 分离Areas到多个项目  提示:路由表中没有与提供的值匹配的路由 解决方案: 1.检查区域路由是否正确注册. 2.检查多个项目的程序包是否是同一个版本的 例如:System. ...

  6. 给定的 columnmapping 与源或目标中的任意列均不匹配_闻歌研究 | 图文自动匹配任务研究调研...

    认知计算部 作为中科闻歌的基础研究部门,认知计算部依托于中科闻歌多年来积累的媒体大数据.高性能云计算平台以及高素质技术人才,致力于将认知计算技术应用到广泛的业务场景中并推动前沿技术发展,研究方向包括但 ...

  7. php 正则第一个,为什么这个正则表达式与php中的第一个结果不匹配?

    这是我的正则表达式: ❰(❮\d+[\-\d]*❯)⦓([^⦔]*)⦔❱ Nullaimperdiet❰❮6❯⦓"Lorem ipsum dolor sit amet,consectetur ...

  8. 判断.java文件中getConnection与cleanUp数量是否匹配

    需求:查找未关闭的数据库连接. 两步走: 1.将给定目录下的及子目录下的 所有的给定后缀名的文件路径存到集合中. 2.使用正则表达式对每个文件进行匹配. package com.fanc.main;i ...

  9. jQuery中,选择器既匹配开头又匹配结尾

    jQuery中,选择器既匹配开头又匹配结尾的方法: 1 [attr^=val]attr$=val 2 [attr^=val][attr$=val] 转载于:https://www.cnblogs.co ...

最新文章

  1. Ubuntu 安装NVidia驱动
  2. 二分图最小覆盖的Konig定理及其证明
  3. Linux编程——入门级Makefile文件编写
  4. C# 函数重载 示例 求圆的面积
  5. The pc Register(程序计数器)
  6. 位,字,字节之间关系及关联知识普及
  7. 消息队列mysql redis那个好_Redis与RabbitMQ作为消息队列的比较
  8. 前端学习(2761):uni-app样式的学习
  9. 软件工程师 VS 硬件工程师
  10. 信息学奥赛一本通 2051:【例3.1】偶数
  11. LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)
  12. 『杭电1891』Tough Water Level
  13. HeadFirst 设计模式 笔记
  14. 市场营销人员如何用BI工具进行多维度数据分析?仅需7步
  15. 技术前沿与经典文章20:历史上54位伟大物理学家、科学家的专属LOGO(六)
  16. 原生js预览ofd文件,JavaScript
  17. wget网站镜像下载
  18. 乔布斯的简历17.4万拍卖,HR看了想打人……
  19. ARP与RARP协议详解 (三)
  20. word-spacing、word-break、letter-spacing和white-space

热门文章

  1. laravel生成微信公众号带参数二维码并响应扫描带参数二维码
  2. 二、自己需求函数的模块化
  3. Python网络爬虫:爬取豆瓣上《小王子》书评
  4. qcqa是什么职位_QC、QA的定义及岗位职责
  5. 通信人眼里的ABC……
  6. SpringCloudStream整合Kafka,解决两个通道对应同一个topic报错问题。
  7. VSCrawler 爬虫 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案
  8. Cloud Token:一个趋势可以改变你的一生,有天你别后悔拍大腿……
  9. getPhoneNumber:fail no permission
  10. Protege使用教程(推理篇)