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