libnids 在VS 2010中使用方法及编译错误解决方法

来源:互联网 发布:长春盘古网络怎么样 编辑:程序博客网 时间:2024/06/11 03:42

一、配置的准备工作

      目前网上的能稳定支持windows的libnids版本为libnids-W32-1.19。网上搜一下有很多,随便下一个并解压缩。由于libnids需要使用winpcap,所以要先下载并安装winpcap。登陆winpcaphttp://www.winpcap.org/install/default.htm下载最新版winpcap的安装包,然后到http://www.winpcap.org/devel.htm下载程序员开发包。安装winpcap。将libnids-W32-1.19的WIN32-Includes文件夹下文件存至另一个文件夹中(记为include文件夹)。将libnids-W32-1.19的WIN32-LIbraries文件夹下的库,和winpcap程序员开发包WpdPack文件夹中Lib文件夹中的Packet.lib和wpcap.lib放到一个文件夹中(记为lib文件夹)。

 

二、VS 2010项目配置

       以配置win32控制台程序为例。新建一个win32控制台程序,点击菜单栏“项目”->“属性”。

在“配置属性”->“VC++目录”中的“包含目录”(Include目录)中,添加一(配置的准备工作)中提到的include文件夹路径;在“库目录”(lib目录)中,添加一(配置的准备工作)中提到的lib文件夹路径。

在“链接器”->“命令行”中加入ws2_32.libwpcap.lib Packet.lib libpcap.lib libnids.lib libnids-debug.lib

 

三、进行编译,出现若干错误

1、errorLNK2019: 无法解析的外部符号 "int __cdeclnids_init(void)" (?nids_init@@YAHXZ) ,该符号在函数 _main 中被引用 

errorLNK2001: 无法解析的外部符号 "char *nids_errbuf" (?nids_errbuf@@3PADA) 

 errorLNK2001: 无法解析的外部符号 "structnids_prm nids_params" (?nids_params@@3Unids_prm@@A) 等错误

错误原因:静态库在VC6编译而主程序在VC2010编译,大家用的CRT不同。

解决方法:改写 nids.h

找到int nids_init ();一行,在该行前加上如下代码:

#ifdef __cplusplus

 

extern "C"{

 

#endif

在头文件的最后一行,加上如下代码:

#ifdef __cplusplus

 

}

 

#endif

2、 LIBCMT.lib(close.obj): error LNK2005: __close 已经在 LIBCD.lib(close.obj) 等错误

在“链接器”->“命令行”中加入 /NODEFAULTLIB:LIBCMT.lib 

3、errorLNK2001: 无法解析的外部符号 __iob  等错误

错误原因:静态库在VC6编译而主程序在VC2010编译,大家用的CRT不同。

解决方法:

在自己的cpp代码里添加如下代码

#ifdef __cplusplus

 

extern "C"

 

#endif

 

FILE _iob[3] = {__iob_func()[0],__iob_func()[1], __iob_func()[2]};

 

四、Libnids抓不到包的问题
运行后,如果出现一直抓不到数据包的情况,其实是网卡驱动没选好。所以我们在main()函数中第一行,添加一句代码:nids_params.device="2";将适配器设为真正起作用的设备。修改后的main()函数如下:

   int main()

{

nids_params.device ="2";

if(!nids_init())

{

   printf("出现错误:%s\n", nids_errbuf);

   exit(1);

}

printf("初始化成功!\n");

nids_register_tcp(tcp_protocol_callback);

nids_run();

}


如果还不行,就试试3、4...等等。


五、使用libnids的demo

//libnidsTest.cpp: 定义控制台应用程序的入口点。

//

 

#include"stdafx.h"

 

 

#include "nids.h"

 

 

#ifdef __cplusplus

extern "C"

#endif

FILE _iob[3] ={__iob_func()[0], __iob_func()[1], __iob_func()[2]};

 

 

/* Libnids的头文件,必须包含 */

charascii_string[10000];

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协议传输的数据进行分析

=======================================================================================================================

 */

voidtcp_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(*((structin_addr*) &(ip_and_port.saddr))));

    /* 获取源地址 */

    sprintf(address_string +strlen(address_string), " : %i", ip_and_port.source);

    /* 获取源端口 */

    strcat(address_string, " <--->");

    strcat(address_string, inet_ntoa(*((structin_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 _tmain(int argc,_TCHAR* argv[])

{

          nids_params.device = "3";

          if (!nids_init())

     /* Libnids初始化 */

    {

        printf("出现错误:%s\n", nids_errbuf);

        exit(1);

    }

    nids_register_tcp(tcp_protocol_callback);

    /* 注册回调函数 */

    nids_run();

    /* Libnids进入循环捕获数据包状态 */

          return 0;

}




参考:http://hi.baidu.com/wzfxyer/item/ed920a49e759ab0ae9350461

 

原创粉丝点击