a-Mac Address Change lets you find, scan and change the Mac Address!

Home |

A-Mac Address Change Released!
Finally you find it!

Change your Mac Address in seconds! Scan Mac Address within any range of IP address. Exports the scanning results from a Mac Address Lookup list. Change the Mac Address of your network card to any new Mac Address.

Before we start: A-Mac Address Change can scan and change Mac address under any windows system automatically!

How and why to change Mac Address

here is the code to change Mac Address from http://dbforums.com/arch/184/2002/9/503450

D0
Sep 13 2002 15:58
From the man page on "tu" the interface for our nics.
------------------------------------------------------------------------
" You can use the SIOCSPHYSADDR ioctl to change the physical address of the
interface; use the ifreq structure. You can also use the SIOCRPHYSADDR ioctl
to read the physical address of the interface. See the "Examples"
section." - OSF 4.0f tu 7 manpage.

NOTE: They say use ifreq. yet see below...

From ioctl.h
-------------------
#define SIOCRPHYSADDR _IOWR('i', 62, struct ifdevea) /* Read Phys addr */ #define
SIOCSPHYSADDR _IOWR('i', 63, struct ifdevea) /* Set addr */


From if.h
---------------
/*
* structure used to query de and qe for physical addresses */ struct ifdevea {
char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ u_char
default_pa[6]; /* default hardware address */ u_char
current_pa[6]; /* current physical address */ };

struct ifreq { #define IFNAMSIZ 16 char ifr_name[IFNAMSIZ];
/* if name, e.g. "en0" */ union { struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr;
int ifru_flags; int ifru_metric; caddr_t
ifru_data; int ifru_value; /* any generic value */
u_int ifru_index; } ifr_ifru; #define ifr_addr ifr_ifru.ifru_addr
/* address */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p
link */ #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags ifr_ifru.ifru_flags /* flags */ #define ifr_metric
ifr_ifru.ifru_metric /* metric */ #define ifr_data ifr_ifru.ifru_data
/* for use by interface */ #define ifr_value ifr_ifru.ifru_value /* for
use by interface */ #define ifr_index ifr_ifru.ifru_index /* interface
index */ };


Call me nuts or clear up my confusion but it seems either the man page is incorrect
or their header files are incorrect. Or perhaps there is some substantial
documentation I have yet to find. Anyone have a clue?

Basically I am trying to change the MAC address of cards under Tru64 4.0. It's been
mentioned to me to use ifconfig yet I find nothing under it to do so. I assume this
is only available under 5.x.

Below is the code I have written thus far. (NOTE IT DOES NOT WORK). I can read and
even write to the eeprom. But apparently there is something severely wrong with how
or what is being written.

When I attempt the command line: ./nic tu4 00 6 2B 1 67 37 Which specifies the nic
tu4 with that MAC addy what gets set is the following: Current MOD PHY Address is: 2B
1 67 37 0 6

Now I have learned about the serial nature of the eeprom (or at least Im pretty sure
its serial). Also I found out these cards (21143) probably have a 256 byte eeprom.
I can only assume ioctl is writting to the correct spot since I haven't a clue what
its doing behind the scenes. I also think there is an issue with a ckecksum that
needs to be calculated.

Does anyone have example code out there for doing this. Fixes for the following code
or anything that might help?

Thanks, d0

PS. Yes I am aware of the dire consequences of hosing the card doing this.

CODE
---------
#include #include #include #include
#include

void main(int argc, char *argv[]) { struct ifdevea dev; int
sock_in01=0,i=0; char *cp;

strcpy(dev.ifr_name,argv[1]);

sock_in01 = socket(AF_INET,SOCK_DGRAM,0); if (sock_in01 < 0) { perror(argv[0]);
exit(1); } if (ioctl(sock_in01,SIOCRPHYSADDR,&dev) < 0) { perror(argv[0]);
exit(1); }

printf("\nDefault HDW Address is: "); for (i=0; i<6; i++) { printf("%X ",
dev.default_pa); } printf("\nCurrent PHY Address is: "); for (i=0; i<6; i++) {
printf("%X ", dev.current_pa); }

for (i=0; i<6; i++) { printf("\n%d = %X",i ,strtol(argv[i+2], &cp, 16) & 0xff);
sprintf(&dev.current_pa,"%c",(uchar)(strtol(argv[i+2], &cp, 16) & 0xff)); }

if (ioctl(sock_in01,SIOCSPHYSADDR,&dev) < 0) { perror(argv[0]); exit(1); } if
(ioctl(sock_in01,SIOCRPHYSADDR,&dev) < 0) { perror(argv[0]); exit(1); }

printf("\nCurrent MOD PHY Address is: "); for (i=0; i<6; i++) { printf("%X ",
dev.current_pa); }

close(sock_in01); }

Brian Haley
Sep 13 2002 17:17
d0 wrote:

> Call me nuts or clear up my confusion but it seems either the man page is incorrect
> or their header files are incorrect. Or perhaps there is some substantial
> documentation I have yet to find. Anyone have a clue?

I have a clue :)

The man page and header files are correct, see the example code below.

-Brian

HP Tru64 UNIX Networking


/*
* sphyaddr - set a network adapter's physical Ethernet hardware address *
* to compile: cc sphyaddr.c -o sphyaddr *
* usage: sphyaddr tu0 08-00-2b-ff-ff-ff */

#define _SOCKADDR_LEN

#include #include #include

#include #include #include #include
#include

#include #include #include #include


/* function prototype */ void ether_aton(char *, u_char *);


int main (int argc, char **argv) { int s, n; u_char *cp; static struct
ifdevea devea; static struct ifreq newaddress;

if (argc < 3) { fprintf(stderr, "usage: %s: interface address\n", argv[0]);
fprintf(stderr, "for example: %s tu0 08-00-2b-ff-ff-ff\n", argv[0]);
exit(1); }

s = socket(AF_INET, SOCK_DGRAM, 0);

strcpy(devea.ifr_name, argv[1]); strcpy(newaddress.ifr_name, argv[1]);

/*
* get current address from driver */ if ((ioctl(s, SIOCRPHYSADDR, &devea) < 0))
{ perror("couldn't get devea from driver"); } else { /*
* print the current address */ cp = (u_char *)devea.current_pa; n = 0;
printf("Current: "); do { printf("%02X-", cp[n++]); } while (n <
sizeof(devea.current_pa) - 1); printf("%02X\n", cp[n++]);

/*
* print the target address */ printf("Target : %s\n", argv[2]);

/* convert it */ cp = (u_char *)argv[2]; ether_aton((char *)cp, (u_char
*)newaddress.ifr_addr.sa_data);

newaddress.ifr_addr.sa_family = AF_LINK; newaddress.ifr_addr.sa_len =
sizeof(newaddress.ifr_addr);

/* set it */ if ((ioctl(s, SIOCSPHYSADDR, &newaddress) < 0)) {
perror("couldn't set devea"); }

exit(0); } exit(1); }

/*
* Convert an ASCII Ethernet address to a numeric address */ void ether_aton(char *a,
u_char *n) { int i, o[6];

i = sscanf(a, "%x-%x-%x-%x-%x-%x", &o[0], &o[1], &o[2],
&o[3], &o[4], &o[5]);
if (i!= 6) { fprintf(stderr, "invalid Ethernet address '%s'\n", a); exit(1); }

for (i = 0; i < 6; i++)
i[g] = o;

return; }

D0
Sep 13 2002 17:21
In article <3D825433.3BD312B9@hp.com>, "Brian Haley" wrote:

> d0 wrote:
>> Call me nuts or clear up my confusion but it seems either the man page is
>> incorrect or their header files are incorrect. Or perhaps there is some
>> substantial documentation I have yet to find. Anyone have a clue?
> I have a clue :)
> The man page and header files are correct, see the example code below.
> -Brian
> HP Tru64 UNIX Networking

w00t!

Thank you!

My confusion was that in the ioctl.h file they showed SIOCSPHYADDR using ifdevea yet
in the man page they say use ifreq for that function.

Thanks again!


New comments: Click for more...

  Q: Can I use aMac Address Change to change Mac Address of my ADSL router ?

Thank you very much

A: Many of our users use amac to change mac of adsl modem. You can also use trial version to check it. Trial version is free.



Posted by:
Nancy |
February 12, 2006 02:30 AM



......



Home | Buy Now! | Contact Us