version 1.1.1.1, 2012/02/21 22:14:23
|
version 1.1.1.3, 2023/09/27 11:11:38
|
Line 31
|
Line 31
|
* |
* |
*/ |
*/ |
|
|
#if (HAVE_CONFIG_H) |
|
#include "../include/config.h" |
|
#endif |
|
#include "./libnet_test.h" |
#include "./libnet_test.h" |
#ifdef __WIN32__ |
|
#include "../include/win32/getopt.h" |
|
#endif |
|
|
|
void |
void |
usage(char *prog) |
usage(char *prog) |
Line 64 main(int argc, char *argv[])
|
Line 58 main(int argc, char *argv[])
|
|
|
char errbuf[LIBNET_ERRBUF_SIZE]; |
char errbuf[LIBNET_ERRBUF_SIZE]; |
|
|
u_char options_req[] = { LIBNET_DHCP_SUBNETMASK , LIBNET_DHCP_BROADCASTADDR , LIBNET_DHCP_TIMEOFFSET , LIBNET_DHCP_ROUTER , LIBNET_DHCP_DOMAINNAME , LIBNET_DHCP_DNS , LIBNET_DHCP_HOSTNAME }; | u_char options_req[] = { LIBNET_DHCP_SUBNETMASK, |
| LIBNET_DHCP_BROADCASTADDR, LIBNET_DHCP_TIMEOFFSET, |
| LIBNET_DHCP_ROUTER, LIBNET_DHCP_DOMAINNAME, |
| LIBNET_DHCP_DNS, LIBNET_DHCP_HOSTNAME }; |
u_char *options; |
u_char *options; |
u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
u_char *tmp; |
u_char *tmp; |
|
|
// have to specify interface |
|
if (argc != 2) |
if (argc != 2) |
|
{ |
usage(argv[0]); |
usage(argv[0]); |
|
} |
intf = argv[1]; |
intf = argv[1]; |
|
|
l = libnet_init( | l = libnet_init(LIBNET_LINK, intf, errbuf); |
LIBNET_LINK, // injection type | |
intf, // network interface | |
errbuf); // errbuf | |
if (!l) |
if (!l) |
{ |
{ |
fprintf(stderr, "libnet_init: %s", errbuf); |
fprintf(stderr, "libnet_init: %s", errbuf); |
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
} |
} |
else { | else |
| { |
src_ip = libnet_get_ipaddr4(l);; |
src_ip = libnet_get_ipaddr4(l);; |
|
|
if ((ethaddr = libnet_get_hwaddr(l)) == NULL) |
if ((ethaddr = libnet_get_hwaddr(l)) == NULL) |
Line 92 main(int argc, char *argv[])
|
Line 88 main(int argc, char *argv[])
|
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
} |
} |
|
|
printf("ip addr : %s\n", libnet_addr2name4(src_ip, LIBNET_DONT_RESOLVE)); | printf("ip addr : %s\n", libnet_addr2name4(src_ip, |
| LIBNET_DONT_RESOLVE)); |
printf("eth addr : "); |
printf("eth addr : "); |
for (i = 0; i < 6; i++) { | for (i = 0; i < 6; i++) |
| { |
printf("%2.2x", ethaddr->ether_addr_octet[i]); |
printf("%2.2x", ethaddr->ether_addr_octet[i]); |
if (i != 5) { | if (i != 5) |
| { |
printf(":"); |
printf(":"); |
} |
} |
} |
} |
printf("\n"); |
printf("\n"); |
|
|
|
|
// build options packet | /* build options packet */ |
i = 0; |
i = 0; |
options_len = 3; // update total payload size | /* update total payload size */ |
| options_len = 3; |
|
|
// we are a discover packet | /* we are a discover packet */ |
options = malloc(3); |
options = malloc(3); |
options[i++] = LIBNET_DHCP_MESSAGETYPE; // type | options[i++] = LIBNET_DHCP_MESSAGETYPE; /* type */ |
options[i++] = 1; // len | options[i++] = 1; /* len */ |
options[i++] = LIBNET_DHCP_MSGDISCOVER; // data | options[i++] = LIBNET_DHCP_MSGDISCOVER; /* data */ |
|
|
orig_len = options_len; |
orig_len = options_len; |
options_len += sizeof(options_req) + 2; // update total payload size | /* update total payload size */ |
| options_len += sizeof(options_req) + 2; |
|
|
// workaround for realloc on old machines |
|
// options = realloc(options, options_len); // resize options buffer |
|
tmp = malloc(options_len); |
tmp = malloc(options_len); |
memcpy(tmp, options, orig_len); |
memcpy(tmp, options, orig_len); |
free(options); |
free(options); |
options = tmp; |
options = tmp; |
|
|
// we are going to request some parameters | /* we are going to request some parameters */ |
options[i++] = LIBNET_DHCP_PARAMREQUEST; // type | options[i++] = LIBNET_DHCP_PARAMREQUEST; /* type */ |
options[i++] = sizeof(options_req); // len | options[i++] = sizeof(options_req); /* len */ |
memcpy(options + i, options_req, sizeof(options_req)); // data | memcpy(options + i, options_req, sizeof(options_req)); /* data */ |
i += sizeof(options_req); |
i += sizeof(options_req); |
|
|
// if we have an ip already, let's request it. | /* if we have an ip already, let's request it. */ |
if (src_ip) |
if (src_ip) |
{ |
{ |
orig_len = options_len; |
orig_len = options_len; |
options_len += 2 + sizeof(src_ip); |
options_len += 2 + sizeof(src_ip); |
|
|
// workaround for realloc on old machines |
|
// options = realloc(options, options_len); |
|
tmp = malloc(options_len); |
tmp = malloc(options_len); |
memcpy(tmp, options, orig_len); |
memcpy(tmp, options, orig_len); |
free(options); |
free(options); |
options = tmp; |
options = tmp; |
|
|
options[i++] = LIBNET_DHCP_DISCOVERADDR; // type | options[i++] = LIBNET_DHCP_DISCOVERADDR; /* type */ |
options[i++] = sizeof(src_ip); // len | options[i++] = sizeof(src_ip); /* len */ |
memcpy(options + i, (char *)&src_ip, sizeof(src_ip));// data | memcpy(options + i, (char *)&src_ip, sizeof(src_ip)); /* data */ |
i += sizeof(src_ip); |
i += sizeof(src_ip); |
} |
} |
|
|
// end our options packet | /* end our options packet */ |
// workaround for realloc on old machines | |
// options = realloc(options, options_len); // resize options buffer | |
orig_len = options_len; |
orig_len = options_len; |
options_len += 1; |
options_len += 1; |
tmp = malloc(options_len); |
tmp = malloc(options_len); |
Line 160 main(int argc, char *argv[])
|
Line 155 main(int argc, char *argv[])
|
options[i++] = LIBNET_DHCP_END; |
options[i++] = LIBNET_DHCP_END; |
|
|
|
|
// make sure we are at least the minimum length, if not fill | /* make sure we are at least the minimum length, if not fill */ |
// this could go in libnet, but we will leave it in the app for now | /* this could go in libnet, but we will leave it in the app for now */ |
if (options_len + LIBNET_DHCPV4_H < LIBNET_BOOTP_MIN_LEN) |
if (options_len + LIBNET_DHCPV4_H < LIBNET_BOOTP_MIN_LEN) |
{ |
{ |
orig_len = options_len; |
orig_len = options_len; |
options_len = LIBNET_BOOTP_MIN_LEN - LIBNET_DHCPV4_H; |
options_len = LIBNET_BOOTP_MIN_LEN - LIBNET_DHCPV4_H; |
|
|
// workaround for realloc on old machines |
|
// options = realloc(options, options_len); |
|
tmp = malloc(options_len); |
tmp = malloc(options_len); |
memcpy(tmp, options, orig_len); |
memcpy(tmp, options, orig_len); |
free(options); |
free(options); |
Line 177 main(int argc, char *argv[])
|
Line 170 main(int argc, char *argv[])
|
memset(options + i, 0, options_len - i); |
memset(options + i, 0, options_len - i); |
} |
} |
|
|
// the goodies are here |
|
dhcp = libnet_build_dhcpv4( |
dhcp = libnet_build_dhcpv4( |
LIBNET_DHCP_REQUEST, // opcode | LIBNET_DHCP_REQUEST, /* opcode */ |
1, // hardware type | 1, /* hardware type */ |
6, // hardware address length | 6, /* hardware address length */ |
0, // hop count | 0, /* hop count */ |
0xdeadbeef, // transaction id | 0xdeadbeef, /* transaction id */ |
0, // seconds since bootstrap | 0, /* seconds since bootstrap */ |
0x8000, // flags | 0x8000, /* flags */ |
0, // client ip | 0, /* client ip */ |
0, // your ip | 0, /* your ip */ |
0, // server ip | 0, /* server ip */ |
0, // gateway ip | 0, /* gateway ip */ |
ethaddr->ether_addr_octet, // client hardware addr | ethaddr->ether_addr_octet, /* client hardware addr */ |
NULL, // server host name | NULL, /* server host name */ |
NULL, // boot file | NULL, /* boot file */ |
options, // dhcp options stuck in payload since it is dynamic | options, /* dhcp options in payload */ |
options_len, // length of options | options_len, /* length of options */ |
l, // libnet handle | l, /* libnet context */ |
0); // libnet id | 0); /* libnet ptag */ |
|
|
// wrap it |
|
udp = libnet_build_udp( |
udp = libnet_build_udp( |
68, // source port | 68, /* source port */ |
67, // destination port | 67, /* destination port */ |
LIBNET_UDP_H + LIBNET_DHCPV4_H + options_len, // packet size | LIBNET_UDP_H + LIBNET_DHCPV4_H + options_len, /* packet size */ |
0, // checksum | 0, /* checksum */ |
NULL, // payload | NULL, /* payload */ |
0, // payload size | 0, /* payload size */ |
l, // libnet handle | l, /* libnet context */ |
0); // libnet id | 0); /* libnet ptag */ |
|
|
// hook me up with some ipv4 |
|
ip = libnet_build_ipv4( |
ip = libnet_build_ipv4( |
LIBNET_IPV4_H + LIBNET_UDP_H + LIBNET_DHCPV4_H |
LIBNET_IPV4_H + LIBNET_UDP_H + LIBNET_DHCPV4_H |
+ options_len, // length | + options_len, /* length */ |
0x10, // TOS | 0x10, /* TOS */ |
0, // IP ID | 0, /* IP ID */ |
0, // IP Frag | 0, /* IP Frag */ |
16, // TTL | 16, /* TTL */ |
IPPROTO_UDP, // protocol | IPPROTO_UDP, /* protocol */ |
0, // checksum | 0, /* checksum */ |
src_ip, // src ip | src_ip, /* src ip */ |
inet_addr("255.255.255.255"), // destination ip | inet_addr("255.255.255.255"), /* destination ip */ |
NULL, // payload | NULL, /* payload */ |
0, // payload size | 0, /* payload size */ |
l, // libnet handle | l, /* libnet context */ |
0); // libnet id | 0); /* libnet ptag */ |
|
|
// we can just autobuild since we arent doing anything tricky |
|
t = libnet_autobuild_ethernet( |
t = libnet_autobuild_ethernet( |
enet_dst, // ethernet destination | enet_dst, /* ethernet destination */ |
ETHERTYPE_IP, // protocol type | ETHERTYPE_IP, /* protocol type */ |
l); // libnet handle | l); /* libnet context */ |
|
|
// write to the wire |
|
if (libnet_write(l) == -1) |
if (libnet_write(l) == -1) |
{ |
{ |
fprintf(stderr, " %s: libnet_write: %s\n", argv[0], |
fprintf(stderr, " %s: libnet_write: %s\n", argv[0], |
Line 240 main(int argc, char *argv[])
|
Line 228 main(int argc, char *argv[])
|
exit(EXIT_FAILURE); |
exit(EXIT_FAILURE); |
} |
} |
|
|
// fill and print stats |
|
libnet_stats(l, &ls); |
libnet_stats(l, &ls); |
fprintf(stderr, "Packets sent: %lld\n" |
fprintf(stderr, "Packets sent: %lld\n" |
"Packet errors: %lld\n" |
"Packet errors: %lld\n" |
"Bytes written: %lld\n", |
"Bytes written: %lld\n", |
ls.packets_sent, ls.packet_errors, ls.bytes_written); | (long long)ls.packets_sent, (long long)ls.packet_errors, |
| (long long)ls.bytes_written); |
libnet_destroy(l); |
libnet_destroy(l); |
|
|
// free mem |
|
free(options); |
free(options); |
|
|
exit(0); |
exit(0); |