荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (清风浮云 人生), 信区: Linux
标  题: snort源码分析(3)(转寄)
发信站: BBS 荔园晨风站 (Tue Oct 10 08:38:59 2000), 站内信件

【 以下文字转载自 georgehill 的信箱 】
【 原文由 georgehill.bbs@smth.org 所发表 】
发信人: shuke (莫失莫忘), 信区: Security
标  题: snort源码分析(3)(转寄)
发信站: BBS 水木清华站 (Sun Oct  8 15:51:03 2000)


    下面描述main函数的工作流程。先来说明两个结构的定义。

    在snort.h中,定义了两个结构:PV和PacketCount。PV用来记录命令行参数,
snort根据这些命令行参数来确定其工作方式。PV类型的全局变量pv用来实际记录具体
工作方式。结构定义可以参看snort.h,在下边的main函数中,会多次遇到pv中各个域
的设定,到时再一个一个解释。

    结构PacketCount用来统计流量,每处理一个数据包,该结构类型的全局变量pc
把对应的域加1。相当于一个计数器。


    接下来解释main函数。

    初始化设定一些缺省值;然后解析命令行参数,根据命令行参数,填充结构变
量pv;根据pv的值(也就是解析命令行的结果)确定工作方式,需要注意:

    如果是运行在Daemon方式,通过GoDaemon函数,创建守护进程,重定向标准输入
输出,实现daamon状态,并结束父进程。

    snort可以实时采集网络数据,也可以从文件读取数据进行分析。这两种情况并
没有本质区别。如果是读取文件进行分析(并非直接从网卡实时采集来的),以该文
件名作为libpcap的函数OpenPcap的参数,打开采集过程;如果是从网卡实时采集,
就把网卡接口作为OpenPcap的参数,利用libpcap的函数打开该网卡接口。在unix中,
设备也被看作是文件,所以这和读取文件分析没有多大的差别。

    接着,指定数据包的拆包函数。不同的数据链路网络,拆包的函数也不同。利用
函数SetPktProcessor,根据全局变量datalink的值,来设定不同的拆包函数。例如,
以太网,拆包函数为DecodeEthPkt;令牌环网,拆包函数为DecodeTRPkt,等等。这些
Decode*函数,在decode.c中实现。

    如果使用了检测规则,那么下面就要初始化这些检测规则,并解析规则文件,转
化成规则链表。规则有三大类:预处理(preprocessor),插件(plugin),输出插
件(outputplugin)。这里plugin就是具体的检测规则,而outputplugin是定义日志
和报警方式的规则。

    然后根据报警模式,设定报警函数;根据日志模式,设定日志函数;如果指定了
能够进行响应,就打开raw socket,准备用于响应。

    最后进入读取数据包的循环,pcap_loop对每个采集来的数据包都用ProcessPacket
函数进行处理,如果出现错误或者到达指定的处理包数(pv.pkt_cnt定义),就退出
该函数。这里ProcessPacket是关键程序,

    最后,关闭采集过程。


--

      垆边人似月,皓腕凝霜雪


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.69.59]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店