init_policies

遍历sc->policy_map->ips_policy_count()和sc->policy_map->inspection_policy_count(),设置ips_policy->policy_mode和inspection_policy->policy_mode

ParseRules

  1. 遍历sc->policy_map->ips_policy_count()
  2. 通过sc->policy_map->get_ips_policy(idx)获取IpsPolicy
  3. 判断p->includer不为空,则执行push_parse_location,ParseConfigFile,pop_parse_location。push_parse_location函数创建loc对象,并将loc入栈;

ParseConfigFile函数通过状态机解析规则;

pop_parse_location函数将loc出栈。

  1. 判断!p->rules.empty(),并执行3中流程
  2. 判断!idx and !s_aux_rules.empty(),并执行3中流程
  3. 判断!idx and sc->stdin_rules,并执行3中流程
  4. 调用PortTablesFinish。

PortTablesFinish

  1. 分别将port_tables->ip.src,port_tables->ip.dst,port_tables->icmp.src,port_tables->icmp.dst,port_tables->tcp.src,port_tables->tcp.dst,port_tables->udp.src,port_tables->udp.dst调用finish_portlist_table函数
  2. 分别将port_tables->ip.any->rule_list,port_tables->icmp.any->rule_list,port_tables->tcp.any->rule_list,port_tables->udp.any->rule_list,port_tables->svc_any->rule_list等调用RuleListSortUniq,该函数将上面的链表按照数据部分进行排序。数据部分为int类型的rule id。

finish_portlist_table

  1. 调用函数PortTableSortUniqRules,将pt->pt_polist中的每个PortObject的rule_list按照ruleid进行排序;先遍历p->pt_polist,它的每一个成员是PortObject,然后遍历PortObject po->rule_list按照rule id进行排序
  2. 调用PortTableCompile,其中调用PortTableCompileMergePortObjects函数:

创建p->pt_mpo_hash表,数据成员为PortObject

创建p->pt_mpxo_hash表,数据成员为plx_t

  1. 调用create_port_lists,将p->pt_polist转换成数组,下标为端口号,成员为PortObject组成的链表。先遍历p->pt_polist得到每一个PortObject,然后遍历po->item_list,每个成员为PortObjectItem,取出端口号,并按照端口号作为下标,存放PortObject到数组中。
  2. 按照端口号,遍历3中得到的数组,取出数组中的PortObject对象,将其保存在pol中,调用PortTableCompileMergePortObjectList2函数:

根据PortObject中规则数量的多少,分别存放在polarge或者posmall中,数量多的po放在polarge中,数量少的po放在posmall中

分别对polarge和posmall按照地址进行排序

分别将地址封装在plx_large和plx_small中

分别调用_merge_N_pol对polarge和posmall进行合并,得到ponew和posnew

如果ponew和posnew不为空且不相同,根据posnew->rule_hash复制到ponew->rule_hash中

  1. 释放optimized_pl数组占用的空间
  2. 遍历mhashx hash表,其中每个成员为PortObject2,使用new PortBitSet初始化PortObject2中的port_list
  3. 遍历pt_port_object,取出PortObject2对象,如果port_list不为空,则为port_list->set设置位
  4. 遍历mhashx,取出PortObject2对象po
  5. 将po->port_list中置位状态保存到数组parray
  6. 在函数PortObjectItemListFromBits中根据parray生成一个PortObjectItem链表plist
  7. 释放po->item_list,使用plist赋值给po->item_list

OrderRuleLists

  1. 调用mSplit,得到toks和num_toks
  2. 遍历num_toks,内部遍历sc->rule_lists node,如果toks[i]和 node->name相同,将节点node从sc->rule_lists上取下,放入链表ordered_list尾部;否则,就跳过node
  3. 遍历sc->rule_lists,将其上剩余的node节点也放入ordered_list尾部
  4. 修改sc->rule_lists为ordered_list

fpCreateFastPacketDetection

  1. 调用fpCreatePortGroups
  2. 调用fpCreateRuleMaps
  3. 调用fpCreateServicePortGroups

fpCreatePortGroups

  1. 分别为p->ip.src,p->ip.dst,p->icmp.src,p->icmp.dst,p->tcp.src,p->tcp.dst,p->udp.src,p->udp.dst,调用 fpCreatePortTablePortGroups
  2. 在fpCreatePortObject2PortGroup中:

遍历pt_mpo_hash表,成员为PortObject2 po,调用fpCreatePortObject2PortGroup,为po创建PortGroup

fpCreatePortObject2PortGroup

  1. PortObject2* po,如果po为空,或者po->rule_hash位空,则返回
  2. 创建一个portgroup
  3. 将pox = po
  4. 遍历pox->rule_hash,取出数据prindex,根据prindex调用parser_get_rule_ids获取gid,sid
  5. 调用OtnLookup获取otn
  6. 如果otn->snort_protocol_id为网络协议,调用fpAddPortGroupRule

调用get_fp_content,获取pmv,如果pmv不为空,则

获取offload_search_api,如果offload_search_api与search_api不相同,则

继续调用get_fp_content,获取pmv_ol,如果pmv_ol不为空,设置add_to_offload为true,否则设置cont为false

如果cont为true,初始化agent,初始化pg->mpsegrp[main_pmd->pm_type],调用pg->mpsegrp[main_pmd->pm_type]->create_normal_mpse(sc, &agent)

如果add_to_offload为true,初始化agent_offload,调用pg->mpsegrp[main_pmd->pm_type]->create_offload_mpse

如果pg->mpsegrp[main_pmd->pm_type]->normal_mpse为true,调用fpFinishPortGroupRule,调用fpAddAlternatePatterns

