当前位置:编程学习 > 网站相关 >>

libnids-win32 抓不到包的问题

我基于libnids-1.19forwin32编写了一个程序,抓获网络包进行分析,
这个程序在其他机器上可以运行,但是我放到服务器上(配置是千兆网卡,windows 2003 server)却不行
网卡设备我是选择的正确的,而且只有winpcap包的程序是能够抓到网络数据包的。
我试过其他window2003 server的机器是可以的,那台机器是百兆网卡,难道是libnids-forwin32不支持千兆网卡?
我试了libnids-1.16开发包,也还是不行,
这个问题比较急,因为快去验收了,这个还没搞定,哪位高手帮帮忙啊!
--------------------编程问答-------------------- //代码如下,回调函数就是把包内数据显示出来(大家肯定都见过),主函数中就网络设备处是改成自己的网络设备卡名称。要试的话改下即可。
#include "nids.h"
#include "stdio.h"
//#include "pcap.h"
/* Libnids的头文件,必须包含 */
char ascii_string[10000];
//extern nids_params;

//struct pcap_addr{
typedef struct pcap_if pcap_if_t;
struct pcap_if
{
struct pcap_if *next;
char *name;
char *description;
struct pcap_addr *addresses;
int flags;
};

char *char_to_ascii(char ch)
/* 此函数的功能主要用于把协议数据进行显示 */
{
    char *string;
    ascii_string[0] = 0;
    string = ascii_string;
    if (isgraph(ch))
     /* 可打印字符 */
    {
        *string++ = ch;
    }
    else if (ch == ' ')
     /* 空格 */
    {
        *string++ = ch;
    }
    else if (ch == '\n' || ch == '\r')
     /* 回车和换行 */
    {
        *string++ = ch;
    }
    else
     /* 其它字符以点"."表示 */
    {
        *string++ = '.';
    }
    *string = 0;
    return ascii_string;
}
/*
=======================================================================================================================
下面的函数是回调函数,用于分析TCP连接,分析TCP连接状态,对TCP协议传输的数据进行分析
=======================================================================================================================
 */
