#define _GNU_SOURCE #include #include #include #include #include #include /* the L2 protocols */ #include #include #include #include #include #include #include #include #include struct sockaddr_ll addr_pkt = { .sll_family = AF_PACKET, .sll_halen = 6, .sll_addr = {0x00, 0x42, 0x42, 0x42, 0x42, 0x42}, }; struct ifaddrs ifa1 = { .ifa_next = 0, .ifa_name = "eth0", .ifa_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING, .ifa_addr = (struct sockaddr *)&addr_pkt }; struct sockaddr_in addr0 = { .sin_family = AF_INET, .sin_addr.s_addr = 0x0100000a, }; struct sockaddr_in mask0 = { .sin_family = AF_INET, .sin_addr.s_addr = 0x00ffffff, }; struct sockaddr_in bcast0 = { .sin_family = AF_INET, .sin_addr.s_addr = 0xff00000a, }; struct ifaddrs ifa0 = { .ifa_next = &ifa1, .ifa_name = "eth0", .ifa_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING, .ifa_addr = (struct sockaddr *)&addr0, .ifa_netmask = (struct sockaddr *)&mask0, .ifa_ifu.ifu_broadaddr = (struct sockaddr *)&bcast0 }; int getifaddrs(struct ifaddrs **ifap) { *ifap = &ifa0; } void freeifaddrs(struct ifaddrs *ifa) { (void*)ifa; } #define SIOCGIFHWADDR 0x8927 int ioctl(int d, unsigned long int request, ...) { va_list ap; va_start(ap, request); void *argp = va_arg(ap, void*); va_end(ap); static void *handle = 0; static int (*orig_ioctl)(int, int, void*); int ret; char *p; if (!orig_ioctl) { orig_ioctl = dlsym(RTLD_NEXT, "ioctl"); } if (request == SIOCGIFHWADDR) { struct ifreq *ifr = argp; if (!strcmp(ifr->ifr_name, "eth0")) { ifr->ifr_hwaddr.sa_family = ARPHRD_ETHER; memcpy(ifr->ifr_hwaddr.sa_data, addr_pkt.sll_addr, 6); return 0; } errno = ENOENT; return -1; } return orig_ioctl(d, request, argp); }