rainbowzc

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

一、Libnids问题之源

使用Libnids-win32 1.19在VC6.0环境下编程获取数据包,大部分代码都是按照《网络安全开发包详解》中的代码为例子的。但是往往编译连接出错,或者运行后Libnids抓不到包,先看程序框架:

------------------------------------------------------------------------------------------------------------

#include "nids.h"
#include <stdio.h>


//读取并分析获取的ASCII字符串内容
char* char_to_ascii(char ch)
{
......    //函数代码
}

//回调函数,分析TCP连接和TCP连接状态,并对TCP协议传输的数据进行分析
void tcp_protocol_callback(struct tcp_stream* tcp_connection, void** arg)
{
......    //回调函数代码
}

//主函数
void main()
{
nids_params.device = "2";
if(!nids_init())
{
   printf("出现错误:%s\n", nids_errbuf);
   exit(1);
}
nids_register_tcp(tcp_protocol_callback);
nids_run();
}

-------------------------------------------------------------------------------------------------------------

二、Libnids编译连接问题

已经把Libnids和Winpcap的头文件和库文件包含在了VC6.0的环境里,但还是出现如下类似问题,很让人棘手。

Linking...
error   LNK2001:   unresolved   external   symbol   "void   __cdecl   nids_run(void) "   (
?nids_run@@YAXXZ)
error   LNK2001:   unresolved   external   symbol   "void   __cdecl   nids_register_tcp(void   *) "   (
?nids_register_tcp@@YAXPAX@Z)
error   LNK2001:   unresolved   external   symbol   "char   *   nids_errbuf "   (
?nids_errbuf@@3PADA)
error   LNK2001:   unresolved   external   symbol   "int   __cdecl   nids_init(void) "   (
?nids_init@@YAHXZ)
Debug/test.exe   :   fatal   error   LNK1120:   4   unresolved   externals

解决办法如下:

在Libnids-1.19文件夹下,有一个“WIN32-Includes”文件夹,该文件夹存放的就是Libnids的头文件,进入后找到nids.h头文件,然后打开,找到int nids_init ();一行,在该行前加上如下代码:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif

保存后进行编译,编译可以运行。

三、Libnids抓不到包的问题

运行后,一直抓不到数据包,但是用其他抓包软件抓包,比如Wireshark却能抓到。

这是因为我们的电脑中有一个适配器叫:Adapter for generic dialup and VPN capture,它是通用拨号和虚拟专用的适配器,我们要抓的并非通过它的数据包,而是是通过机器网卡的包。之所以抓不到包,因为Libnids默认选择了“Adapter for generic dialup and VPN capture”,所以我们在main()函数中第一行,添加一句代码:nids_params.device="2";将适配器设为真正起作用的设备。修改后的main()函数如下:

void 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();
}

编译,运行,好了,尽情抓包吧。

posted on 2010-09-05 22:10  ct  阅读(1107)  评论(0编辑  收藏  举报