📄 374.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="370.htm">上一层</a>][<a href="375.htm">下一篇</a>]
<hr><p align="left"><small>发信人: shuke (莫失莫忘), 信区: Security <br>
标 题: snort源码分析(3) <br>
发信站: BBS 水木清华站 (Sun Oct 8 15:51:03 2000) <br>
<br>
<br>
下面描述main函数的工作流程。先来说明两个结构的定义。 <br>
<br>
在snort.h中,定义了两个结构:PV和PacketCount。PV用来记录命令行参数, <br>
snort根据这些命令行参数来确定其工作方式。PV类型的全局变量pv用来实际记录具体 <br>
工作方式。结构定义可以参看snort.h,在下边的main函数中,会多次遇到pv中各个域 <br>
的设定,到时再一个一个解释。 <br>
<br>
结构PacketCount用来统计流量,每处理一个数据包,该结构类型的全局变量pc <br>
把对应的域加1。相当于一个计数器。 <br>
<br>
<br>
接下来解释main函数。 <br>
<br>
初始化设定一些缺省值;然后解析命令行参数,根据命令行参数,填充结构变 <br>
量pv;根据pv的值(也就是解析命令行的结果)确定工作方式,需要注意: <br>
<br>
如果是运行在Daemon方式,通过GoDaemon函数,创建守护进程,重定向标准输入 <br>
输出,实现daamon状态,并结束父进程。 <br>
<br>
snort可以实时采集网络数据,也可以从文件读取数据进行分析。这两种情况并 <br>
没有本质区别。如果是读取文件进行分析(并非直接从网卡实时采集来的),以该文 <br>
件名作为libpcap的函数OpenPcap的参数,打开采集过程;如果是从网卡实时采集, <br>
就把网卡接口作为OpenPcap的参数,利用libpcap的函数打开该网卡接口。在unix中, <br>
设备也被看作是文件,所以这和读取文件分析没有多大的差别。 <br>
<br>
接着,指定数据包的拆包函数。不同的数据链路网络,拆包的函数也不同。利用 <br>
函数SetPktProcessor,根据全局变量datalink的值,来设定不同的拆包函数。例如, <br>
以太网,拆包函数为DecodeEthPkt;令牌环网,拆包函数为DecodeTRPkt,等等。这些 <br>
Decode*函数,在decode.c中实现。 <br>
<br>
如果使用了检测规则,那么下面就要初始化这些检测规则,并解析规则文件,转 <br>
化成规则链表。规则有三大类:预处理(preprocessor),插件(plugin),输出插 <br>
件(outputplugin)。这里plugin就是具体的检测规则,而outputplugin是定义日志 <br>
和报警方式的规则。 <br>
<br>
然后根据报警模式,设定报警函数;根据日志模式,设定日志函数;如果指定了 <br>
能够进行响应,就打开raw socket,准备用于响应。 <br>
<br>
最后进入读取数据包的循环,pcap_loop对每个采集来的数据包都用ProcessPacket <br>
函数进行处理,如果出现错误或者到达指定的处理包数(pv.pkt_cnt定义),就退出 <br>
该函数。这里ProcessPacket是关键程序, <br>
<br>
最后,关闭采集过程。 <br>
<br>
<br>
-- <br>
<br>
垆边人似月,皓腕凝霜雪 <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="370.htm">上一层</a>][<a href="375.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -