分类: C/C++
2006-10-31 10:48:07
Libnet在Visual
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-
3、 在编译的时候,注意需要添加一个库advapi32.lib。具体步骤同上一篇的相同,在Project setting里面进行设置。
4、 现在就可以开始编译了。
Build=>Build Libnet
然后静静的等待,很快就会编译结束。在win32目录下会生成一个Debug目录,里面就有我们刚刚编译生成的libnet.lib和libnet.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有影响,当出现问题时,可以参考一下。
chinaunix网友2008-03-23 20:09:10
l不知道什么原因,我没法编译出ibnet.dll 以及 libnet.lib文件,能不能把libnet.dll 以及 libnet.lib文件发送给我,我的邮件地址是:liuhongbin1985@163.com,谢谢!
chinaunix网友2008-03-23 20:09:10
l不知道什么原因,我没法编译出ibnet.dll 以及 libnet.lib文件,能不能把libnet.dll 以及 libnet.lib文件发送给我,我的邮件地址是:liuhongbin1985@163.com,谢谢!