A while back I posted an eeprom dumper for Aironet cards. Attached is
an improved version that can also write (-w) and delete (-d) tags.
Dan Lanciani
[EMAIL PROTECTED]
----
#include <stdio.h>
#include <conio.h>
unsigned base = 0x180;
int wflag, dflag;
char *countries[] = { "US_Can", "Europe", "Japan", "Spain", "France", "Belgium",
"Israel", "Canada", "Australia", "WideJapan", "World", "Test" };
main(argc, argv)
char **argv;
{
char *argv0 = argv[0];
register unsigned i, j, k;
unsigned dat;
long l;
again:
if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'p') {
sscanf(&argv[1][2], "%x", &base);
argv++;
argc--;
goto again;
}
if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'w') {
wflag = 1;
argv++;
argc--;
goto again;
}
if(argc > 1 && argv[1][0] == '-' && argv[1][1] == 'd') {
dflag = 1;
argv++;
argc--;
goto again;
}
if(dflag || wflag) {
if(argc < 2)
goto usage;
sscanf(argv[1], "%x", &dat);
}
else if(argc != 1) {
usage:
fprintf(stderr, "Usage: %s [-pbase] [-d] [-w] [tag [data]]\n",
argv0);
exit(1);
}
if(inpw(base) & 0x8000) {
fprintf(stderr, "Busy bit set on startup\n");
exit(1);
}
outpw(base, 0x0010);
waitcmd();
if(inpw(base + 0x08) != 0x0010) {
fprintf(stderr, "NOP status: %04x\n", inpw(base + 0x08));
dumpres();
ackcmd();
exit(1);
}
ackcmd();
if(inpw(base) & 0x8000) {
fprintf(stderr, "Busy bit set after NOP\n");
exit(1);
}
if(dflag) {
outpw(base + 0x02, dat);
outpw(base, 0x002b);
waitcmd();
if(inpw(base + 0x08) != 0x002b) {
fprintf(stderr, "DELTAG status: %04x\n",
inpw(base + 0x08));
dumpres();
ackcmd();
exit(1);
}
ackcmd();
exit(0);
}
if(wflag) {
outpw(base + 0x02, 4 + argc - 2);
outpw(base, 0x0028);
waitcmd();
if(inpw(base + 0x08) != 0x0028) {
fprintf(stderr, "ALLOC status: %04x\n",
inpw(base + 0x08));
dumpres();
ackcmd();
exit(1);
}
k = inpw(base + 0x0a);
ackcmd();
outpw(base + 0x3a, k);
outpw(base + 0x3c, 4);
outpw(base + 0x3e, dat);
outpw(base + 0x3e, 4 + argc - 2);
while(argc > 2) {
sscanf(argv[2], "%x", &dat);
j = dat;
argv++;
argc--;
if(argc > 2) {
sscanf(argv[2], "%x", &dat);
j |= (dat << 8);
argv++;
argc--;
}
outpw(base + 0x3e, j);
}
outpw(base + 0x02, k);
outpw(base, 0x002a);
waitcmd();
if(inpw(base + 0x08) != 0x002a) {
fprintf(stderr, "WRITETAG status: %04x\n",
inpw(base + 0x08));
dumpres();
ackcmd();
exit(1);
}
ackcmd();
exit(0);
}
for(l = 0; l < 0x10000L; l++) {
i = l;
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);
dumphex(j, 8, k);
switch(i) {
case 0x1000:
printf(" CALLID\n");
break;
case 0x1001:
printf(" COUNTRY ");
if(dat < sizeof(countries) /
sizeof(countries[0]))
printf("%s\n", countries[dat]);
else
printf("%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 0x2010:
printf(" LEAP user: ");
dumpascii(j, 10, dat & 0xff);
break;
case 0x2011:
printf(" LEAP password\n");
break;
case 0x3000:
case 0x3001:
case 0x3002:
case 0x3003:
case 0x3004:
dumpwep(i, j, k);
break;
case 0x3fff:
printf(" WEP transmit key #%d\n",dat+1);
break;
case 0xa000:
printf(" BRIDGE %d\n", dat);
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();
}
dumpres()
{
register int i;
printf("Results:");
for(i = 0x0a; i <= 0x0e; i += 2)
fprintf(stderr, " %04x", inpw(base + i));
printf("\n");
}
dumphex(seg, off, cnt)
register unsigned cnt;
{
register unsigned i;
cnt = (cnt + 1) / 2;
outpw(base + 0x3a, seg);
outpw(base + 0x3c, off);
while(cnt--) {
i = inpw(base + 0x3e);
printf("%02x %02x ", i & 0xff, i >> 8);
}
printf("\n");
}
dumpascii(seg, off, cnt)
register unsigned cnt;
{
register unsigned i;
cnt = (cnt + 1) / 2;
outpw(base + 0x3a, seg);
outpw(base + 0x3c, off);
while(cnt--) {
i = inpw(base + 0x3e);
printf("%c%c", 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 + 1);
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