void tcp_protocol_callback(struct tcp_stream *tcp_connection, void **arg)
{
    int i;
    char address_string[1024];
    char content[65535];
    char content_urgent[65535];
    struct tuple4 ip_and_port = tcp_connection->addr;
    /* 获取TCP连接的地址和端口对 */
    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
    /* 获取源地址 */
    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
    /* 获取源端口 */
    strcat(address_string, " <---> ");
    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
    /* 获取目的地址 */
    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
    /* 获取目的端口 */
    strcat(address_string, "\n");
    switch (tcp_connection->nids_state) /* 判断LIBNIDS的状态 */
    {
        case NIDS_JUST_EST:
            /* 表示TCP客户端和TCP服务器端建立连接状态 */
            tcp_connection->client.collect++;
            /* 客户端接收数据 */
            tcp_connection->server.collect++;
            /* 服务器接收数据 */
            tcp_connection->server.collect_urg++;
            /* 服务器接收紧急数据 */
            tcp_connection->client.collect_urg++;
            /* 客户端接收紧急数据 */
            printf("%sTCP连接建立\n", address_string);
            return ;
        case NIDS_CLOSE:
            /* 表示TCP连接正常关闭 */
            printf("--------------------------------\n");
            printf("%sTCP连接正常关闭\n", address_string);
            return ;
        case NIDS_RESET:
            /* 表示TCP连接被RST关闭 */
            printf("--------------------------------\n");
            printf("%sTCP连接被RST关闭\n", address_string);
            return ;
        case NIDS_DATA:
            /* 表示有新的数据到达 */
            {
                struct half_stream *hlf;
                /* 表示TCP连接的一端的信息,可以是客户端,也可以是服务器端 */
                if (tcp_connection->server.count_new_urg)
                {
                    /* 表示TCP服务器端接收到新的紧急数据 */
                    printf("--------------------------------\n");
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
                    strcat(address_string, " urgent---> ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    address_string[strlen(address_string) + 1] = 0;
                    address_string[strlen(address_string)] = tcp_connection->server.urgdata;
                    printf("%s", address_string);
                    return ;
                }
                if (tcp_connection->client.count_new_urg)
                {
                    /* 表示TCP客户端接收到新的紧急数据 */
                    printf("--------------------------------\n");
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
                    strcat(address_string, " <--- urgent ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    address_string[strlen(address_string) + 1] = 0;
                    address_string[strlen(address_string)] = tcp_connection->client.urgdata;
                    printf("%s", address_string);
                    return ;
                }
                if (tcp_connection->client.count_new)
                {
                    /* 表示客户端接收到新的数据 */
                    hlf = &tcp_connection->client;
                    /* 此时hlf表示的是客户端的TCP连接信息 */
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.source);
                    strcat(address_string, " <--- ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    printf("--------------------------------\n");
                    printf("%s", address_string);
                    memcpy(content, hlf->data, hlf->count_new);
                    content[hlf->count_new] = '\0';
                    printf("客户端接收数据\n");
                    for (i = 0; i < hlf->count_new; i++)
                    {
                        printf("%s", char_to_ascii(content[i]));
                        /* 输出客户端接收的新的数据,以可打印字符进行显示 */
                    }
                    printf("\n");
                }
                else
                {
                    /* 表示服务器端接收到新的数据 */
                    hlf = &tcp_connection->server;
                    /* 此时hlf表示服务器端的TCP连接信息 */
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.source);
                    strcat(address_string, " ---> ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    printf("--------------------------------\n");
                    printf("%s", address_string);
                    memcpy(content, hlf->data, hlf->count_new);
                    content[hlf->count_new] = '\0';
                    printf("服务器端接收数据\n");
                    for (i = 0; i < hlf->count_new; i++)
                    {
                        printf("%s", char_to_ascii(content[i]));
                        /* 输出服务器接收到的新的数据 */
                    }
                    printf("\n");
                }
            }
        default:
            break;
    }
    return ;
}
--------------------编程问答-------------------- int main()
{
pcap_if_t *alldevs;
pcap_if_t *seconddev;
char *net_interface;
char errbuf[1024+1];
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
seconddev=alldevs->next->next->next;
//net_interface=seconddev->name;
nids_params.device="\\Device\\NPF_{5708AE91-C7A4-4325-B0DB-ADD661AFF171}";
//nids_params.device=net_interface;
// nids_params.device="all";
    if (!nids_init())
     /* Libnids初始化 */
    {
        printf("出现错误:%s\n", nids_errbuf);
        exit(1);
    }
    nids_register_tcp(tcp_protocol_callback);
    /* 注册回调函数 */
    nids_run();
    /* Libnids进入循环捕获数据包状态 */
pcap_freealldevs(alldevs);
return 1;
}
--------------------编程问答-------------------- 没看到你的net_interface 是在哪里赋值的,还有你的那个nids_init()
那个函数初始设备了么?
--------------------编程问答-------------------- 我也是遇到了这样的问题,同样是万分火急啊,你有没有解决,加我的qq,要是解决了告诉我一下,要是没解决我们讨论一下好吗? qq:45071312 --------------------编程问答-------------------- 如果libnids不能支持千兆网卡,那它根本就没有应用的价值啊,那它的出现还有什么意义?是不是有新版本的libnids呢?我现在用的是libnids-win32-1.19 在几台千兆网卡的机器上都没成功,请问谁有新版本的windows下的libnids  --------------------编程问答-------------------- 没遇到过这种情况. --------------------编程问答-------------------- 有点难度哦 --------------------编程问答-------------------- 我也遇到了 --------------------编程问答-------------------- 楼主,首先你要确定你的程序是够开启了LIBNIDS的网卡混杂模式驱动LIBPCAP抓包。有个接口函数可以开启的。
还有就是你的网络环境是否正确。需要接在HUB上。
与网卡是否百兆和千兆无关! --------------------编程问答-------------------- 我也遇到了这样的问题,怎么解决!!!大侠来帮帮忙 --------------------编程问答-------------------- 解决了,看这里
http://hi.baidu.com/yaming/blog/item/fd9619d8fcf24b3232fa1c14.html --------------------编程问答-------------------- 楼上的贴好像并不能解决问题啊,我使用nids_register_tcp注册回调函数后,也是无法截获数据包(但同样程序在个别计算机上可以实现抓包),我无意中使用nids_register_ip注册回调函数后,可以实现抓包,这说明只是对tcp数据流无法实现截获数据包,我现在严重怀疑是不是操作系统里有一些设置阻碍了tcp数据包。可是防火墙我已经关了,想了半天也没搞清楚,难道和网卡有关系?不知道大家有遇到同样问题么,一起交流一下。我qq:609280546 --------------------编程问答-------------------- pcap_if_t *alldevs;
pcap_if_t *seconddev;
char *net_interface;
char errbuf[1024+1];
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
seconddev=alldevs->next->next->next;
//net_interface=seconddev->name;
nids_params.device="\\Device\\NPF_{5708AE91-C7A4-4325-B0DB-ADD661AFF171}";
//nids_params.device=net_interface;
// nids_params.device="all";


代码根本没有选择网卡,没有正确选择网卡接口的就会捕不了包,但是你的机子如果只有一个网卡那就好用,跟千兆百兆没有关系


pcap_if_t *alldevs;
pcap_if_t *devs;
char *net_interface;
char errbuf[1024+1];
int a;
if(pcap_findalldevs(&alldevs, errbuf) == -1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}
for(devs=alldevs;devs!=NULL;devs=devs->next)
{
printf("名字:%s\n",devs->name);
printf("信息:%s\n",devs->description);
if(devs->addresses!=NULL)
{
u_char *p;
p=(u_char *)&(((struct sockaddr_in *)devs->addresses->addr)->sin_addr.s_addr);
printf("IP地址:%d.%d.%d.%d\n",p[0],p[1],p[2],p[3]);
p=(u_char *)&(((struct sockaddr_in *)devs->addresses->netmask)->sin_addr.s_addr);
printf("网络掩码:%d.%d.%d.%d\n",p[0],p[1],p[2],p[3]);
p=(u_char *)&(((struct sockaddr_in *)devs->addresses->broadaddr)->sin_addr.s_addr);
printf("广播地址:%d.%d.%d.%d\n",p[0],p[1],p[2],p[3]);
}
else
printf("虚拟网卡\nIP地址:无\n网络掩码:无\n广播地址:无");
printf("\n\n\n");
}
printf("选择网卡\n");
scanf("%d",&a);
printf("\n");
for(devs=alldevs;devs!=NULL&&a>1;devs=devs->next,a--){}
net_interface=devs->name;
nids_params.device=devs->name;
修改后的代码,头文件要加上#include "pcap.h"

最笨的办法是用nids_params.device="2";或者
nids_params.device="1";来回试用,总有一个是能捕捉的网卡 --------------------编程问答-------------------- 请问楼主解决问题了吗?我也遇到同样的问题,急切啊 --------------------编程问答-------------------- 我也遇到这问题了,代码也没问题,而且指定了抓包的网卡,就是没有tcp包,进不了回调函数。但是我如果用nids_register_ip_frag()就可以抓到包,到底是什么问题。求指点qq1936524046
补充:云计算 ,  云安全
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,