Aironet radio card eeprom dumper

Dan Lanciani <[email protected]>
Newsgroups gmane.network.wireless.bay-area
Message-ID <[email protected]>
I wrote the attached DOS program to dump all the tags in the eeprom of
Aironet/Cisco radio cards.  It understands the format of a number of the
tags including the WEP keys and works with (at least) the original 4500
through the 350 series.  It does not do PCMCIA setup and such; you must
enable the slot with "pcmcia on -boot" or by running some other DOS utility
(e.g., wepdos) that leaves the card running.  Use the "-p" option to set
my program to the base address of whatever you used to enable the slot.

				Dan Lanciani
				ddl@danlan.*com

------

#include <stdio.h>
#include <conio.h>

unsigned base = 0x180;

main(argc, argv)
char **argv;
{
	register unsigned i, j, k;
	unsigned dat;

again:
	if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'p') {
		sscanf(&argv[1][2], "%x", &base);
		argv++;
		argc--;
		goto again;
	}
	if(inpw(base) & 0x8000) {
		fprintf(stderr, "Busy bit set on startup\n");
		exit(1);
	}
	outpw(base, 0x0010);
	waitcmd();
	ackcmd();
	if(inpw(base) & 0x8000) {
		fprintf(stderr, "Busy bit set after NOP\n");
		exit(1);
	}
	for(i = 0; i < 0xffff; i++) {
		outpw(base + 0x02, i);
		outpw(base, 0x0029);
		waitcmd();
		if(inpw(base + 0x08) == 0x0029) {
			printf("TAG %04x ", i);
			j = inpw(base + 0x0a);
			ackcmd();
			outpw(base + 0x3a, j);
			outpw(base + 0x3c, 6);
			k = inpw(base + 0x3e) - 4;
			dat = inpw(base + 0x3e);
			printf("LEN %02x DATA ", k);
			dumpbap(j, 8, (k + 1) / 2);
			switch(i) {

				case 0x1000:
					printf(" CALLID\n");
					break;

				case 0x1001:
					printf(" COUNTRY %d\n", dat);
					break;

				case 0x1002:
					printf(" POWER %dmW\n", dat);
					break;

				case 0x1003:
					printf(" MODULATION ");
					if(dat == 1)
						printf("CCK\n");
					else if(dat == 2)
						printf("MBOK\n");
					else
						printf("unknown %d\n", dat);
					break;

				case 0x3000:
				case 0x3001:
				case 0x3002:
				case 0x3003:
				case 0x3004:
					dumpwep(i, j, k);
					break;

				case 0xf000:
					printf(" WEP flags ");
					if(dat&1)
						printf("WEP40 ");
					if(dat&2)
						printf("WEP128");
					printf("\n");
					break;
			}
			outpw(base + 0x02, j);
			outpw(base, 0x000c);
			waitcmd();
		}
		ackcmd();
	}
	exit(0);
}

ackcmd()
{
	outpw(base + 0x34, 0x0010);
}

waitcmd()
{
	while(!(inpw(base + 0x30)&0x0010))
		kbhit();
}

dumpbap(seg, off, cnt)
register unsigned cnt;
{
	register unsigned i;

	outpw(base + 0x3a, seg);
	outpw(base + 0x3c, off);
	while(cnt--) {
		i = inpw(base + 0x3e);
		printf("%02x %02x ", i & 0xff, i >> 8);
	}
	printf("\n");
}

dumpwep(tag, seg, len)
{
	register unsigned i, j;

	printf(" WEP key ");
	if(tag == 0x3004)
		printf("home ");
	else
		printf("#%d ", tag - 0x3000);
	if(len != 14 && len != 22) {
		printf("unknown record length %d\n", len);
		return;
	}
	outpw(base + 0x3a, seg);
	outpw(base + 0x3c, 8 + 6);
	i = inpw(base + 0x3e);
	printf("LEN %02d ", i);
	i = (i + 1) / 2;
	while(i--) {
		j = inpw(base + 0x3e);
		printf("%02x %02x ", (j & 0xff) ^ 0x55, (j >> 8) ^ 0xaa);
	}
	printf("\n");
}
_______________________________________________
BAWUG's general wireless chat mailing list
[unsubscribe] http://lists.bawug.org/mailman/listinfo/wireless
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.