libnet使用举例(1)

来源:互联网 发布:网络用语rj是什么意思 编辑:程序博客网 时间:2024/04/27 18:43
       作者:小四 < mailto: scz@isbase.com >
主页:http://www.isbase.com
日期:2000-07-24 20:10

可能最好的帮助是源代码例子,准备用syn-flood为例说明libnet的使用。也是被人
抓去写DoS工具,就以这个题目灌水几篇吧。使用libnet的好处很多,考虑兼容性,
libnet for NT/2K已经有下载。

首先我们介绍libnet_name_resolve()函数,顾名思义,该函数实现了域名解析功能。
其函数原型如下:

u_long libnet_name_resolve ( u_char * hostname, u_short use_name );

hostname为标准的asciiz串,以NULL结尾。可以是点分十进制IPv4地址,比如
"192.168.8.30"。可以是FQDN,比如"bbs.isbase.com"。甚至可以是一般的主机名,
只要你确信该主机名可以经过域名系统(包括/etc/hosts文件)得到正向解析。在头文
件/usr/include/libnet/libnet-macros.h中有两个宏对应了use_name的取值:

#define LIBNET_DONT_RESOLVE 0 /* 对应点分十进制IPv4地址 */
#define LIBNET_RESOLVE 1 /* 对应主机名 */

根据这个取值确定hostname使用的是点分十进制IPv4地址(0)还是主机名(1)。无论本
机使用何种字节序,该函数最后得到的u_long是big-endian序(也是网络字节序)4字
节值,比如192.168.8.30对应0xc0 a8 08 1e。现代Unix操作系统的域名解析函数支
持把"192.168.8.30"作为形参输入,所以一般都指定该函数的第二个参数为
LIBNET_RESOLVE。

--------------------------------------------------------------------------
/* 编译命令相对古怪点,确认你的系统上有libnet-config脚本 */
/* gcc -O3 -o rt resolveTest.c `libnet-config --defines --cflags` `libnet-config --libs` */
#include
#include
#include /* 使用libnet必须包含这个头文件 */

#define SUCCESS 0
#define FAILURE -1

int main ( int argc, char * argv[] )
{
u_long ipUl = 0x01020304; /* 测试用 */
u_char * ipUc;
int i;
u_short method;

if ( argc != 3 )
{
fprintf( stderr, "%s \n", argv[0] );
exit( FAILURE );
}
method = ( u_short )strtoul( argv[2], NULL, 10 );
if ( ( method != 0 ) && ( method != 1 ) )
{
/* 第一个参数为LIBNET_ERR_FATAL,会导致exit */
libnet_error( LIBNET_ERR_FATAL, "Bad method: %s\n", argv[2] );
}
/* 这里返回-1表示出错,事实上我并不确定,man手册里没有提到 */
if ( ( ipUl = libnet_name_resolve( argv[1], method ) ) == -1 )
{
/* 仅仅显示警告信息,并不终止进程 */
libnet_error( LIBNET_ERR_WARNING, "Bad resolveObject: %s\n", argv[1] );
}
ipUc = ( u_char * )&ipUl;
i = 0;
while ( i < 4 )
{
fprintf( stderr, "%02x ", ipUc[i] );
i++;
}
fprintf( stderr, "\n" );
return( SUCCESS );
} /* end of main */
--------------------------------------------------------------------------

注意编译使用libnet库的源代码的时候要辅助以libnet-config脚本:

[scz@ /home/scz/src]> gcc -O3 -o rt resolveTest.c `libnet-config --defines --cflags` `libnet-config --libs`
[scz@ /home/scz/src]> ./rt scz 0
Warning: Bad resolveObject: scz <-- 虽然出现警告信息,但并未终止进程
ff ff ff ff <-- 正向解析失败,因为这里指定了0,scz不是点分10进制IPv4地址
[scz@ /home/scz/src]> ./rt scz 1
c0 a8 08 5a <-- 正向解析成功
[scz@ /home/scz/src]> ./rt 192.168.8.30 0
c0 a8 08 1e
[scz@ /home/scz/src]> ./rt 192.168.8.30 1
c0 a8 08 1e <-- 无论指定0还是1,对于点分地址都能解析成功
[scz@ /home/scz/src]> ./rt 256.0.0.0 0
Warning: Bad resolveObject: 256.0.0.0
ff ff ff ff <-- 解析失败,因为这个点分地址非法
[scz@ /home/scz/src]> ./rt 256.0.0.0 1
Warning: Bad resolveObject: 256.0.0.0
ff ff ff ff
[scz@ /home/scz/src]> ./rt www.isbase.com 0
Warning: Bad resolveObject: www.isbase.com
ff ff ff ff
[scz@ /home/scz/src]> ./rt www.isbase.com 1
ca 63 0b a1 <-- 可以解析FQDN
[scz@ /home/scz/src]> ./rt www.isbase.com 2
Fatal: Bad method: 2 <-- libnet_error()第一个参数为LIBNET_ERR_FATAL,会导致exit
[scz@ /home/scz/src]>

反引号``表示执行其中的命令,并作为这里的输入,所以你可以单独看看究竟输入了
什么:

[scz@ /home/scz/src]> libnet-config --defines --cflags
-D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H -DLIBNET_LIL_ENDIAN
[scz@ /home/scz/src]> libnet-config --libs
-lnet
[scz@ /home/scz/src]> file /usr/bin/libnet-config
/usr/bin/libnet-config: Bourne shell script text
[scz@ /home/scz/src]>

以前有ansi88问过编译时出现LIBNET_BIG_ENDIAN相关错误,很可能是直接指定了
-lnet,却没有指定前面那一堆宏(-D用于命令行传递宏定义),没有仔细man的结果。
libnet-config是个脚本,如果你感兴趣,可以自己查看。

[scz@ /home/scz/src]> ls -l /usr/lib/libnet.a
-rw-r--r-- 43142 /usr/lib/libnet.a
[scz@ /home/scz/src]>

libnet.a是一个静态库,这样编译得到的可执行程序将来执行的时候不依赖于系统中
是否存在该库。
原创粉丝点击