如果ol_pmd and pg->mpsegrp[main_pmd->pm_type]->offload_mpse为true,则调用fpFinishPortGroupRule,调用fpAddAlternatePatterns

  1. 调用fpFinishPortGroup

fpFinishPortGroup

  1. 如果pg->mpsegrp[i]和pg->mpsegrp[i]->normal_mpse均不为空,调用pg->mpsegrp[i]->normal_mpse->get_pattern_count(),如果返回值不等于0,同时!sc->test_mode() or sc->mem_check()为true,则调用pg->mpsegrp[i]->normal_mpse->prep_patterns(sc);如果返回值等于0,则调用MpseManager::delete_search_engine(pg->mpsegrp[i]->normal_mpse)
  2. 如果pg->mpsegrp[i]->offload_mpse不为空,pg->mpsegrp[i]->offload_mpse->get_pattern_count() != 0且!sc->test_mode() or sc->mem_check(),则调用 pg->mpsegrp[i]->offload_mpse->prep_patterns(sc);否则调用MpseManager::delete_search_engine(pg->mpsegrp[i]->offload_mpse)
  3. 遍历pg->nfp_head,调用otn_create_tree;
  4. 调用finalize_detection_option_tree

snort规则解析源码分析相关推荐

  1. OpenGauss SQL解析源码分析

    OpenGauss SQL解析源码分析 SQL 引擎简介: SQL引擎整个编译的过程如下图所示,在编译的过程中需要对输入的SQL语言进行词法分析.语法分析.语义分析,从而生成逻辑执行计划,逻辑执行计划 ...

  2. openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...

  3. RedBase SQL解析源码分析

    @原创文章,转载请注明: 转载自 镜中影的技术博客 本文链接地址: RedBase SQL解析源码分析) URL:http://blog.csdn.net/linkpark1904/article/d ...

  4. openxr runtime Monado 源码解析 源码分析:CreateSwapchain 画布 HardwareBuffer共享纹理 渲染线程 xrEndeFrame comp_renderer

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...

  5. Redis分布式锁解析源码分析

    Redis分布式锁解析&源码分析 概述 实战 简单的分布式锁 Redisson实现分布式锁 Redission源码分析 构造方法 获取锁lock 解锁 锁失效 红锁 案例分析 原始的写法 进化 ...

  6. dubbo注册服务IP解析异常及IP解析源码分析

    https://www.cnblogs.com/leo-li-3046/p/5702479.html 在使用dubbo注册服务时会遇到IP解析错误导致无法正常访问. 比如: 本机设置的IP为172.1 ...

  7. 开源数据库OpenGauss的SQL解析源码分析

    首发于:blog: openGauss official blog - Gitee.com 一.   OpenGauss数据库体系概述 openGauss是关系型数据库,采用客户端/服务器,单进程多线 ...

  8. 【参赛作品16】openGauss SQL解析源码分析

    作者:梅氵 SQL 引擎简介: SQL引擎整个编译的过程如下图所示,在编译的过程中需要对输入的SQL语言进行词法分析.语法分析.语义分析,从而生成逻辑执行计划,逻辑执行计划经过代数优化和代价优化之后, ...

  9. 【Nginx源码分析】Nginx配置文件解析(一)

    运营研发团队 李乐 配置文件是nginx的基础,对于学习nginx源码甚至开发nginx模块的同学来说更是必须深究.本文将从源码从此深入分析nginx配置文件的解析,配置存储,与配置查找. 看本文之前 ...

最新文章

  1. initWithCoder: 与initWithFrame:
  2. uni-app自定义tabBar;uni-app小程序自定义tabBar;uni-app小程序修改中间tabBar导航栏大小;uni-app中间导航栏凸起;uni-app修改底部导航栏
  3. 关于一类docker容器闪退问题定位
  4. 俞敏洪:新东方业务调整 为农村孩子捐献近八万套课桌椅
  5. html输出json对象属性值,用javascript中的HTML元素值构建JSON对象
  6. 王建宙称乔布斯故意展开TD-LTE版iPhone
  7. 项目管理经验的获取 .
  8. 盘点近年来的各国各行较知名的互联网安全事件
  9. 如何将MAPGIS中的文件转换为SHP格式,及坐标系问题
  10. 大数据应用领域都有哪些(一)
  11. 金盘系统无法连接服务器,西数金盘Gold系列主要面向企业级服务器及存储系统...
  12. 小蜜蜂吉他谱 高八度和低八度
  13. opencv——批量修改图片像素大小
  14. 微信开发——熟悉支付流程
  15. pmp中ram和raci的区别_PMP复习三部曲2020
  16. 100个python算法超详细讲解:递归解决分鱼问题
  17. 招商银行信用卡中心大数据
  18. 设置网页title标签小图标
  19. 大学文秘专业有计算机,大学高级文秘专业描述
  20. ln: creating symbolic link `xxxxxx.cn4‘: File exists

热门文章

  1. AMEYA360电子元器件知识:如何区别普通电阻和保险电阻?
  2. 手机上python编程工具3和3h有区别吗_qpython3h编程 (python手机版)app下载_qpython3h编程 (python手机版) v3.0 安卓版 - D9下载站...
  3. PaddlePaddle | 深度学习 101- 词向量
  4. 计算页面停留时长的另类方式
  5. 云计算与云原生—OpenShift 的架构设计
  6. 电子科技大学820笔记【2011年】
  7. android 闹钟开机启动,Android如何在App中启动系统闹钟
  8. 基于ijkplayer 视频流 播放
  9. c语言的erase函数,[转] C++ STL中map.erase(it++)用法原理解析
  10. 【JavaSE】java中的正则表达式(从0到1学会正则表达式)