# # ETHERSPOOF diff for Mac OS X 10.2 / Darwin 6.0 # by peter bartoli, version 2.0 of 9/4/2002 # # to install # 1. unpack and cd to your xnu source tree # 2. patch -p0 -b [--verbose --suffix=.orig] < ETHERSPOOF+RAW4ALL.patch # 3. build xnu and install your kernel # --- bsd/net/ether_if_module.c.orig Thu Jul 11 23:09:54 2002 +++ bsd/net/ether_if_module.c Wed Sep 4 00:58:03 2002 @@ -462,12 +462,25 @@ eh = mtod(*m, struct ether_header *); (void)memcpy(&eh->ether_type, ether_type, sizeof(eh->ether_type)); (void)memcpy(eh->ether_dhost, edst, 6); +#ifdef ETHERSPOOF + if (ndest->sa_family == AF_UNSPEC) { + (void)memcpy((u_char *)eh->ether_shost, + (u_char *)((struct ether_header *)(ndest->sa_data))->ether_shost, + sizeof(eh->ether_shost)); + } + else + { + (void)memcpy(eh->ether_shost, ac->ac_enaddr, + sizeof(eh->ether_shost)); + } +#else (void)memcpy(eh->ether_shost, ac->ac_enaddr, sizeof(eh->ether_shost)); +#endif /* ETHERSPOOF */ return 0; } --- bsd/netinet/if_ether.c.orig Sat Apr 6 23:41:52 2002 +++ bsd/netinet/if_ether.c Wed Sep 4 01:08:09 2002 @@ -395,10 +395,13 @@ } ea->arp_pro = htons(ETHERTYPE_IP); ea->arp_hln = sizeof(ea->arp_sha); /* hardware address length */ ea->arp_pln = sizeof(ea->arp_spa); /* protocol address length */ ea->arp_op = htons(ARPOP_REQUEST); +#ifdef ETHERSPOOF + (void)memcpy(eh->ether_shost, enaddr, sizeof(eh->ether_shost)); +#endif /* ETHERSPOOF */ (void)memcpy(ea->arp_sha, enaddr, sizeof(ea->arp_sha)); (void)memcpy(ea->arp_spa, sip, sizeof(ea->arp_spa)); (void)memcpy(ea->arp_tpa, tip, sizeof(ea->arp_tpa)); sa.sa_family = AF_UNSPEC; sa.sa_len = sizeof(sa); @@ -810,10 +813,13 @@ if (IN_LINKLOCAL(ntohl(*((u_int32_t*)ea->arp_spa)))) (void)memcpy(eh->ether_dhost, etherbroadcastaddr, sizeof(eh->ether_dhost)); else #endif (void)memcpy(eh->ether_dhost, ea->arp_tha, sizeof(eh->ether_dhost)); +#ifdef ETHERSPOOF + (void)memcpy(eh->ether_shost, ac->ac_enaddr, sizeof(eh->ether_shost)); +#endif /* ETHERSPOOF */ eh->ether_type = htons(ETHERTYPE_ARP); break; } sa.sa_family = AF_UNSPEC; sa.sa_len = sizeof(sa);