一、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();

}

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