📄 523.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="518.htm">上一层</a>][<a href="524.htm">下一篇</a>]
<hr><p align="left"><small>:网络安全工具开发函数库介绍之一 ——libnet(续一) <br>
---------------------------------------------------------------------------- <br>
---- <br>
: backend 于 00-7-15 17:49:59 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
:绿色兵团版权所有。未经允许,严禁转载! <br>
>> <br>
:★ 数据包发送函数 <br>
打开raw socket: <br>
int libnet_open_raw_sock(int protocol); <br>
关闭raw socket: <br>
int libnet_close_raw_sock(int socket); <br>
选择接口设备: <br>
int libnet_select_device(struct sockaddr_in *sin, <br>
u_char **device, u_char *ebuf); <br>
打开链路层接口设备: <br>
struct libnet_link_int *libnet_open_link_interface(char *device, <br>
char *ebuf); <br>
关闭链路层接口设备: <br>
int libnet_close_link_interface(struct libnet_link_int *l); <br>
发送IP数据包: <br>
int libnet_write_ip(int socket, u_char *packet, int packet_size); <br>
发送链路层数据包: <br>
int libnet_write_link_layer(struct libnet_link_int *l, <br>
const u_char *device, u_char *packet, <br>
int packet_size); <br>
检验和计算: <br>
int libnet_do_checksum(u_char *packet, int protocol, int packet_size <br>
); <br>
:★ 相关的支持函数 <br>
随机数种子生成器: <br>
int libnet_seed_prand(); <br>
获取随机数: <br>
u_long libnet_get_prand(int modulus); <br>
16进制数据输出: <br>
void libnet_hex_dump(u_char * buf, int len, int swap, FILE *stream); <br>
<br>
端口列表链初始化: <br>
int libnet_plist_chain_new(struct libnet_plist_chain **plist, <br>
char *token_list); <br>
获取端口列表链的下一项(端口范围): <br>
int libnet_plist_chain_next_pair(struct libnet_plist_chain *plist, <br>
u_short *bport, u_short *eport); <br>
端口列表链输出显示: <br>
int libnet_plist_chain_dump(struct libnet_plist_chain *plist); <br>
获取端口列表链: <br>
u_char *libnet_plist_chain_dump_string(struct libnet_plist_chain *pl <br>
ist); <br>
端口列表链内存释放: <br>
void libnet_plist_chain_free(struct libnet_plist_chain *plist); <br>
:★ 数据常量 <br>
============================================================================ <br>
====== <br>
:数据包头大小定义: <br>
常量名 数值(字节数) <br>
LIBNET_ARP_H 28 <br>
LIBNET_DNS_H 12 <br>
LIBNET_ETH_H 14 <br>
LIBNET_ICMP_H 4 <br>
LIBNET_ICMP_ECHO_H 8 <br>
LIBNET_ICMP_MASK_H 12 <br>
LIBNET_ICMP_UNREACH_H 8 <br>
LIBNET_ICMP_TIMXCEED_H 8 <br>
LIBNET_ICMP_REDIRECT_H 8 <br>
LIBNET_ICMP_TS_H 20 <br>
LIBNET_IGMP_H 8 <br>
LIBNET_IP_H 20 <br>
LIBNET_RIP_H 24 <br>
LIBNET_TCP_H 20 <br>
LIBNET_UDP_H 8 <br>
============================================================================ <br>
====== <br>
:数据包内存常量: <br>
常量名 含义 <br>
LIBNET_PACKET TCP/UDP数据包头 + IP数据包头使用的内存 <br>
LIBNET_OPTS IP或TCP选项使用的内存 <br>
LIBNET_MAX_PACKET IP_MAXPACKET (65535字节)使用的内存 <br>
============================================================================ <br>
====== <br>
:随机数发生器常量(libnet_get_prand()函数使用): <br>
常量名 数值 <br>
LIBNET_PRAND_MAX 65535 <br>
LIBNET_PR2 0 - 2 <br>
LIBNET_PR8 0 - 255 <br>
LIBNET_PR16 0 - 32767 <br>
LIBNET_PRu16 0 - 65535 <br>
LIBNET_PR32 0 - 2147483647 <br>
LIBNET_PRu32 0 - 4294967295 <br>
============================================================================ <br>
====== <br>
:错误消息常量(libnet_error()函数使用): <br>
常量名 含义 <br>
LIBNET_ERR_WARNING 警告类型消息 <br>
LIBNET_ERR_CRITICAL 紧急类型消息 <br>
LIBNET_ERR_FATAL 致命错误消息 <br>
============================================================================ <br>
====== <br>
:libnet_host_lookup()、libnet_host_lookup_r()和libnet_name_resolve()函数使用的 <br>
:常量: <br>
常量名 含义 <br>
LIBNET_DONT_RESOLVE 不将IP地址解析为FQDN名 <br>
LIBNET_RESOLVE 尝试将IP地址解析为FQDN名 <br>
============================================================================ <br>
====== <br>
:宏定义 <br>
宏名 功能 <br>
LIBNET_GET_ARENA_SIZE(arena) 返回多数据包内存缓冲区大小(字节数) <br>
LIBNET_GET_ARENA_REMAINING_BYTES(arena) 返回多数据包内存缓冲区剩余空间大小(字 <br>
节数) <br>
LIBNET_PRINT_ETH_ADDR(e) 输出显示ether_addr结构中的以太网地址 <br>
<br>
<br>
============================================================================ <br>
====== <br>
:---[[ libnet应用实例 ]]---------------------------------- <br>
利用libnet函数库开发应用程序的基本步骤非常简单: <br>
1、数据包内存初始化; <br>
2、网络接口初始化; <br>
3、构造所需数据包; <br>
4、计算数据包检验和; <br>
5、发送数据包; <br>
6、关闭网络接口; <br>
7、释放数据包内存。 <br>
以下是四个使用了libnet接口函数编写的数据包发送程序。在编译前必须确保libn <br>
et库已成功安装。 <br>
============================ cut here ============================ <br>
/* Example 1 [raw socket api - TCP packet] */ <br>
/* gcc -Wall `libnet-config --defines` \ <br>
libnet-example-x.c -o libnet-example-x \ <br>
`libnet-config --libs` */ <br>
#include <libnet.h> <br>
void usage(char *); <br>
int main(int argc, char **argv) <br>
{ <br>
{ <br>
int network, /* our network interface */ <br>
packet_size, /* packet size */ <br>
c; /* misc */ <br>
u_long src_ip, dst_ip; /* ip addresses */ <br>
u_short src_prt, dst_prt; /* ports */ <br>
u_char *cp, *packet; /* misc / packet */ <br>
printf("libnet example code:\tmodule 1\n\n"); <br>
printf("packet injection interface:\traw socket\n"); <br>
printf("packet type:\t\t\tTCP [no payload]\n"); <br>
src_ip = 0; <br>
dst_ip = 0; <br>
src_prt = 0; <br>
dst_prt = 0; <br>
while((c = getopt(argc, argv, "d:s:")) != EOF) <br>
{ <br>
switch (c) <br>
{ <br>
/* <br>
* We expect the input to be of the form `ip.ip.ip.ip.port`. W <br>
e <br>
* point cp to the last dot of the IP address/port string and <br>
* then seperate them with a NULL byte. The optarg now points <br>
to <br>
* just the IP address, and cp points to the port. <br>
*/ <br>
case 'd': <br>
if (!(cp = strrchr(optarg, '.'))) <br>
{ <br>
usage(argv[0]); <br>
} <br>
*cp++ = 0; <br>
dst_prt = (u_short)atoi(cp); <br>
if (!(dst_ip = libnet_name_resolve(optarg, LIBNET_RESOLVE))) <br>
<br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, <br>
"Bad destination IP address: %s\n", optarg) <br>
; <br>
} <br>
break; <br>
case 's': <br>
if (!(cp = strrchr(optarg, '.'))) <br>
{ <br>
usage(argv[0]); <br>
} <br>
*cp++ = 0; <br>
src_prt = (u_short)atoi(cp); <br>
if (!(src_ip = libnet_name_resolve(optarg, LIBNET_RESOLVE))) <br>
<br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, <br>
"Bad source IP address: %s\n", optarg); <br>
} <br>
break; <br>
} <br>
} <br>
if (!src_ip || !src_prt || !dst_ip || !dst_prt) <br>
{ <br>
usage(argv[0]); <br>
exit(EXIT_FAILURE); <br>
} <br>
/* <br>
* We're just going to build a TCP packet with no payload using the <br>
* raw sockets API, so we only need memory for a TCP header and an IP <br>
* header. <br>
*/ <br>
*/ <br>
packet_size = LIBNET_IP_H + LIBNET_TCP_H; <br>
/* <br>
* Step 1: Memory initialization (interchangable with step 2). <br>
*/ <br>
libnet_init_packet(packet_size, &packet); <br>
if (packet == NULL) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, "libnet_init_packet failed\n"); <br>
} <br>
/* <br>
* Step 2: Network initialization (interchangable with step 1). <br>
*/ <br>
network = libnet_open_raw_sock(IPPROTO_RAW); <br>
if (network == -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, "Can't open network.\n"); <br>
} <br>
/* <br>
* Step 3: Packet construction (IP header). <br>
*/ <br>
libnet_build_ip(LIBNET_TCP_H, /* size of the packet sans IP header */ <br>
IPTOS_LOWDELAY, /* IP tos */ <br>
242, /* IP ID */ <br>
0, /* frag stuff */ <br>
48, /* TTL */ <br>
IPPROTO_TCP, /* transport protocol */ <br>
src_ip, /* source IP */ <br>
dst_ip, /* destination IP */ <br>
NULL, /* payload (none) */ <br>
0, /* payload length */ <br>
packet); /* packet header memory */ <br>
/* <br>
* Step 3: Packet construction (TCP header). <br>
*/ <br>
libnet_build_tcp(src_prt, /* source TCP port */ <br>
dst_prt, /* destination TCP port */ <br>
0xa1d95, /* sequence number */ <br>
0x53, /* acknowledgement number */ <br>
TH_SYN, /* control flags */ <br>
1024, /* window size */ <br>
0, /* urgent pointer */ <br>
NULL, /* payload (none) */ <br>
0, /* payload length */ <br>
packet + LIBNET_IP_H); /* packet header memory */ <br>
/* <br>
* Step 4: Packet checksums (TCP header only). <br>
*/ <br>
if (libnet_do_checksum(packet, IPPROTO_TCP, LIBNET_TCP_H) == -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, "libnet_do_checksum failed\n"); <br>
} <br>
/* <br>
* Step 5: Packet injection. <br>
*/ <br>
c = libnet_write_ip(network, packet, packet_size); <br>
if (c < packet_size) <br>
{ <br>
libnet_error(LN_ERR_WARNING, <br>
"libnet_write_ip only wrote %d bytes\n", c); <br>
} <br>
else <br>
{ <br>
printf("construction and injection completed, wrote all %d bytes\n", <br>
c); <br>
} <br>
/* <br>
* Shut down the interface. <br>
*/ <br>
if (libnet_close_raw_sock(network) == -1) <br>
{ <br>
libnet_error(LN_ERR_WARNING, <br>
"libnet_close_raw_sock couldn't close the interface"); <br>
} <br>
/* <br>
* Free packet memory. <br>
*/ <br>
libnet_destroy_packet(&packet); <br>
return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS); <br>
} <br>
void usage(char *name) <br>
{ <br>
fprintf(stderr, "usage: %s -s s_ip.s_port -d d_ip.d_port\n", name); <br>
} <br>
============================ cut here ============================ <br>
<<< 待续 >>> <br>
绿色兵团版权所有。未经允许,严禁转载! <br>
=== 说难不难,说易不易。=== <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="518.htm">上一层</a>][<a href="524.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 + -