Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5708513
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2006-10-31 10:48:07

LibnetVisual Studio 05下编译

 

由于开发会用到libnet,可是网站只给了源代码,需要编译才能够使用。尝试使用VC编译,结果整了一个下午没有搞定,主要是由于SDK开发包的版本太低,导致一些函数都不支持。编译的时候不通过,决定改用Visual Studio 05进行编译。

 

1、  下载libnet的开发包

http://www.mirrors.wiretapped.net/security/packet-construction/libnet/

下载libnet-1.1.2.1.tar.gz ,这是一个稳定版本

2、  编译libnet,需要winpcap。所以在之前你应该安装了winpcap以及winpcap的开发包。

(注):如果使用VC的话,需要安装较新的SDK,可以导微软的官方网站下载

3、现在开始编译libnet

打开libnet中的win32,用VS打开libnet-1.1.1-2003.sln,这是VS的工程文件,打开工程工程文件进行编译。由于原来的工程文件是for VS2003的,所以需要一些转化,无所谓的,VS2005具有向上兼容性,依然可以编译。

3、  在编译的时候,注意需要添加一个库advapi32.lib。具体步骤同上一篇的相同,在Project setting里面进行设置。

4、  现在就可以开始编译了。

Build=>Build Libnet

然后静静的等待,很快就会编译结束。在win32目录下会生成一个Debug目录,里面就有我们刚刚编译生成的libnet.liblibnet.dll

Libnet.lib是开发的时候用的,libnet.dll是运行时候用的。

libnet.dll拷贝到c:\windows\system32下面,是系统需要时能够加载到。

5、  现在开始测试libnet了。

首先,设置路径。同前面的winpcap的设置。

Tools=>Options=>Projects and Solutions=>VC++ Directories
 

OK,设置路径结束了,就可以用libnet进行开发了。

6、  程序测试

Libnet带了一些示例程序,我们简单的测试一个,构造一个ARP数据包。

#if (HAVE_CONFIG_H)

#if ((_WIN32) && !(__CYGWIN__))

#include "../include/win32/config.h"

#else

#include "../include/config.h"

#endif

#endif

#include "./libnet_test.h"

 

int main(int argc, char *argv[])

{

      int packet_size;

      u_int32_t ip;

      libnet_t *l;

      libnet_ptag_t tag;

      char *device = NULL;

      u_int8_t *packet;

      u_int32_t packet_s;

      char errbuf[LIBNET_ERRBUF_SIZE];

 

      printf("libnet 1.1 packet shaping: ARP[link -- autobuilding ethernet]\n");

 

      if (argc > 1)

      {

           device = argv[1];

      }

 

      l = libnet_init(LIBNET_LINK_ADV,device,errbuf);

      if(l == NULL)

      {

           fprintf(stderr,"%s",errbuf);

           exit(EXIT_FAILURE);

      }

      else

           ip = libnet_get_ipaddr4(l);

 

      tag = libnet_autobuild_arp(ARPOP_REPLY,enet_src,(u_int8_t *)&ip,enet_dst,(u_int8_t *)&ip,l);

      if(tag == -1)

      {

           fprintf(stderr,"Can't build ARP header: %s\n",libnet_geterror(l));

           goto bad;

      }

     

      tag = libnet_autobuild_ethernet(enet_dst,ETHERTYPE_ARP,l);

      if(tag == -1)

      {

           fprintf(stderr,"Can't build ethernet header: %s\n",libnet_geterror(l));

           goto bad;

      }

/*

      if (libnet_adv_cull_packet(l, &packet, &packet_s) == -1)

      {

           fprintf(stderr, "%s", libnet_geterror(l));

      }

      else

      {

           fprintf(stderr, "packet size: %d\n", packet_s);

           libnet_adv_free_packet(l, packet);

      }

*/

      packet_size = libnet_write(l);

 

      if (packet_size == -1)

      {

           fprintf(stderr, "Write error: %s\n", libnet_geterror(l));

           goto bad;

      }

      else

      {

           fprintf(stderr, "Wrote %d byte ARP packet from context \"%s\"; "

                 "check the wire.\n", packet_size, libnet_cq_getlabel(l));

      }

 

      system("pause");

 

      libnet_destroy(l);

      return (EXIT_SUCCESS);

bad:

      libnet_destroy(l);

      return (EXIT_FAILURE);

}

 

/* EOF */

实验结果如下:

我们使用抓包软件抓包测试:

测试成功!

 

注意:我在使用过程中,由于我以前的时候安装了一个VMware,结果测试的时候,总是捕不到数据包,可能VMware的虚拟网卡libnet有影响,当出现问题时,可以参考一下。

阅读(7717) | 评论(32) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-05-31 22:30:32

我也是遇到了这样的问题 在初始化 l 时出现错误 我是在虚拟机里用的编译的 不知道是不是获取网卡的问题

chinaunix网友2009-05-31 22:30:32

我也是遇到了这样的问题 在初始化 l 时出现错误 我是在虚拟机里用的编译的 不知道是不是获取网卡的问题

CUDev2008-09-18 17:51:03

你的这个问题太笼统了,不知道该如何回答你~~

CUDev2008-09-18 17:51:03

你的这个问题太笼统了,不知道该如何回答你~~

chinaunix网友2008-09-15 13:48:39

如何使用winpcap的开发包?