libnids在Windows下的安装
来源:互联网 发布:北京邮电大学自考 知乎 编辑:程序博客网 时间:2024/06/02 10:31
http://blog.csdn.net/MSDA/article/details/8494575
libnids分析(8)
http://blog.csdn.net/xieqb/article/details/7678557
windows下安装时问题:
一、配置的准备工作
目前网上的能稳定支持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 __cplusplusextern "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 __cplusplusextern "C"#endifFILE _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 __cplusplusextern "C"#endifFILE _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;}
- libnids在Windows下的安装
- Libnids在Ubuntu下的安装
- linux下libnids的安装
- linux下libnids的安装
- Ubuntu下Libnids的安装详解
- Libnids安装过程以及存在的问题
- postgresql在windows平台下的安装
- [转]PHPlet在Windows下的安装
- perl在windows下的安装使用
- Resin在Windows系统下的安装
- Resin在Windows系统下的安装
- MySQL在windows下的安装
- PerlMagick在Windows下安装的问题
- openssl在windows下的安装
- SpamAssassin 3.02 在windows下的安装。
- CygWin在windows下的安装步骤
- wxWidgets在windows & VC++下的安装
- qt 在Windows下的安装
- 从零开始Hadoop的完全分布式安装(集群)
- 为什么算法如此重要
- 关于工作的一些帖
- Dialog
- 开源 java CMS - FreeCMS2.2 角色管理
- libnids在Windows下的安装
- 几年李小龙
- 关于使用bcompare工具修改system.img的问题
- hibernate延迟加载(懒加载)详解
- mysql 多表联合查询效率分析及优化
- MAT使用分析
- Python学习笔记22:Django下载安装
- 最长公共子序列
- sql 典型SQL题(多表联查)