|
@@ -0,0 +1,142 @@
|
|
|
|
+--- rarpd-1.1.orig/rarpd.c 1999-11-17 01:51:22.000000000 +0100
|
|
|
|
++++ rarpd-1.1/rarpd.c 2009-12-11 14:28:32.000000000 +0100
|
|
|
|
+@@ -65,18 +65,12 @@
|
|
|
|
+ #define ETHERSTRLEN sizeof("00:00:00:00:00:00")
|
|
|
|
+ #define IPSTRLEN sizeof(".xxx.xxx.xxx.xxx")
|
|
|
|
+
|
|
|
|
+-#ifdef NEW_LIBNET_INTERFACE
|
|
|
|
+-#define open_link_interface libnet_open_link_interface
|
|
|
|
+-#define link_int libnet_link_int
|
|
|
|
+-#define build_arp libnet_build_arp
|
|
|
|
+-#define get_ipaddr libnet_get_ipaddr
|
|
|
|
+-#define get_hwaddr libnet_get_hwaddr
|
|
|
|
+-#define build_ethernet libnet_build_ethernet
|
|
|
|
+-#define write_link_layer libnet_write_link_layer
|
|
|
|
+-
|
|
|
|
+-/* Temporary workaround */
|
|
|
|
+-#define ARP_H LIBNET_ARP_H
|
|
|
|
+-#endif
|
|
|
|
++struct _ipv4_arp_data_ {
|
|
|
|
++ u_char ar_sha[6]; /* sender hardware address */
|
|
|
|
++ u_char ar_spa[4]; /* sender protocol address */
|
|
|
|
++ u_char ar_tha[6]; /* target hardware address */
|
|
|
|
++ u_char ar_tpa[4]; /* target protocol address */
|
|
|
|
++};
|
|
|
|
+
|
|
|
|
+ extern char pcap_version[];
|
|
|
|
+ extern int optind;
|
|
|
|
+@@ -88,7 +82,7 @@ static int vflag; /
|
|
|
|
+ static char *program_name;
|
|
|
|
+
|
|
|
|
+ static pcap_t *pd;
|
|
|
|
+-static struct link_int *ln;
|
|
|
|
++static libnet_t *ld;
|
|
|
|
+ static char *device, *ethers;
|
|
|
|
+ struct in_addr my_ipaddr;
|
|
|
|
+ static u_char my_hwaddr[ETHERADDRLEN];
|
|
|
|
+@@ -285,23 +279,34 @@ void set_arp(struct in_addr *herip, unsi
|
|
|
|
+ void send_rarpreply(unsigned char *dest_hwaddr,
|
|
|
|
+ unsigned char *her_hwaddr, struct in_addr *her_ipaddr)
|
|
|
|
+ {
|
|
|
|
+- char ebuf[PCAP_ERRBUF_SIZE];
|
|
|
|
+- u_char buf[ARP_H+ETH_H];
|
|
|
|
+-
|
|
|
|
+- memset(buf, 0, ARP_H + ETH_H);
|
|
|
|
+-
|
|
|
|
+- /* Ethernet header */
|
|
|
|
+- build_ethernet(dest_hwaddr, my_hwaddr, ETHERTYPE_REVARP, NULL, 0, buf);
|
|
|
|
++ int c;
|
|
|
|
++ libnet_ptag_t t;
|
|
|
|
+
|
|
|
|
+ /* ARP header */
|
|
|
|
+- build_arp(ARPHRD_ETHER, ETHERTYPE_IP,
|
|
|
|
++ t = libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP,
|
|
|
|
+ ETHERADDRLEN, IPADDRLEN,
|
|
|
|
+ ARPOP_REVREPLY,
|
|
|
|
+ my_hwaddr, (u_char *)&(my_ipaddr.s_addr),
|
|
|
|
+ her_hwaddr, (u_char *)&(her_ipaddr->s_addr),
|
|
|
|
+- NULL, 0, buf + ETH_H);
|
|
|
|
++ NULL, 0, ld, 0);
|
|
|
|
++ if (t == -1) {
|
|
|
|
++ syslog(LOG_ERR, "%s: Can't build ARP header: %s", program_name, libnet_geterror(ld));
|
|
|
|
++ exit(1);
|
|
|
|
++ }
|
|
|
|
+
|
|
|
|
+- write_link_layer(ln, (const u_char *)device, buf, ARP_H + ETH_H);
|
|
|
|
++ /* Ethernet header */
|
|
|
|
++ t = libnet_build_ethernet(dest_hwaddr, my_hwaddr, ETHERTYPE_REVARP, NULL, 0, ld, 0);
|
|
|
|
++ if (t == -1) {
|
|
|
|
++ syslog(LOG_ERR, "%s: Can't build ethernet header: %s", program_name,
|
|
|
|
++ libnet_geterror(ld));
|
|
|
|
++ exit(1);
|
|
|
|
++ }
|
|
|
|
++
|
|
|
|
++ c = libnet_write(ld);
|
|
|
|
++ if (c == -1) {
|
|
|
|
++ syslog(LOG_ERR, "%s: Write error: %s", program_name, libnet_geterror(ld));
|
|
|
|
++ exit(1);
|
|
|
|
++ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+@@ -314,11 +319,13 @@ void process_arp(u_char *user, const str
|
|
|
|
+ unsigned short pro, hrd, op;
|
|
|
|
+ struct in_addr her_ipaddr;
|
|
|
|
+ struct libnet_arp_hdr *ap;
|
|
|
|
++ struct _ipv4_arp_data_ *ad;
|
|
|
|
+ struct hostent *hp;
|
|
|
|
+ char *ipp;
|
|
|
|
+
|
|
|
|
+ bp += sizeof(struct libnet_ethernet_hdr);
|
|
|
|
+ ap = (struct libnet_arp_hdr *)bp;
|
|
|
|
++ ad = (struct _ipv4_arp_data_ *)(bp + sizeof(*ap));
|
|
|
|
+
|
|
|
|
+ pro = EXTRACT_16BITS (&ap->ar_pro);
|
|
|
|
+ hrd = EXTRACT_16BITS (&ap->ar_hrd);
|
|
|
|
+@@ -331,10 +338,10 @@ void process_arp(u_char *user, const str
|
|
|
|
+ /* We only answer RARP requests */
|
|
|
|
+ if (op != ARPOP_REVREQUEST) return;
|
|
|
|
+
|
|
|
|
+- sha = ap->ar_sha;
|
|
|
|
+- spa = ap->ar_spa;
|
|
|
|
+- tha = ap->ar_tha;
|
|
|
|
+- tpa = ap->ar_tpa;
|
|
|
|
++ sha = ad->ar_sha;
|
|
|
|
++ spa = ad->ar_spa;
|
|
|
|
++ tha = ad->ar_tha;
|
|
|
|
++ tpa = ad->ar_tpa;
|
|
|
|
+
|
|
|
|
+ if (my_ether_ntohost(toret, tha)) {
|
|
|
|
+ if (vflag) {
|
|
|
|
+@@ -399,6 +406,7 @@ int main(int argc, char **argv)
|
|
|
|
+ int nofork, op, pid, syslogflags;
|
|
|
|
+ bpf_u_int32 localnet, netmask;
|
|
|
|
+ char ebuf[PCAP_ERRBUF_SIZE];
|
|
|
|
++ char errbuf[LIBNET_ERRBUF_SIZE];
|
|
|
|
+ char *cmdbuf;
|
|
|
|
+ struct bpf_program fcode;
|
|
|
|
+
|
|
|
|
+@@ -446,9 +454,9 @@ int main(int argc, char **argv)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+- ln = open_link_interface(device, ebuf);
|
|
|
|
+- if (ln == NULL) {
|
|
|
|
+- syslog(LOG_ERR, "%s: %s", program_name, ebuf);
|
|
|
|
++ ld = libnet_init(LIBNET_LINK, device, errbuf);
|
|
|
|
++ if (ld == NULL) {
|
|
|
|
++ syslog(LOG_ERR, "%s: %s", program_name, errbuf);
|
|
|
|
+ exit(1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+@@ -465,8 +473,8 @@ int main(int argc, char **argv)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ memset(&my_ipaddr, 0, sizeof(my_ipaddr));
|
|
|
|
+- my_ipaddr.s_addr = htonl(get_ipaddr(ln, device, ebuf));
|
|
|
|
+- memcpy(my_hwaddr, (char *)get_hwaddr(ln, device, ebuf), ETHERADDRLEN);
|
|
|
|
++ my_ipaddr.s_addr = libnet_get_ipaddr4(ld);
|
|
|
|
++ memcpy(my_hwaddr, (char *) libnet_get_hwaddr(ld), ETHERADDRLEN);
|
|
|
|
+
|
|
|
|
+ setuid(getuid());
|
|
|
|
+
|