libnids常见函数

1:基本函数

int nids_init(void);

函数调用成功返回1,失败返回0;无参数

这个函数功能是对libnids进行初始化,也就是所有基于libnids的程序最开始调用的函数;包含的内容有打开网络接口,打开文件,编译设置过滤规则,判断链路层类型以及其它初始化

部分源码包含的函数调用

665     init_procs();
666     tcp_init(nids_params.n_tcp_streams);
667     ip_frag_init(nids_params.n_hosts);
668     scan_init();

void nids_run(void);

无返回值,无参数

这个函数的功能是运行libnids,进入循环捕获数据包状态;也就是libpcap里的pcap_loop,这个函数源码很短,如下

683 int nids_run()
684 {
685     if (!desc) {
686         strcpy(nids_errbuf, "Libnids not initialized");
687         return 0;
688     }
689     START_CAP_QUEUE_PROCESS_THREAD(); /* threading... */
690     pcap_loop(desc, -1, (pcap_handler) nids_pcap_handler, 0);
691     /* FIXME: will this code ever be called? Don't think so - mcree */
692     STOP_CAP_QUEUE_PROCESS_THREAD();
693     nids_exit();
694     return 0;
695 }

int nids_getfd(void);

无参数;函数操作成功就返回文件描述符,失败返回-1

函数功能是获得文件描述符

int nids_dispatch(int cnt)

参数cnt表示捕获的数据包的个数;函数执行成功就返回个数,失败返回负数

函数功能是调用libpcap里的数据包捕获函数pcap_dispatch()

int nids_next(void);

无参数;函数执行成功返回1,失败返回0

函数功能是调用libpcap里的数据包捕获函数pcap_next()

void nids_register_chksum_ctl(struct nids_chksum_ctl *ptr, int nr);

参数ptr是nids_chksum_ctl列表,参数nr表示列表中的个数;无返回值

函数功能是决定是否计算校验和;根据数据结构nids_chksum_ctl中的action来决定,如果要计算的对象不在列表中,则必须都要计算校验和

2:IP分片函数

void nids_register_ip_frag(void(*));

参数为一个回调函数名;无返回值

函数功能是注册一个能够检测所有IP数据包的回调函数,包括IP分片,比如下面函数调用

nids_register_ip_frag(ip_frag_function);

就注册了一个回调函数ip_frag_function,定义类型如下

void ip_frag_function(struct ip *a_packet, int len);

参数a_packet表示接收的IP数据包,参数len表示接收的数据包的长度

回调函数中可以检测所有的IP数据包,包括IP分片

void nids_register_ip(void (*));

参数为一个回调函数名;无返回值

函数功能是注册一个回调函数,此回调函数可以接收正常IP数据包,如下调用

nids_register_ip(ip_function);

注册一个回调函数ip_function,定义类型如下

void ip_function(struct ip *a_packet);

参数a_packet表示所捕获的IP数据包

回调函数可以接收正常的IP数据包,并在此函数中对捕获到的IP数据包进行分析

3:TCP重组

void nids_register_tcp(void (*));

参数为回调函数;无返回值

函数注册了一个TCP连接的回调函数,类型定义如下

void tcp_callback(struct tcp_stream *ns, void **param);

参数ns表示一个TCP连接的所有信息,类型是tcp_stream数据结构;参数param表示要传递的连接的参数信息,可以指向一个TCP连接的私有数据

该回调函数接收的TCP数据存放在half_stream的缓存中,应该马上取出来,一旦此回调函数返回,此数据缓存中存储的数据就补存在了;half_stream成员offset描述了被丢弃的数据字节数;如果不想马上取出来,而是等到存储到一定数量的数据之后再取出来,那么可以使用nids_discard(struct tcp_stream *a_tcp, int num_bytes)来处理;这样回调函数返回时,libnids将丢弃缓存数据之前的num_bytes字节的数据;如果步调用nids_discard()函数,那么缓存数据的字节应该为count_new字节;一般情况下,缓存中的数据应该是count-offset字节

void nids_killtcp(struct tcp_stream *a_tcp);

参数a_tcp表示一个TCP连接;无返回值

函数功能是终止TCP连接;实际上调用了libnet的函数进行构造数据包,然后发送出去

void nids_discard(struct tcp_stream *a_tcp, int num);

参数a_tcp表示一个TCP连接,参数num表示个数;无返回值

函数的功能是丢弃num字节的TCP数据,用于存储更多的数据

4:UDP注册函数

libnids还提供了UDP协议的分析,注册函数如下

void nids_register_udp(void (*));

参数为一个回调函数名;无返回值

函数功能是注册一个分析UDP协议的回调函数,定义类型如下

void udp_callback(struct tuple4 *addr, char *buf, int len, struct ip *iph);

参数addr表示四元组信息;参数buf表示UDP协议负载数据内容;参数len表示UDP负载数据的长度;参数iph表示一个IP数据包,包括IP首部,UDP首部以及UDP负载内容

定义了之后,就可以在回调函数中对UDP数据包进行分析了

发表回复