(NIDS)网络入侵检测函数接口说明
2014-02-18 17:54
399 查看
网络入侵检测系统(NIDS)函数接口说明
基本函数
u_intnetaddr;
u_int mask;
u_intaction;
u_intreserved;
};
void nids_register_chksum_ctl(struct nids_chksum_ctl*ptr,intnr)
该函数没有返回值。
参数1:ptr
表示结构体nids_chksum_ctl的列表
参数2:nr
表示列表的个数
此函数的功能是决定是否计算校验和。它是根据数据结构nids_chksum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算校验和。
函数返回值:函数调用成功就返回1,失败就返回0。
此函数的功能是对Libnids进行初始化,这是所有设计基于Libnids的程序最开始调用的函数。它的主要内容打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路层类型、进行必要的初始化工作。
TCP数据流重组函数
char state;
char collect;
char collect_urg;
char *data;
intoffset;
intcount;
intcount_new;
intbufsize;
intrmem_alloc;
inturg_count;
u_int acked;
u_int seq;
u_int ack_seq;
u_int first_data_seq;
u_char urgdata;
u_char count_new_urg;
u_char urg_seen;
u_int urg_ptr;
u_short window;
u_char ts_on;
u_char wscale_on;
u_int curr_ts;
u_int wscale;
struct skbuff *list;
struct skbuff *listtail;
};
u_short source;
//源端口
u_short dest;
//目的端口
u_int saddr;
//源IP
u_int daddr;
//目的
IP
};
struct tuple4 addr;
char nids_state;
struct lurker_node *listeners;
struct half_stream client;
struct half_stream server;
struct tcp_stream *next_node;
struct tcp_stream *prev_node;
inthash_index;
struct tcp_stream *next_time;
struct tcp_stream *prev_time;
intread;
struct tcp_stream *next_free;
void *user;
};
tcp_stream数据结构描述了一个TCP连接的完整信息,包括的内容非常丰富,它是Libnids开发包中最重要一个数据结构。
成员client表示客户端信息,成员server表示服务器端信息,它们都是half_stream类型的。这样tcp_stream数据结构就描述了一个完整的TCP连接的所有信息。
调用回调函数后,在回调函数中会判断tcp_stream结构体中的nids_state成员的状态,该成员表示连接的逻辑状态,共有6种状态:
NIDS_JUST_EST:表示TCP连接建立,在此状态下就可以决定是否对此TCP连接进行数据分析,可以决定是否捕获TCP客户端接收的数据、TCP服务器端接收的数据、TCP客户端接收的紧急数据或者TCP服务器端接收的紧急数据;
NIDS_CLOSE:表示TCP连接正常关闭;
NIDS_RESET:表示TCP连接被重置关闭;
NIDS_TIMED_OUT:表示由于超时TCP连接被关闭;
NIDS_EXITING:表示Libnids正在退出,在这个状态下可以最后一次使用存储在half_stream数据结构中的缓存数据;
NIDS_DATA:表示接收数据的状态,在这个状态可以判断是否有新的数据到达,如果有就可以把数据存储起来,可以在这个状态之中来分析TCP传输的数据,此数据就存储在half_stream数据结构的缓存之中。
voidnids_register_tcp(void(*))
函数返回值:无
参数描述:一个回调函数
此函数是注册一个TCP连接的回调函数。回调函数的类型定义如下:
voidtcp_callback(struct tcp_stream*ns,void **param);
其中参数ns表示一个TCP连接的所有信息,它的类型是tcp_stream数据结构;
参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据。
此回调函数接收的TCP数据存放在half_stream的缓存中,应该马上取出来,一旦此回调函数返回,此数据缓存中存储的数据就不存在了。half_stream成员offset描述了被丢弃的数据字节数。如果不想马上取出来,而是等到存储一定数量的数据之后再取出来,那么可以使用函数nids_discard(structtcp_stream*a_tcp.int
num_bytes)来处理。这样,回调函数返回时,Libnids将丢弃缓存数据之前的num_bytes字节的数据。如果不调用nids_discard()函数,那么缓存数据的字节应该为count_new()字节。一般情况下,缓存中的数据应该是count-offset字节(count减去offset)。
///////////////////////////////////////////////////////
struct half_stream
的成员:
count:自连接建立以来已经有多少字节已经发送到data缓冲区中;
offset:保存到data缓冲区中的第一个字节的偏移量
char *data:存储正常接收到的数据
函数返回值:无
参数a_tcp:表示一个TCP连接
参数num:表示个数
此函数的功能是:丢弃num字节TCP数据,用于存储更多的数据。
函数返回值:无
参数描述:无
此函数的功能是运行Libnids,进入循环捕获数据包状态。它实际上是调用Libpcap函数pcap_loop()来循环捕获数据包。
Libnids读书笔记:
Libnids(Library Network
Intrusion
DetectionSystem)网络入侵检测开发包,基于libpcap和libnet开发,是仿照linux内核中的TCP/IP协议部分而实现的。
IP碎片重组是libnids的一个重要内容,是仿照linux内核中的IP重组而实现的,所以非常可靠。
libnids提供了TCP数据流重组功能,这是libpcap所不具备的,利用TCP数据流重组,可以分析基于TCP协议的各种应用层协议。另外,LIBNIDS还提供了检测TCP端口扫描攻击的功能,检测异常数据包的功能,这是入侵检测系统(IDS)最基本的功能。
LIBNIDS的使用范围:
1. 入侵检测系统
2. 网络协议分析
3. 网络嗅探(网络监视)
除此之外利用LIBSNIDS还可以重现网络内容,还原网络数据,如重现HTTP协议中传输的网页、POP3协议中传输的电子邮件等。
LIBNIDS描述的是连接的逻辑状态。真正的TCP连接状态有11种,它们对应于TCP协议的状态变迁图中的各个状态,定义如下:
其中ip_filter函数指针,当IP数据包到达时,默认函数nids_ip_filter被调用,如果此函数返回非零值,此数据包就被处理;如果返回零,就被丢弃。nids_ip_filter函数定义如下:
在LIBNIDS中用nids_prm数据结构定义了一个全部变量nids_params,其定义和初始值如下:
在使用LIBNIDS开发程序时,可以首先对nids_params全局变量的值进行修改,这样对整个libnids就全部有效。
对LIBNIDS进行初始化,主要内容包括打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路类型、进行必要的初始化工作。
获得文件描述符号
参数描述:参数cnt表示捕获的数据包的个数
功能是调用LIBPCAP中的捕获数据包函数pcap_dispatch();
调用LIBPCAP中捕获数据包函数pcap_next();
void nids_register_chksum_ctl(structnids_chksum_ctl *ptr, int nr)
参数描述:参数ptr表示nids_chksum_ctl列表,参数nr表示列表中的个数
决定是否计算检验和。是根据数据结构nids_chjsum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算检验和。
注册一个能够检测所有IP数据包的回调函数,包括IP碎片。例如可用如下方式调用:
nids_register_ip_frag(ip_frag_function);
这样就注册了一个回调函数ip_ftag_function的定义类型如下:
void ip_frag_function(struct ip*a_packet, int len);
其中a_packet表示接受的IP数据包,参数len表示接受的数据包的长度。
此回调函数中可以检测所有的IP数据包,包括IP碎片。
注册一个回调函数,可以接受正常的IP数据包。可以使用如下方式调用:
nids_register_ip(ip_function);
注册一个回调函数ip_function,此回调函数的定义类型如下:
void ip_function(struct ip *a_packet);
其中a_packet表示的是所捕获的IP数据包。
注册一个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字节。
终止TCP连接。实际上是调用LIBNET的函数进行构造数据包,然后发送出去。
丢弃num字节TCP数据,用于存储更多的数据。
注册一个分析UDP协议的回调函数,定义如下:
void udp_callback(struct tuple4*addr, char * buf, int len, struct ip *iph)
addr表示地址端口信息,包括UDP发送端的IP地址和端口,以及UDP接收端额IP地址和端口;buf表示UDP协议负载数据内容;len表示UDP负载数据的长度;iph表示一个IP数据包,包括IP首部、UDP首部以及UDP负载内容。
网络入侵检测系统(NIDS)函数接口说明
基本函数
1、nids_register_chksum_ctl
struct nids_chksum_ctl {u_intnetaddr;
u_int mask;
u_intaction;
u_intreserved;
};
void nids_register_chksum_ctl(struct nids_chksum_ctl*ptr,intnr)
该函数没有返回值。
参数1:ptr
表示结构体nids_chksum_ctl的列表
参数2:nr
表示列表的个数
此函数的功能是决定是否计算校验和。它是根据数据结构nids_chksum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算校验和。
2、nids_init
int nids_init(void)函数返回值:函数调用成功就返回1,失败就返回0。
此函数的功能是对Libnids进行初始化,这是所有设计基于Libnids的程序最开始调用的函数。它的主要内容打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路层类型、进行必要的初始化工作。
TCP数据流重组函数
3、nids_register_tcp
struct half_stream
{char state;
char collect;
char collect_urg;
char *data;
intoffset;
intcount;
intcount_new;
intbufsize;
intrmem_alloc;
inturg_count;
u_int acked;
u_int seq;
u_int ack_seq;
u_int first_data_seq;
u_char urgdata;
u_char count_new_urg;
u_char urg_seen;
u_int urg_ptr;
u_short window;
u_char ts_on;
u_char wscale_on;
u_int curr_ts;
u_int wscale;
struct skbuff *list;
struct skbuff *listtail;
};
struct tuple4
{u_short source;
//源端口
u_short dest;
//目的端口
u_int saddr;
//源IP
u_int daddr;
//目的
IP
};
struct tcp_stream
{struct tuple4 addr;
char nids_state;
struct lurker_node *listeners;
struct half_stream client;
struct half_stream server;
struct tcp_stream *next_node;
struct tcp_stream *prev_node;
inthash_index;
struct tcp_stream *next_time;
struct tcp_stream *prev_time;
intread;
struct tcp_stream *next_free;
void *user;
};
tcp_stream数据结构描述了一个TCP连接的完整信息,包括的内容非常丰富,它是Libnids开发包中最重要一个数据结构。
成员client表示客户端信息,成员server表示服务器端信息,它们都是half_stream类型的。这样tcp_stream数据结构就描述了一个完整的TCP连接的所有信息。
调用回调函数后,在回调函数中会判断tcp_stream结构体中的nids_state成员的状态,该成员表示连接的逻辑状态,共有6种状态:
NIDS_JUST_EST:表示TCP连接建立,在此状态下就可以决定是否对此TCP连接进行数据分析,可以决定是否捕获TCP客户端接收的数据、TCP服务器端接收的数据、TCP客户端接收的紧急数据或者TCP服务器端接收的紧急数据;
NIDS_CLOSE:表示TCP连接正常关闭;
NIDS_RESET:表示TCP连接被重置关闭;
NIDS_TIMED_OUT:表示由于超时TCP连接被关闭;
NIDS_EXITING:表示Libnids正在退出,在这个状态下可以最后一次使用存储在half_stream数据结构中的缓存数据;
NIDS_DATA:表示接收数据的状态,在这个状态可以判断是否有新的数据到达,如果有就可以把数据存储起来,可以在这个状态之中来分析TCP传输的数据,此数据就存储在half_stream数据结构的缓存之中。
voidnids_register_tcp(void(*))
函数返回值:无
参数描述:一个回调函数
此函数是注册一个TCP连接的回调函数。回调函数的类型定义如下:
voidtcp_callback(struct tcp_stream*ns,void **param);
其中参数ns表示一个TCP连接的所有信息,它的类型是tcp_stream数据结构;
参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据。
此回调函数接收的TCP数据存放在half_stream的缓存中,应该马上取出来,一旦此回调函数返回,此数据缓存中存储的数据就不存在了。half_stream成员offset描述了被丢弃的数据字节数。如果不想马上取出来,而是等到存储一定数量的数据之后再取出来,那么可以使用函数nids_discard(structtcp_stream*a_tcp.int
num_bytes)来处理。这样,回调函数返回时,Libnids将丢弃缓存数据之前的num_bytes字节的数据。如果不调用nids_discard()函数,那么缓存数据的字节应该为count_new()字节。一般情况下,缓存中的数据应该是count-offset字节(count减去offset)。
///////////////////////////////////////////////////////
struct half_stream
的成员:
count:自连接建立以来已经有多少字节已经发送到data缓冲区中;
offset:保存到data缓冲区中的第一个字节的偏移量
char *data:存储正常接收到的数据
3.1 nids_discard
void nids_discard (structtcp_stream *a_tcp, int num);函数返回值:无
参数a_tcp:表示一个TCP连接
参数num:表示个数
此函数的功能是:丢弃num字节TCP数据,用于存储更多的数据。
4、nids_run
void nids_run(void);函数返回值:无
参数描述:无
此函数的功能是运行Libnids,进入循环捕获数据包状态。它实际上是调用Libpcap函数pcap_loop()来循环捕获数据包。
Libnids读书笔记:
Libnids(Library Network
Intrusion
DetectionSystem)网络入侵检测开发包,基于libpcap和libnet开发,是仿照linux内核中的TCP/IP协议部分而实现的。
libnids主要功能:
捕获网络数据包、IP碎片重组、TCP数据流重组以及端口扫描攻击检测和异常数据包检测等。IP碎片重组是libnids的一个重要内容,是仿照linux内核中的IP重组而实现的,所以非常可靠。
libnids提供了TCP数据流重组功能,这是libpcap所不具备的,利用TCP数据流重组,可以分析基于TCP协议的各种应用层协议。另外,LIBNIDS还提供了检测TCP端口扫描攻击的功能,检测异常数据包的功能,这是入侵检测系统(IDS)最基本的功能。
LIBNIDS的使用范围:
1. 入侵检测系统
2. 网络协议分析
3. 网络嗅探(网络监视)
除此之外利用LIBSNIDS还可以重现网络内容,还原网络数据,如重现HTTP协议中传输的网页、POP3协议中传输的电子邮件等。
LIBNIDS数据结构
基本常量
1.报警类型
下面是在LIBSNIDS中定义的警告描述常量2. LIBNIDS状态
在对TCP数据流进行重组时,必须考虑到TCP的连接状态,在LIBNIDS中为了方便开发而定义了LIBNIDS状态,共有如下6种:LIBNIDS描述的是连接的逻辑状态。真正的TCP连接状态有11种,它们对应于TCP协议的状态变迁图中的各个状态,定义如下:
3.校验和
实现了关于是否计算校验和的功能tuple4
是LIBNIDS中最基本的一种数据结构half_stream
用来描述TCP连接中一端的所有信息,客户端或服务器端。tcp_stream
是一个TCP连接的所有信息nids_prm
描述了LIBNIDS的一些全局参数信息其中ip_filter函数指针,当IP数据包到达时,默认函数nids_ip_filter被调用,如果此函数返回非零值,此数据包就被处理;如果返回零,就被丢弃。nids_ip_filter函数定义如下:
在LIBNIDS中用nids_prm数据结构定义了一个全部变量nids_params,其定义和初始值如下:
在使用LIBNIDS开发程序时,可以首先对nids_params全局变量的值进行修改,这样对整个libnids就全部有效。
nids_chksum_ctl
描述的是计算检验和LIBNIDS函数
1.基本函数
int nids_init(void);
函数返回值:函数调用成功返回1,失败返回0对LIBNIDS进行初始化,主要内容包括打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路类型、进行必要的初始化工作。
void nids_run(void);
欲行LIBNIDS,进入循环捕获数据包状态。实际上是调用LIBPCAP函数pcap_loop()来循环捕获数据包。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(structnids_chksum_ctl *ptr, int nr)
参数描述:参数ptr表示nids_chksum_ctl列表,参数nr表示列表中的个数
决定是否计算检验和。是根据数据结构nids_chjsum_ctl中的action进行决定的,如果所要计算的对象不在列表中,则必须都要计算检验和。
2.IP碎片函数
void nids_register_ip_frag(void(*));
参数描述:参数应该是一个回调函数的名字注册一个能够检测所有IP数据包的回调函数,包括IP碎片。例如可用如下方式调用:
nids_register_ip_frag(ip_frag_function);
这样就注册了一个回调函数ip_ftag_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数据包。
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表示地址端口信息,包括UDP发送端的IP地址和端口,以及UDP接收端额IP地址和端口;buf表示UDP协议负载数据内容;len表示UDP负载数据的长度;iph表示一个IP数据包,包括IP首部、UDP首部以及UDP负载内容。
相关文章推荐
- libnet、libnids、libpcap轻松搭建Linux网络入侵检测系统
- Libnids 网络入侵检测开发包
- 网络入侵检测开发包Libnids
- Snort 网络入侵检测系统(三)构建 Snort+Base NIDS 系统
- 如何辨别网络入侵检测系统(IDS)的性能
- RHEL5下构建Snort网络入侵检测系统
- 【转】Linux下获取第一个网络接口名称的函数实现
- 关于网络接口及配置工具说明;
- Snort 网络入侵检测系统(一)之IDS 介绍
- 天下数据浅析网络入侵检测系统
- 网络入侵检测
- 从僵尸网络追踪到入侵检测 第2章 检测环境
- 用C/C++实现linux下检测网络接口状态
- 从僵尸网络追踪到入侵检测 第5章 使用Honeyd创建防御路由模板
- C#中虚函数,抽象,接口的简单说明
- 网络入侵检测规避工具fragrouter
- Snort 网络入侵检测系统(二)之Snort 介绍
- Snort 网络入侵检测系统(四)之构建安全图形分析引擎
- 【网络编程】调用GetNumberOfInterfaces()函数获取本地计算机的网络接口数量
- Linux网络编程入门必备函数说明