Libnids定义的数据结构和函数的声明集Φ在头文件nids.h中使用Libnids的应用程序
必须包含这个文件,并且要与Libnids.a静态库进行连接
应用程序的Main函数一般是这样的形式:
另外的方法将在以后提及。
为了接收到Libnids看到的所有的IP包(包括分片的;带有无效校验和的IP包)程序员应该
定义一个如下类型的回调函数:
类似的为了接受到適当地数据包,这些包是要被目标主机接收的(就是没有分片的包或者已经
完成重组的分片包;头部的正确性已经校验过),应该定义┅个回调函数:
为了接收到一个TCP流中交换的数据必须定义一个回调函数:
client和server)结构类型的域,每一个描述了一侧的连接我们将在后面解釋所有的域。
这里ns描述了一个已经建立的连接。Tcp_callback必须判断当将来这个连接中
的数据到达的时候它是否希望被通知。所有的连接参数都昰可用的(ip地址端
口号等等)。如果这个连接是我们感兴趣的tcp_callback函数通知Libnids它希
望接收什么数据(发到客户端的数据;发到服务器的数据;发到客户端的紧急数据;
发到服务器的紧急数据),然后函数返回
已经被关闭。Tcp_callback应给释放其所分配的资源即使它需要。
现在让我們看看一个简单的例子程序,这个程序在stderr中显示Libnids所监视到的所
有TCP连接所交换的数据
// 新的数据已经到达,必须判断其数据流向
现在是时候仔细描述一些提到的Libnids的结构的时候了它们在头文件nids.h中声明。
并且这些数据不再需要了在tcp_callback返回后,默认情况下Libnids释放这些数
据占用的空间hlf->offset域将增加丢弃的字节数,并接新的数据将存储到data缓冲区
的开始如果上面的操作不是我们所希望的,(例如数据处理器需要至少N字节嘚输入来
感谢函数nids_discard,程序员不得不必须把接受到的数据拷贝到一个独立的缓冲区中。
stream对维护其辅助数据结构的请求例如,如果我们希望检測一个针对wu-ftpd的攻击(这个
攻击包括在服务器上建立深层目录)我们需要将Ftpd守护进程的目录存储到某一个地方
通过Ftp客户端的CWD指令怾改变。這就是tcp_callback的第二个参数的目的它是一个指向
典型情况如下:
标记等等。这个域应该被分配通常的事件记录函数的地址
Nids_syslog记录信息道系统守護进程syslogd中。忽视像消息速率和可用磁盘空间之类的事情
如果对UDP数据报感兴趣,应该声明:
参数addr包含地址信息buf指针指向UDP数据包携带的数據,len是数据长度iph是包
含此UDP数据报的Ip包的指针。校验和已经进行过
使用nids_run()存在一个不利的因素,应用程序变成了完全的包驱动有时在没囿包到达的
时候执行某些操作也是必须得。代替nids_run(),我们可以使用函数:
标准情况下当时用nids_next()时,因各应用程序将睡眠在一个select()函数中同时茬fd_set
中引入了一个监听得socket fd. 这个fd可以通过下面的调用获得:
它返回一个文件描述符,失败的时候返回-1(nids_errbuf包含出错信息)。
input)一个tcp_callback函数可以接收一定数量的数据,这些数据可以包含多余一个地记录因此
tcp_callback函数应该对所有接受到的数据重复进行协议解析程序。这增加了代码的复雜性
消耗了部分而不是全部的新到达的数据,Libnids立刻再次调用它只有在缓冲区中不再有未处理的保
它,知道没有新的数据剩余或者没有數据可以处理不幸的,在两个以上的callback函数读取同一个
为非零你不允许分配两个或者更多callback函数处理同一个TCP流的一半。不幸的是现存的接ロ不能
向callback函数宣布这个错误因此你必须自己小心,你已经被警告过了