📄 526.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="519.htm">上一层</a>][<a href="527.htm">下一篇</a>]
<hr><p align="left"><small>发信人: scz (小四), 信区: Security <br>
标 题: libnet使用举例(1) <br>
发信站: 武汉白云黄鹤站 (Mon Jul 24 22:05:30 2000), 站内信件 <br>
作者:小四 < mailto: scz@isbase.com > <br>
主页:http://www.isbase.com <br>
日期:2000-07-24 20:10 <br>
可能最好的帮助是源代码例子,准备用syn-flood为例说明libnet的使用。也是被人 <br>
抓去写DoS工具,就以这个题目灌水几篇吧。使用libnet的好处很多,考虑兼容性, <br>
libnet for NT/2K已经有下载。 <br>
首先我们介绍libnet_name_resolve()函数,顾名思义,该函数实现了域名解析功能。 <br>
其函数原型如下: <br>
u_long libnet_name_resolve ( u_char * hostname, u_short use_name ); <br>
hostname为标准的asciiz串,以NULL结尾。可以是点分十进制IPv4地址,比如 <br>
"192.168.8.30"。可以是FQDN,比如"bbs.isbase.com"。甚至可以是一般的主机名, <br>
只要你确信该主机名可以经过域名系统(包括/etc/hosts文件)得到正向解析。在头文 <br>
件/usr/include/libnet/libnet-macros.h中有两个宏对应了use_name的取值: <br>
#define LIBNET_DONT_RESOLVE 0 /* 对应点分十进制IPv4地址 */ <br>
#define LIBNET_RESOLVE 1 /* 对应主机名 */ <br>
根据这个取值确定hostname使用的是点分十进制IPv4地址(0)还是主机名(1)。无论本 <br>
机使用何种字节序,该函数最后得到的u_long是big-endian序(也是网络字节序)4字 <br>
节值,比如192.168.8.30对应0xc0 a8 08 1e。现代Unix操作系统的域名解析函数支 <br>
持把"192.168.8.30"作为形参输入,所以一般都指定该函数的第二个参数为 <br>
LIBNET_RESOLVE。 <br>
-------------------------------------------------------------------------- <br>
/* 编译命令相对古怪点,确认你的系统上有libnet-config脚本 */ <br>
/* gcc -O3 -o rt resolveTest.c `libnet-config --defines --cflags` `libnet-co <br>
nfig <br>
--libs` */ <br>
#include <stdio.h> <br>
#include <stdlib.h> <br>
#include <libnet.h> /* 使用libnet必须包含这个头文件 */ <br>
#define SUCCESS 0 <br>
#define FAILURE -1 <br>
int main ( int argc, char * argv[] ) <br>
{ <br>
u_long ipUl = 0x01020304; /* 测试用 */ <br>
u_char * ipUc; <br>
int i; <br>
u_short method; <br>
if ( argc != 3 ) <br>
{ <br>
fprintf( stderr, "%s <resolveObject> <method>\n", argv[0] ); <br>
exit( FAILURE ); <br>
} <br>
method = ( u_short )strtoul( argv[2], NULL, 10 ); <br>
if ( ( method != 0 ) && ( method != 1 ) ) <br>
{ <br>
/* 第一个参数为LIBNET_ERR_FATAL,会导致exit */ <br>
libnet_error( LIBNET_ERR_FATAL, "Bad method: %s\n", argv[2] ); <br>
} <br>
/* 这里返回-1表示出错,事实上我并不确定,man手册里没有提到 */ <br>
if ( ( ipUl = libnet_name_resolve( argv[1], method ) ) == -1 ) <br>
{ <br>
/* 仅仅显示警告信息,并不终止进程 */ <br>
libnet_error( LIBNET_ERR_WARNING, "Bad resolveObject: %s\n", argv[1] <br>
); <br>
} <br>
ipUc = ( u_char * )&ipUl; <br>
i = 0; <br>
while ( i < 4 ) <br>
{ <br>
fprintf( stderr, "%02x ", ipUc[i] ); <br>
i++; <br>
} <br>
fprintf( stderr, "\n" ); <br>
return( SUCCESS ); <br>
} /* end of main */ <br>
-------------------------------------------------------------------------- <br>
注意编译使用libnet库的源代码的时候要辅助以libnet-config脚本: <br>
[scz@ /home/scz/src]> gcc -O3 -o rt resolveTest.c `libnet-config --defines - <br>
-cfl <br>
ags` `libnet-config --libs` <br>
[scz@ /home/scz/src]> ./rt scz 0 <br>
Warning: Bad resolveObject: scz <-- 虽然出现警告信息,但并未终止进程 <br>
ff ff ff ff <-- 正向解析失败,因为这里指定了0,scz不是点 <br>
分1 <br>
0进制IPv4地址 <br>
[scz@ /home/scz/src]> ./rt scz 1 <br>
c0 a8 08 5a <-- 正向解析成功 <br>
[scz@ /home/scz/src]> ./rt 192.168.8.30 0 <br>
c0 a8 08 1e <br>
[scz@ /home/scz/src]> ./rt 192.168.8.30 1 <br>
c0 a8 08 1e <-- 无论指定0还是1,对于点分地址都能解析成功 <br>
<br>
[scz@ /home/scz/src]> ./rt 256.0.0.0 0 <br>
Warning: Bad resolveObject: 256.0.0.0 <br>
ff ff ff ff <-- 解析失败,因为这个点分地址非法 <br>
[scz@ /home/scz/src]> ./rt 256.0.0.0 1 <br>
Warning: Bad resolveObject: 256.0.0.0 <br>
ff ff ff ff <br>
[scz@ /home/scz/src]> ./rt www.isbase.com 0 <br>
Warning: Bad resolveObject: www.isbase.com <br>
ff ff ff ff <br>
[scz@ /home/scz/src]> ./rt www.isbase.com 1 <br>
ca 63 0b a1 <-- 可以解析FQDN <br>
[scz@ /home/scz/src]> ./rt www.isbase.com 2 <br>
Fatal: Bad method: 2 <-- libnet_error()第一个参数为LIBNET_ERR_FA <br>
TAL <br>
会导致exit <br>
[scz@ /home/scz/src]> <br>
反引号``表示执行其中的命令,并作为这里的输入,所以你可以单独看看究竟输入了 <br>
什么: <br>
[scz@ /home/scz/src]> libnet-config --defines --cflags <br>
-D_BSD_SOURCE -D__BSD_SOURCE -D__FAVOR_BSD -DHAVE_NET_ETHERNET_H -DLIBNET_LI <br>
L_EN <br>
DIAN <br>
[scz@ /home/scz/src]> libnet-config --libs <br>
-lnet <br>
[scz@ /home/scz/src]> file /usr/bin/libnet-config <br>
/usr/bin/libnet-config: Bourne shell script text <br>
[scz@ /home/scz/src]> <br>
以前有ansi88问过编译时出现LIBNET_BIG_ENDIAN相关错误,很可能是直接指定了 <br>
-lnet,却没有指定前面那一堆宏(-D用于命令行传递宏定义),没有仔细man的结果。 <br>
libnet-config是个脚本,如果你感兴趣,可以自己查看。 <br>
[scz@ /home/scz/src]> ls -l /usr/lib/libnet.a <br>
-rw-r--r-- 43142 /usr/lib/libnet.a <br>
[scz@ /home/scz/src]> <br>
libnet.a是一个静态库,这样编译得到的可执行程序将来执行的时候不依赖于系统中 <br>
是否存在该库。 <br>
<待续> <br>
-- <br>
也许有一天,他再从海上蓬蓬的雨点中升起, <br>
飞向西来,再形成一道江流,再冲倒两旁的石壁, <br>
再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... <br>
※ 修改:.scz 于 Jul 24 22:13:37 修改本文.[FROM: 203.207.226.124] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="519.htm">上一层</a>][<a href="527.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -