📄 525.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="526.htm">下一篇</a>]
<hr><p align="left"><small>:网络安全工具开发函数库介绍之一 ——libnet(续三) <br>
---------------------------------------------------------------------------- <br>
---- <br>
: backend 于 00-7-15 17:56:49 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
:绿色兵团版权所有。未经允许,严禁转载! <br>
============================ cut here ============================ <br>
:/* Example 4 [link-layer api - UDP packet using port list chaining] */ <br>
/* gcc -Wall `libnet-config --defines` \ <br>
libnet-example-x.c -o libnet-example-x \ <br>
`libnet-config --libs` */ <br>
#include <libnet.h> <br>
#define MAX_PAYLOAD_SIZE 1024 <br>
void usage(char *); <br>
u_char enet_src[6] = {0x0d, 0x0e, 0x0a, 0x0d, 0x00, 0x00}; <br>
u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; <br>
int main(int argc, char *argv[]) <br>
{ <br>
int packet_size, /* size of our packet */ <br>
payload_size, /* size of our packet */ <br>
c; /* misc */ <br>
u_long src_ip, dst_ip; /* source ip, dest ip */ <br>
u_short bport, eport; /* beginning and end ports */ <br>
u_short cport; /* current port */ <br>
u_char payload[MAX_PAYLOAD_SIZE]; /* packet payload */ <br>
u_char *packet; /* pointer to our packet buffer */ <br>
char err_buf[LIBNET_ERRBUF_SIZE]; /* error buffer */ <br>
u_char *device; /* pointer to the device to use */ <br>
struct libnet_link_int *network; /* pointer to link interface struct <br>
*/ <br>
struct libnet_plist_chain plist; /* plist chain */ <br>
struct libnet_plist_chain *plist_p; /* plist chain pointer */ <br>
printf("libnet example code:\tmodule 4\n\n"); <br>
printf("packet injection interface:\tlink layer\n"); <br>
printf("packet type:\t\t\tUDP [with payload] using port list chaining\n" <br>
); <br>
plist_p = NULL; <br>
device = NULL; <br>
src_ip = 0; <br>
dst_ip = 0; <br>
while ((c = getopt(argc, argv, "i:d:s:p:")) != EOF) <br>
{ <br>
switch (c) <br>
{ <br>
case 'd': <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>
break; <br>
case 'i': <br>
device = optarg; <br>
break; <br>
case 's': <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>
case 'p': <br>
plist_p = &plist; <br>
if (libnet_plist_chain_new(&plist_p, optarg) == -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, <br>
"Could not build port list\n"); <br>
} <br>
break; <br>
default: <br>
usage(argv[0]); <br>
exit(EXIT_FAILURE); <br>
} <br>
} <br>
if (!src_ip || !dst_ip || !plist_p) <br>
{ <br>
usage(argv[0]); <br>
exit(EXIT_FAILURE); <br>
} <br>
c = argc - optind; <br>
if (c != 1) <br>
{ <br>
usage(argv[0]); <br>
exit(EXIT_FAILURE); <br>
} <br>
memset(payload, 0, sizeof(payload)); <br>
strncpy(payload, argv[optind], strlen(argv[optind])); <br>
/* <br>
* Step 1: Network Initialization (interchangable with step 2). <br>
*/ <br>
if (device == NULL) <br>
{ <br>
struct sockaddr_in sin; <br>
/* <br>
* Try to locate a device. <br>
*/ <br>
if (libnet_select_device(&sin, &device, err_buf) == -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, <br>
"libnet_select_device failed: %s\n", err_buf); <br>
} <br>
printf("device:\t\t\t\t%s\n", device); <br>
} <br>
if ((network = libnet_open_link_interface(device, err_buf)) == NULL) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, <br>
"libnet_open_link_interface: %s\n", err_buf); <br>
} <br>
/* <br>
/* <br>
* Get the payload from the user. Hrm. This might fail on a Sparc <br>
* if byte alignment is off... <br>
*/ <br>
payload_size = strlen(payload); <br>
/* <br>
* We're going to build a UDP packet with a payload using the <br>
* link-layer API, so this time we need memory for a ethernet header <br>
* as well as memory for the ICMP and IP headers and our payload. <br>
*/ <br>
packet_size = LIBNET_IP_H + LIBNET_ETH_H + LIBNET_UDP_H + payload_size; <br>
/* <br>
* Step 2: Memory Initialization (interchangable with step 1). <br>
*/ <br>
if (libnet_init_packet(packet_size, &packet) == -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, "libnet_init_packet failed\n"); <br>
} <br>
/* <br>
* Step 3: Packet construction (ethernet header). <br>
*/ <br>
libnet_build_ethernet(enet_dst, <br>
enet_src, <br>
ETHERTYPE_IP, <br>
NULL, <br>
0, <br>
packet); <br>
/* <br>
* Step 3: Packet construction (IP header). <br>
*/ <br>
libnet_build_ip(LIBNET_UDP_H + payload_size, <br>
0, /* IP tos */ <br>
242, /* IP ID */ <br>
0, /* Frag */ <br>
64, /* TTL */ <br>
IPPROTO_UDP, /* Transport protocol */ <br>
src_ip, /* Source IP */ <br>
dst_ip, /* Destination IP */ <br>
NULL, /* Pointer to payload (none) */ <br>
0, <br>
packet + LIBNET_ETH_H); /* Packet header memory */ <br>
while (libnet_plist_chain_next_pair(plist_p, &bport, &eport)) <br>
{ <br>
while (!(bport > eport) && bport != 0) <br>
{ <br>
{ <br>
cport = bport++; <br>
/* <br>
* Step 3: Packet construction (UDP header). <br>
*/ <br>
libnet_build_udp(242, /* source port */ <br>
cport, /* dest. port */ <br>
payload, /* payload */ <br>
payload_size, /* payload length */ <br>
packet + LIBNET_ETH_H + LIBNET_IP_H); <br>
/* <br>
* Step 4: Packet checksums (ICMP header *AND* IP header). <br>
*/ <br>
if (libnet_do_checksum(packet + ETH_H, IPPROTO_UDP, LIBNET_UDP_H <br>
+ payload_size) == -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, "libnet_do_checksum failed\n" <br>
); <br>
} <br>
if (libnet_do_checksum(packet + ETH_H, IPPROTO_IP, LIBNET_IP_H) <br>
== -1) <br>
{ <br>
libnet_error(LIBNET_ERR_FATAL, "libnet_do_checksum failed\n" <br>
); <br>
} <br>
/* <br>
* Step 5: Packet injection. <br>
*/ <br>
c = libnet_write_link_layer(network, device, packet, packet_size <br>
); <br>
if (c < packet_size) <br>
{ <br>
libnet_error(LN_ERR_WARNING, <br>
"libnet_write_link_layer only wrote %d bytes\n" <br>
, c); <br>
} <br>
else <br>
{ <br>
printf("construction and injection completed, wrote all %d b <br>
ytes, port %d\n", <br>
c, cport); <br>
} <br>
} <br>
} <br>
/* <br>
/* <br>
* Shut down the interface. <br>
*/ <br>
if (libnet_close_link_interface(network) == -1) <br>
{ <br>
libnet_error(LN_ERR_WARNING, <br>
"libnet_close_link_interface 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 [-i interface] -s s_ip -d d_ip -p port list p <br>
ayload\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="526.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 + -