中。
各种输出插件用于各种不同的功能。
输出插件是 Snort 的主要瓶颈。
Snort 能对包进行快速读取和处理,但在试图写入一个慢速数据库或通过网络写入是却力不从心。
数据库输出插件不能用于高带宽环境。
建议配置Snort 以统一格式输出并且由 Snort 的标准日志应用程序 Barnyard 接管输出。
Snort 有 12 种输出插件,他们以不同格式输出数据。
(类型参见《Snort 入侵检测使用解决方案》第 48 -51 页)4.2.7 日志模块 实现按各种报文日志功能,也就是把各类的报文记录到各种类型的日志中。
4.2.8 辅助模块 程序运行运用了一些辅助模块:书结构定义子模块定义了集中 snort 使用到的二叉树结构和相关的处理函数,tag 处理子模块完成了和 tag 相关的功能,灵位一些子模块也提供了一些公用的函数,如字符串处理等。
5 Snort 源代码整体结构 Snort 源代码文件书写的非常规范,每个函数前都有英文的详细注释,所以下面我只是简要的分析功能,每个源代码文件的名说明了它的具体实现功能概要,在参见内部的英文注释就会很清楚5.1 按模块5.1.1 主控模块snort.ch 主程序所在的文件,实现了 main 函数和一系列辅助函数。
完成命令行参数解析,全局变量的 解析,各种处理模块的初始化,检测规则的解析,libpcap 库的初始化,启动数据包解码和处 理进程。
plugbase.ch 实现了初始化检测以及登记检测规则的一组函数,完成所有插件的管理和服务功能,包括所有 插件的安装,初始化函数以及部分插件使用的一些公共函数。
snort 中的检测规则以链表的形 式存储,每条规则通过登记(Register)过程添加到链表中。
5.1.2 包解码模块decode.ch 把数据包层层剥开,完成报文的解码过程,确定 pcap 从网络上捕捉到的报文格式 struce pcap_pkthdr 解码成 snort 内部格式 packet,即分析该包属于何种协议,有什么特征。
并标 记到全局结构变量 pv 中。
可以实现对各种链路层的解码以及对 ip、ipv6、arp、tcp、udp、icmp、 ipx 等协议的解码。
5.1.3 规则处理模块rules.ch 实现了规则设置和入侵检测所需要的函数。
规则设置主要的作用是把一个规则文件转化为实际 运作中的规则链表。
检测函数根据规则实施攻击特征的检测。
parser.ch 辅助完成与规则相关处理的功能。
5.1.4 预处理模块(插件)spp_.c.h( preprocessors 目录下) 实现预处理(preprocess)规则。
包括 http 解码(即把 http 请求中的XX 这样的字 符用对应的 ascii 字符代替,避免忽略了恶意的请求) 、最小片断检查(避免恶意利 用 tcp 协议中重组的功能)和端口扫描检测。
5.1.5 检测引擎模块(插件)fpcreate.ch 构建快速规则匹配引擎Preprocessors 目录下所有sp__check.c.h (detection-plugins 目录下) 是不同类型的检测规则的具体实现。
很容易就可以从文件名得知所实现的规则。
例 如,sp_dsize_check 针对的是包的数据大小,sp_icmp_type_check 针对 icmp 包的类 型,sp_tcp_flag_check 针对 tcp 包的标志位。
不再详述。
5.1.6 输出模块(插件)output-plugins 目录下所有,13 对.c 和.h 文件spo_.c.h 实现输出 (output)规则。
spo_alert_syslog 把事件记录到 syslog 中;spo_log_tcpdump 利用 libpcap 中的日志函数,进行日志记录。
5.1.7 日志模块log.c.h 实现日志和报警功能。
snort 有多种日志格式,一种是按 tcpdump 二进制的格式存 储,另一种按 snort 编码的 ascii 格式存储在日志目录下,日志目录的名字根据外 主机的 ip 地址命名。
报警有不同的级别和方式,可以记录到 syslog 中,或者记录 到用户指定的文件,另外还可以通过 unix socket 发送报警消息,以及利用 SMB 向 Windows 系统发送 winpopup 消息。
5.1.8 辅助模块checksum.h 实现校验和算法codes.ch 只有一个函数 init_codes,其功能是将 unicode_data 的内容添加到 codes65536字符 数组中。
由 spp_unidecode 预处理器调用,进行 unicode 解码初始化。
定义了 unicode_entry 结构以及 unicode_entry 类型的数组 unicode_data,该数组包含建立 unicode 与 ASCII 码之间映射所需要的数据。
debug.ch 对 debug 级别定义和参数变量的格式化输出。
mstring.ch 字符串处理。
snprintf.ch 定义了一些增强的输出函数。
(configure 定义是否使用)strlcatu.ch 只有一个函数 strlcatchar dst const char src size_t siz,把 src 字符串追加到 dst 的后面,siz 用来限制 sdt 的最终长度strlcpyu.ch 把 只有一个函数 strlcpychar dst const char src size_t siz, src 字符拷贝到 dst,siz 用来限定复制的长度。
ubi_BinTree.ch 实现二叉树。
ubi_SplayTree.ch 实现伸展二叉树和相关功能 (伸展二叉树是二叉树的一个特例, 它的特点是每当一 个节点被访问时,就对树的结构进行重新排列。
。
)tag.ch 在规则匹配之后进行更多的相关信息记录,以便对后面的数据进行分析。
5.2 按文件夹需要分析的源代码分类(例子的目录夹排除在外)目录 子 子目录名 主要功能 子 子文件夹名称 .h .c 文 名 目 文 文 件 录 件 件 数 数 夹 数 量 量Snort 7 所有模块 46 30 的初始化、 命令行解 释、配置文 件解释等 detection-plugins 实现检测 无 32 32 引擎插件 dynamic-plugins 动态插件, 有 7 3 含快速模 sf_engine 3 11 式匹配 dynamic-preprocessors 动态预处 有 0 0 理 dcerpc 10 7 dns 2 1 ftptelnet 21 13 sf_dynamic_initialize smtp 8 7 ssh 1 2 output-plugins 输出插件 无 13 13 parser IP 分析程 无 1 1 序 preprocessors 预处理 有 23 22 在 Flow,HttpInspect,Stream5 三个 目录下有还有多个子目录,没有详细 统计 sfutil 快速模式 无 22 19 匹配的一 些基础函 数6 代码解读建议 大家可能对 Unix 下的代码分析方式不熟悉或者不习惯,我们在分析 snort 的时候可以现在 windows 下分析,snort 现在支持跨平台的搭建,区别就是有些库函数因为操作系统的不同用的不一样,不过功能很接近。
这对于我们理解 snort 的机制和分析源代码大有帮助,不熟悉的成员可以根据自己的喜好在 windows 环境下进行代码的分析,增加了标注的源代码在 unix 环境下解读时,会方便很多。
Windows 下环境介绍: Winxp VC6.0 VC 的红番茄插件打开 windows 环境下的工程的步骤: 打开源代码文件 win32 WIN32-Prj snort.dsw7 部分缩写Sp snort plugin snort 插件spp Snort plugin preprocessors snort 预处理插件str stream 流
上一篇:
常见汇编程序源代码示例
下一篇:
经腹腔镜治疗异位妊娠的护理论文