libnet使用举例(1) 2000-01-01 白云黄鹤 安全文摘 作者:小四 < 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是一个静态库,这样编译得到的可执行程序将来执行的时候不依赖于系统中 是否存在该库。 <待续> |
libnet使用举例(1)
最新推荐文章于 2024-10-30 17:23:03 发布