libnids 安装抓的是哪层的包

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 3, 距离下一级还需 197 积分
论坛徽章:0
libnids读取离线pcap文件是使用哪个底层函数,读文件的时候可以实现TCP流重组吗
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
白手起家, 积分 27, 距离下一级还需 173 积分
论坛徽章:0
初始化时,设置nids_params.filename = &你实际抓包的文件名&,就OK了
当然可以了,和实际在线抓取方式无区别
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处libnids(5)

哈希的键值
在Libnids中对tcp数据流的哈希关键字是“源IP、源端口、目的IP、目的端口”:
&&struct&tuple4&&&&&&&&&{&&&&u_short&&&&&&&&u_short&&&&&&&&&&u_int&&&&&&&&&&&u_int&&&&&&&&&};&&
//该结构描述地址及端口
struct tuple4
//目的端口
哈希表结构
这里的哈希表是由tcp_stream_table定义的:
static&struct&tcp_stream&**tcp_stream_&&
static struct tcp_stream **tcp_stream_&&&&&& tcp_stream_table存放的是指针,这些指针分别指向了一个双向链表,双向链表的节点存的是一个个的tcp_stream,而tcp_stream里含有指针,指向了half_stream;在half_stream里存放的才是tcp流的数据。每次一个新的tcp数据流到达,将其插入到双向链表的表头位置。
哈希函数及哈希表长度
文件“tcp.c&中通过如下函数实现哈希,它调用的函数mkhash在源文件hash.c中,参考文章:
&&&&static&int&&mk_hash_index(struct&tuple4&addr)&&{&&&&int&hash=mkhash(addr.saddr,&addr.source,&addr.daddr,&addr.dest);&&&&return&hash&%&tcp_stream_table_&&}&&
//该函数调用mkhash将源/目的IP和端口号hash为一个int数,该数已经
//具有了足够的随机性,然后在通过取余操作得到其在哈希表中的位置
static int
mk_hash_index(struct tuple4 addr)
int hash=mkhash(addr.saddr, addr.source, addr.daddr, addr.dest);
return hash % tcp_stream_table_
}某次捕获并还原tcp数据流之前,将mk_hash_index函数添加如下输出信息,重新安装Libnids(安装过程参考):
static&int&&mk_hash_index(struct&tuple4&addr)&&{&&&&struct&sockaddr_in&saddr,&&&&&saddr.sin_addr.s_addr&=&addr.&&&&daddr.sin_addr.s_addr&=&addr.&&&&char&ip[20];&&&&printf(&ip,&port:&%s&%d,&%s&%d\n&,&inet_ntoa(saddr.sin_addr),&addr.source,&&&&&&&&&&&&&inet_ntop(AF_INET,&&daddr.sin_addr,ip,sizeof(ip)),&addr.dest);&&&&int&hash=mkhash(addr.saddr,&addr.source,&addr.daddr,&addr.dest);&&&&printf(&hash:&%d,&tcp_stream_table_size#:&%d\n\n&,&hash,&tcp_stream_table_size);&&&&return&hash&%&tcp_stream_table_&&}&&
static int
mk_hash_index(struct tuple4 addr)
struct sockaddr_in saddr,
saddr.sin_addr.s_addr = addr.
daddr.sin_addr.s_addr = addr.
char ip[20];
printf(&ip, port: %s %d, %s %d\n&, inet_ntoa(saddr.sin_addr), addr.source,
inet_ntop(AF_INET, &daddr.sin_addr,ip,sizeof(ip)), addr.dest);
int hash=mkhash(addr.saddr, addr.source, addr.daddr, addr.dest);
printf(&hash: %d, tcp_stream_table_size#: %d\n\n&, hash, tcp_stream_table_size);
return hash % tcp_stream_table_
}此时捕获并还原tcp流,可以得到如下的部分截图信息:由图可以看出,哈希表长度为1040,以及每次hash后的数值:
哈希表的查找
struct&tcp_stream&*&&find_stream(struct&tcphdr&*&this_tcphdr,&struct&ip&*&this_iphdr,&&&&&&&&&&int&*from_client)&&{&&&&struct&tuple4&this_addr,&&&&&struct&tcp_stream&*a_&&&&&&this_addr.source&=&ntohs(this_tcphdr-&th_sport);&&&&this_addr.dest&=&ntohs(this_tcphdr-&th_dport);&&&&this_addr.saddr&=&this_iphdr-&ip_src.s_&&&&this_addr.daddr&=&this_iphdr-&ip_dst.s_&&&&a_tcp&=&nids_find_tcp_stream(&this_addr);&&&&if&(a_tcp)&{&&&&&&*from_client&=&1;&&&&&&return&a_&&&&}&&&&reversed.source&=&ntohs(this_tcphdr-&th_dport);&&&&reversed.dest&=&ntohs(this_tcphdr-&th_sport);&&&&reversed.saddr&=&this_iphdr-&ip_dst.s_&&&&reversed.daddr&=&this_iphdr-&ip_src.s_&&&&a_tcp&=&nids_find_tcp_stream(&reversed);&&&&if&(a_tcp)&{&&&&&&*from_client&=&0;&&&&&&return&a_&&&&}&&&&return&0;&&}&&
struct tcp_stream *
find_stream(struct tcphdr * this_tcphdr, struct ip * this_iphdr,
int *from_client)
struct tuple4 this_addr,
struct tcp_stream *a_
this_addr.source = ntohs(this_tcphdr-&th_sport);
this_addr.dest = ntohs(this_tcphdr-&th_dport);
this_addr.saddr = this_iphdr-&ip_src.s_
this_addr.daddr = this_iphdr-&ip_dst.s_
a_tcp = nids_find_tcp_stream(&this_addr);
if (a_tcp) {
*from_client = 1;
reversed.source = ntohs(this_tcphdr-&th_dport);
reversed.dest = ntohs(this_tcphdr-&th_sport);
reversed.saddr = this_iphdr-&ip_dst.s_
reversed.daddr = this_iphdr-&ip_src.s_
a_tcp = nids_find_tcp_stream(&reversed);
if (a_tcp) {
*from_client = 0;
struct&tcp_stream&*&&nids_find_tcp_stream(struct&tuple4&*addr)&&{&&&&int&hash_&&&&struct&tcp_stream&*a_&&&&&&hash_index&=&mk_hash_index(*addr);&&&&for&(a_tcp&=&tcp_stream_table[hash_index];&&&&&&&&&a_tcp&&&&memcmp(&a_tcp-&addr,&addr,&sizeof&(struct&tuple4));&&&&&&&&&a_tcp&=&a_tcp-&next_node);&&&&return&a_tcp&?&a_tcp&:&0;&&}&&
struct tcp_stream *
nids_find_tcp_stream(struct tuple4 *addr)
struct tcp_stream *a_
hash_index = mk_hash_index(*addr);
for (a_tcp = tcp_stream_table[hash_index];
a_tcp && memcmp(&a_tcp-&addr, addr, sizeof (struct tuple4));
a_tcp = a_tcp-&next_node);
return a_tcp ? a_tcp : 0;
哈希表的插入
&&&&&&& 如果一个数据报是正常的数据报,但是在哈希表中没有找到该数据报对应的数据流(这是三次握手的第一个数据报,标志着一个新的tcp连接的开始),那么就使用该函数添加该数据报到哈希表中。哈希表处理冲突的方法是使用双向链表,如果新来的tcp流发生冲突,将这个新tcp流插入到双向链表的表头。
static&void&&add_new_tcp(struct&tcphdr&*&this_tcphdr,&struct&ip&*&this_iphdr)&&{&&&&struct&tcp_stream&*&&&&struct&tcp_stream&*a_&&&&int&hash_&&&&struct&tuple4&&&&&&&&&addr.source&=&ntohs(this_tcphdr-&th_sport);&&&&addr.dest&=&ntohs(this_tcphdr-&th_dport);&&&&addr.saddr&=&this_iphdr-&ip_src.s_&&&&addr.daddr&=&this_iphdr-&ip_dst.s_&&&&hash_index&=&mk_hash_index(addr);&&&&&&&&&&&&if&(tcp_num&&&max_stream)&{&&&&&&struct&lurker_node&*i;&&&&&&int&orig_client_state=tcp_oldest-&client.&&&&&&tcp_oldest-&nids_state&=&NIDS_TIMED_OUT;&&&&&&for&(i&=&tcp_oldest-&&i;&i&=&i-&next)&&&&&&&&(i-&item)&(tcp_oldest,&&i-&data);&&&&&&nids_free_tcp_stream(tcp_oldest);&&&&&&if&(orig_client_state!=TCP_SYN_SENT)&&&&&&&&nids_params.syslog(NIDS_WARN_TCP,&NIDS_WARN_TCP_TOOMUCH,&ugly_iphdr,&this_tcphdr);&&&&}&&&&a_tcp&=&free_&&&&if&(!a_tcp)&{&&&&&&fprintf(stderr,&&gdb&me&...\n&);&&&&&&pause();&&&&}&&&&free_streams&=&a_tcp-&next_&&&&&&&&tcp_num++;&&&&&&&&&&tolink&=&tcp_stream_table[hash_index];&&&&memset(a_tcp,&0,&sizeof(struct&tcp_stream));&&&&a_tcp-&hash_index&=&hash_&&&&a_tcp-&addr&=&&&&&a_tcp-&client.state&=&TCP_SYN_SENT;&&&&a_tcp-&client.seq&=&ntohl(this_tcphdr-&th_seq)&+&1;&&&&a_tcp-&client.first_data_seq&=&a_tcp-&client.&&&&a_tcp-&client.window&=&ntohs(this_tcphdr-&th_win);&&&&a_tcp-&client.ts_on&=&get_ts(this_tcphdr,&&a_tcp-&client.curr_ts);&&&&a_tcp-&client.wscale_on&=&get_wscale(this_tcphdr,&&a_tcp-&client.wscale);&&&&a_tcp-&server.state&=&TCP_CLOSE;&&&&a_tcp-&next_node&=&&&&&a_tcp-&prev_node&=&0;&&&&if&(tolink)&&&&&&tolink-&prev_node&=&a_&&&&tcp_stream_table[hash_index]&=&a_&&&&a_tcp-&next_time&=&tcp_&&&&&a_tcp-&prev_time&=&0;&&&&if&(!tcp_oldest)&&&&&&tcp_oldest&=&a_&&&&if&(tcp_latest)&&&&&&tcp_latest-&prev_time&=&a_&&&&tcp_latest&=&a_&&&&}&&
static void
add_new_tcp(struct tcphdr * this_tcphdr, struct ip * this_iphdr)
struct tcp_stream *
struct tcp_stream *a_
struct tuple4
addr.source = ntohs(this_tcphdr-&th_sport);
addr.dest = ntohs(this_tcphdr-&th_dport);
addr.saddr = this_iphdr-&ip_src.s_
addr.daddr = this_iphdr-&ip_dst.s_
hash_index = mk_hash_index(addr);
//如果该tcp流中数据报数量超过了阈值,需要先释放空间
if (tcp_num & max_stream) {
struct lurker_node *i;
int orig_client_state=tcp_oldest-&client.
tcp_oldest-&nids_state = NIDS_TIMED_OUT;
for (i = tcp_oldest-& i = i-&next)
(i-&item) (tcp_oldest, &i-&data);
nids_free_tcp_stream(tcp_oldest);
if (orig_client_state!=TCP_SYN_SENT)
nids_params.syslog(NIDS_WARN_TCP, NIDS_WARN_TCP_TOOMUCH, ugly_iphdr, this_tcphdr);
a_tcp = free_
if (!a_tcp) {
fprintf(stderr, &gdb me ...\n&);
free_streams = a_tcp-&next_
tcp_num++;
//tcp流数量加1
//更新tcp流的相关信息
tolink = tcp_stream_table[hash_index];
memset(a_tcp, 0, sizeof(struct tcp_stream));
a_tcp-&hash_index = hash_
a_tcp-&addr =
a_tcp-&client.state = TCP_SYN_SENT;
a_tcp-&client.seq = ntohl(this_tcphdr-&th_seq) + 1;
a_tcp-&client.first_data_seq = a_tcp-&client.
a_tcp-&client.window = ntohs(this_tcphdr-&th_win);
a_tcp-&client.ts_on = get_ts(this_tcphdr, &a_tcp-&client.curr_ts);
a_tcp-&client.wscale_on = get_wscale(this_tcphdr, &a_tcp-&client.wscale);
a_tcp-&server.state = TCP_CLOSE;
a_tcp-&next_node =
a_tcp-&prev_node = 0;
if (tolink)
tolink-&prev_node = a_
tcp_stream_table[hash_index] = a_
a_tcp-&next_time = tcp_
a_tcp-&prev_time = 0;
if (!tcp_oldest)
tcp_oldest = a_
if (tcp_latest)
tcp_latest-&prev_time = a_
tcp_latest = a_
//将最新插入哈希表的流更新为当前流
删除tcp流时对hash表的处理
&&void&&nids_free_tcp_stream(struct&tcp_stream&*&a_tcp)&&{&&&&&&&&int&hash_index&=&a_tcp-&hash_&&&&struct&lurker_node&*i,&*j;&&&&&&del_tcp_closing_timeout(a_tcp);&&&&&&&&purge_queue(&a_tcp-&server);&&&&purge_queue(&a_tcp-&client);&&&&&&&&&&&&&if&(a_tcp-&next_node)&&&&&&a_tcp-&next_node-&prev_node&=&a_tcp-&prev_&&&&if&(a_tcp-&prev_node)&&&&&&a_tcp-&prev_node-&next_node&=&a_tcp-&next_&&&&else&&&&&&tcp_stream_table[hash_index]&=&a_tcp-&next_&&&&if&(a_tcp-&client.data)&&&&&&free(a_tcp-&client.data);&&&&if&(a_tcp-&server.data)&&&&&&free(a_tcp-&server.data);&&&&if&(a_tcp-&next_time)&&&&&&a_tcp-&next_time-&prev_time&=&a_tcp-&prev_&&&&if&(a_tcp-&prev_time)&&&&&&a_tcp-&prev_time-&next_time&=&a_tcp-&next_&&&&if&(a_tcp&==&tcp_oldest)&&&&&&tcp_oldest&=&a_tcp-&prev_&&&&if&(a_tcp&==&tcp_latest)&&&&&&tcp_latest&=&a_tcp-&next_&&&&&&&&i&=&a_tcp-&&&&&&&&&while&(i)&{&&&&&&j&=&i-&&&&&&&free(i);&&&&&&i&=&j;&&&&}&&&&a_tcp-&next_free&=&free_&&&&free_streams&=&a_&&&&tcp_num--;&&&}&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:44988次
积分:1141
积分:1141
排名:千里之外
原创:62篇
转载:59篇
(3)(10)(3)(5)(7)(2)(1)(7)(25)(18)(4)(9)(6)(11)(13)1822人阅读
NetWork(1)
Libnids是一个用于网络入侵检测开发的专业编程接口,它使用了Libpcap所以它具有捕获数据包的功能。同时,Libnids提供了TCP数据流重组功能,所以对于分析基于TCP协议的各种协议Libnids都能胜任.Libnids还提供了对IP分片进行重组的功能,以及端口扫描检测和异常数据包检测功能。
Libnids数据结构
一.基本常量
1.报警类型
NIDS_WARN_IP =1,& //IP数据包异常
NIDS_WARN_TCP,//TCP数据包异常
NIDS_WARN_UDP,//UDP数据包异常
NIDS_WARN_SCAN//表示有扫描攻击发生
NIDS_WARN_UNDEFINED=0, //表示未定义
NIDS_WARN_IP_OVERSIZED.//表示IP数据包超长
NIDS_WARN_IP_INVLIST,//表示无效的碎片队列
NIDS_WARN_IP_OVERLAP,//表示发生重叠
NIDS_WARN_IP_HDR,//表示无效IP首部,IP数据包发生异常
NIDS_WARN_IP_SRR,//表示源路由IP数据包
NIDS_WARN_TCP_TOOMUCH,//表示tcp数据个数太多,因为在libnids中在同一时刻捕获的tcp个数最大值为tcp连接参数的哈希表长度3/4&&
NIDS_WARN_TCP_HDR,//表示无效TCP首部,TCP数据包发生异常
NIDS_WARN_TCP_BIGAQUEUE,//表示TCP接收的队列数据过多
NIDS_WARN_TCP_BADFLAGS//表示错误标记
2.Libnids状态
在对TCP数据流进行重组时,必须考虑到TCP的连接状态,在Libnids中为了方便开发而定义了6种Libnids状态(描述的是连接的逻辑状态)
#define NIDS_JUST_EST 1//表示tcp连接建立
#define NIDS_DATA 2& //表示接受数据的状态
#define NIDS_CLOSE 3 //表示tcp连接正常关闭
#define NIDS_RESET 4 //表示tcp连接被重置关闭
#define NIDS_TIMED_OUT 5 //表示由于超时tcp连接被关闭
#define NIDS_EXITING 6& //表示libnids正在退出
真正的TCP连接状态有11种
TCP_ESTABLISHED=1, //表示ESTABLISH状态,TCP连接建立,开始传输数据
TCP_SYN_SENT,//表示syn_sent状态,主动打开
TCP_SYN_RECV,//表示syn_recv状态,接收SYN
TCP_FIN_WAIT1,//表示FIN_WAIT_1状态
TCP_FIN_WAIT2,//表示FIN_WAIT2状态
TCP_TIME_WAIT//表示TIME_WAIT状态
TCP_ClOSE,//表示Closed状态
TCP_CLOSE_WAIT,//表示CLose_WAIT状态
TCP_LAST_ACK,//表示LAST_ACK状态
TCP_LISTEN,//表示LISTEN状态
TCP_CLOSING//表示CLOSING 状态
if (a_tcp-&nids_state == NIDS_JUST_EST)
&&// connection described by a_tcp is established
&&// here we decide, if we wish to follow this stream
&&// sample condition: if (a_tcp-&addr.dest!=23)
&&// in this simple app we follow each stream, so..
&&a_tcp-&client.collect++; // we want data received by a client
&&a_tcp-&server.collect++; // and by a server, too
&&a_tcp-&server.collect_urg++; // we want urgent data received by a
&&// server
//#ifdef WE_WANT_URGENT_DATA_RECEIVED_BY_A_CLIENT
&&a_tcp-&client.collect_urg++; // if we don't increase this value,
&&// we won't be notified of urgent data
&&// arrival
&&fprintf (stderr, &%s established/n&, buf);
3.校验和,与此相关的常量定义如下:
#define NIDS_DO_CHKSUM 0& //表示告诉Libnids要计算校验和
#define NIDS_DONT_CHKSUM 1//表示告诉LIbnids不需要计算校验和
二。数据结构
1.tuple4:此数据结构是Libnids中最基本的一种数据结构
struct tuple4
u_//源端口
u_//目标端口
u_//目的IP
};//用于描述一个地址端口对,它表示发送方IP和端口以及接收方IP和端口
2.half_stream:此数据结构用来描述在tcp连接中一端的所有信息,可以使客户端也可以是服务端。
struct half_stream
//表示套接字的状态,也就是tcp连接状态
//表示是否存储数据到data中,如果大于0就存储,否则忽略
char collect_//是否存储紧急数据到urgdata中,如果大于0就存储,否则忽略
char *//存储正常接收的数据
//存储在data中数据的第一个字节的偏移量
//表示从tcp连接开始已经存储到data中的数据的字节数
int count_//表示有多少新数据到data 中
u_int ack_
u_int first_data_
u_//用来存储紧急数据
u_char count_new_//表示是否有新的紧急数据到达
u_char urg_
u_int urg_
u_char ts_
u_int curr_
struct skbuff *
struct skbuff *
data中的数据为此TCP流中第offset开始到count。data中数据的大小为 (count&- offset) 个数。(默认情况:count - offset = count_new)。默认情况tcp_callback中没有调用nids_discard,则在tcp_callback返回后,data中的所有数据都会被销毁。当处理者需要N字节数据,才能进行处理时,但是只接收了 n & N,则可以调用nids_discard(a_tcp, 0)保留此次接收的数据在缓存中。
3.tcp_stream:描述的是一个TCP连接的所有信息
struct tcp_stream
struct tuple4//是一个tuple4类型的成员,它表示一个tcp连接的四个重要信息
char nids_//表示逻辑连接状态
struct lurker_node *
struct half_
struct half_
struct tcp_stream *next_
struct tcp_stream *prev_
struct tcp_stream *next_
struct tcp_stream *prev_
struct tcp_stream *next_
};//描述了一个TCP连接的完整信息
4.nids_prm:描述libnids的一些全局参数信息
struct nids_prm
int n_tcp_//表示哈西表大小,此哈西表用来存放tcp_stream数据结构,
int n_//表示存放ip碎片信息的哈西表的大小
char *//用来存储网络数据捕获文件.如果设置了文件,与此同时就应该设置成员device为null,默认值为NULL
int sk_buff_//表示数据结构sk_buff的大小.数据结构sk_buff是linux内核中一个重要的数据结构,是用来进行数据包队列操作的
int dev_//表示在数据结构sk_buff中用于网络接口上信息的字节数,如果是-1(默认值),那么libnids会根据不同的网络接口进行修正
void (*syslog)();//函数指针,默认值为nids_syslog()函数.在syslog中可以检测入侵攻击,如:网络扫描攻击
函数定义类型为nids_syslog(int type,int errnum,struct ip_header * iph,void *data)
int syslog_//表示日志等级,默认值为LOG_ALERT.
int scan_num_//表示存储端口扫描信息的哈西表的大小
int scan_//表示在扫描检测中,两端口扫描的间隔时间
int scan_num_//表示相同源地址必须扫描的tcp端口数目
void (*no_mem)(char *);//当libnids发生内存溢出时被调用
int (*ip_filter)();//函数指针,此函数可以用来分析ip数据包,当有ip数据包到达时,此函数被调用.默认值为nids_ip_filter,该函数的定义如下:
static int nids_ip_filter(struct ip * x,int len)
char *pcap_//表示过滤规则
//表示网卡模式,非0为混杂模式,否则为非混杂模式,默认值为1
int one_loop_//表示捕获数据返回的时间,以豪秒计算.默认值为1024
在Libnids中用nids_prm数据结构定义了一个全局变量nids_params,其定义和初始值如下:
struct nids_prm nids_params={
1040,//n_tcp_streams
256,//n_hosts
NULL,//device
NULL,//filename
168,//sk_buff_size
-1,//dev_addon
nids_syslog,//syslog()
LOG_ALERT,//syslog_level
256,//scan_num_hosts
3000,//scan_delay
10,//scan_num_prots
nids_no_mem,//no_mem()
nids_ip_filter,//ip_filter
NULL,//pcap_filter
1,//promisc
0,//one_loop_less
1024//pcap_timeout
}在使用Libnids开发程序时,可以首先对nids_params全局变量的值进行修改,这样对整个Libnids就全部有效
5.nids_chksum_ctl:描述的是计算校验和
struct nids_chksum_ctl
u_//表示动作,如果是NIDS_DO_CHKSUM,表示要计算校验和;如果是NIDS_DONT_CHKSUM表示不计算校验和
三.Libnids函数
1.基本函数
(1)int& nids_init(void);//对libnids进行初始化
(2)void nids_run(void);//运行Libnids,进入循环捕获数据包状态.
(3)int nids_getfd(void);//获得文件描述号
(4)int nids_dispatch(int cnt)//功能是调用Libpcap中的捕获数据包函数pcap_dispatch().
(5)int nids_next(void)//调用Libpcap中的捕获数据包函数pcap_next()
(6)void nids_register_chksum_ctl(struct nids_chksum_ctl *ptr,int nr)//决定是否计算校验和,它是根据数据结构nids_chksum_ctl中的action进行决定的
2.IP碎片函数
(1)void nids_register_ip_frag(void(*))//此函数的功能是注册一个能够检测所有IP数据包的回调函数,包括IP碎片
eg:nids_register_ip_frag(ip_frag_function);
这样就定义了一个回调函数ip_frag_function的定义类型如下:
void ip_frag_function(struct ip *a_packet,int len)
(2)void nids_register_ip(void(*))//此函数定义一个回调函数,此回调函数可以接受正常的IP数据包,eg:
nids_register_ip(ip_function);
此回调函数的定义类型如下:
void ip_function(struct ip * a_packet)
3.TCP数据流重组函数
(1)void nids_register_tcp(void(*))
回调函数的功能是注册一个TCP连接的回调函数,回调函数的类型定义如下:
void tcp_callback(struct tcp_stream *ns,void **param);
其中参数ns表示一个tcp连接的所有信息,它的类型是tcp_stream数据结构;参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据
(2)void nids_killtcp(struct tcp_stream * a_tcp)//此函数功能是终止TCP连接
(3)void nids_discard(struct tcp_stream *a_tcp,int num)//丢弃num字节TCP数据,用于存储更多的数据
4.UDP注册函数
(1)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负载内容
利用Libnids开发的流程
用函数nids_init()进行初始化。
然后注册相应的回调函数。不同的回调函数实现不同的功能
最后利用函数nids_run()进入循环捕获数据包的状态
在使用libnids时,可能出现下面的问题:
1、可能抓不到包
是因为libnids默认是从第一个可用网络设备上抓包,如果你的数据不是走第一个可用网络设备,而是走其它的网络设备。则可能出现上面的情况。解决方法:
nids_params.device=&eth1&;
if (!nids_init ())
&&fprintf(stderr,&%s/n&,nids_errbuf);
&&exit(1);
2、只能捕获client-&server的TCP流,没有server-&client的TCP流。(我用的版本是:libnids-1.24)
原因是 tcp.c中第743行my_tcp_check过滤掉了server-&client的TCP流。解决方法就是注释它。
3、在64位系统上,动态库中静态编译libnids时会出现错误提示。解决方法就是按错误提示,用-fPIC重新编译libnids静态库
4、性能上的优化:两种优化方法,可见自带文档PERFORMANCE
A、加大pcap的BUFFER
B、启用一个线程抓包,另一个线程进行处理。这种情况下,1.24版本对线程处理结构有BUG。nids_run的线程结构不会有问题。nids_next、nids_dispatch中是每调用一次这两个函数就会启用一个处理线程。所以这会出现BUG。修改方法是,单独启用线程,在这两个函数中就不用启用线程,只是进行数据捕获。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:152220次
积分:2041
积分:2041
排名:第17004名
原创:28篇
转载:128篇
(1)(1)(1)(2)(1)(1)(1)(2)(7)(1)(1)(3)(7)(2)(2)(7)(4)(3)(1)(5)(1)(9)(4)(11)(11)(16)(3)(2)(16)(12)(9)(9)}

我要回帖

更多关于 抓不到握手包 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信