From [[http://fringe.davesource.com/Fringe/Hacking/Hacks/MAC_Spoofing/]]
# Some systems will let ifconfig change the MAC address of a NIC:
# (As root)
sudo ifconfig eth0 hw ether 01:02:03:04:05:06
# Use LD_PRELOAD to alter the behavior of ioctl. Here is some source that does exactly that:
* LD_PRELOAD/ioctl_preload.c
* LD_PRELOAD/Makefile
Just do a make and follow the instructions to test it out. For example, to check if it worked: (after building the library)
* setenv LD_PRELOAD `pwd`/libmacspoof.so.1.0.1
* hostid
* ifconfig
all:
@#gcc -fPIC -rdynamic -g -c -Wall ioctl_preload.c
gcc -shared -Wl,-soname,libmacspoof.so.1 -o libmacspoof.so.1.0.1 ioctl_preload.c -lc -ldl
@echo ""
@echo "-- To test: (with tcsh shell)"
@echo ""
@echo "ifconfig | grep -i hwaddr"
@echo setenv LD_PRELOAD `pwd`/libmacspoof.so.1.0.1
@echo "ifconfig | grep -i hwaddr"
@echo setenv MAC_ADDRESS "42:fe:ed:be:ef:99"
@echo "ifconfig | grep -i hwaddr"
@echo unsetenv MAC_ADDRESS
@echo "ifconfig | grep -i hwaddr"
@echo unsetenv LD_PRELOAD
@echo "ifconfig | grep -i hwaddr"
clean:
rm -f libmacspoof.so.1.0.1
/*
* Spoof a MAC address with LD_PRELOAD
*
* If environment variable $MAC_ADDRESS is set in the form "01:02:03:04:05:06"
* then use that value, otherwise use the hardcoded 'mac_address' in this file.
*
* Bugs: This currently spoofs MAC addresses for *all* interfaces.
* It would be better to watch calls to socket() for the interfaces
* you want and then only spoof ioctl calls to that file descriptor.
*/
#include
#include
#include
#define SIOCGIFHWADDR 0x8927
static unsigned char mac_address[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
int
ioctl(int d, int request, unsigned char *argp)
{
static void *handle = NULL;
static int (*orig_ioctl)(int, int, char*);
int ret;
char *p;
// If this var isn't set, use the hardcoded address above
p=getenv("MAC_ADDRESS");
if (handle == NULL) {
char *error;
handle = dlopen("/lib/libc.so.6", RTLD_LAZY);
if (!handle) {
fputs(dlerror(), stderr);
exit(EXIT_FAILURE);
}
orig_ioctl = dlsym(handle, "ioctl");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
exit(EXIT_FAILURE);
}
}
ret = orig_ioctl(d, request, argp);
if (request == SIOCGIFHWADDR) {
unsigned char *ptr = argp + 18;
int i;
for (i=0; i < 6; i++) {
if (!p) {
ptr[i] = mac_address[i];
continue;
}
int val = 0;
if (p[0]>='0' && p[0]<='9') val |= (p[0]-'0')<<4;
else if (p[0]>='a' && p[0]<='f') val |= (p[0]-'a'+10)<<4;
else if (p[0]>='A' && p[0]<='F') val |= (p[0]-'A'+10)<<4;
else break;
if (p[1]>='0' && p[1]<='9') val |= p[1]-'0';
else if (p[1]>='a' && p[1]<='f') val |= p[1]-'a'+10;
else if (p[1]>='A' && p[1]<='F') val |= p[1]-'A'+10;
else break;
if (p[2]!=':' && p[2]!='\0') break;
ptr[i] = val;
p+=3;
}
}
return ret;
}