X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/389d0360e1b4960f556a696aa97a0703e1815a86..49726b4088b78027b7ce3215c432cbb99a283f27:/client/cmdlf.c diff --git a/client/cmdlf.c b/client/cmdlf.c index 42a29d0d..65d6fdd5 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -12,7 +12,6 @@ #include #include #include -//#include "proxusb.h" #include "proxmark3.h" #include "data.h" #include "graph.h" @@ -20,6 +19,7 @@ #include "cmdparser.h" #include "cmdmain.h" #include "cmddata.h" +#include "util.h" #include "cmdlf.h" #include "cmdlfhid.h" #include "cmdlfti.h" @@ -57,7 +57,7 @@ int CmdFlexdemod(const char *Cmd) } } - #define LONG_WAIT 100 +#define LONG_WAIT 100 int start; for (start = 0; start < GraphTraceLen - LONG_WAIT; start++) { int first = GraphBuffer[start]; @@ -77,22 +77,18 @@ int CmdFlexdemod(const char *Cmd) GraphBuffer[start] = 2; GraphBuffer[start+1] = -2; + uint8_t bits[64] = {0x00}; - uint8_t bits[64]; - - int bit; + int bit, sum; i = start; for (bit = 0; bit < 64; bit++) { - int j; - int sum = 0; - for (j = 0; j < 16; j++) { + sum = 0; + for (int j = 0; j < 16; j++) { sum += GraphBuffer[i++]; } - if (sum > 0) { - bits[bit] = 1; - } else { - bits[bit] = 0; - } + + bits[bit] = (sum > 0) ? 1 : 0; + PrintAndLog("bit %d sum %d", bit, sum); } @@ -110,15 +106,14 @@ int CmdFlexdemod(const char *Cmd) } } + // HACK writing back to graphbuffer. GraphTraceLen = 32*64; i = 0; int phase = 0; for (bit = 0; bit < 64; bit++) { - if (bits[bit] == 0) { - phase = 0; - } else { - phase = 1; - } + + phase = (bits[bit] == 0) ? 0 : 1; + int j; for (j = 0; j < 32; j++) { GraphBuffer[i++] = phase; @@ -137,8 +132,10 @@ int CmdIndalaDemod(const char *Cmd) int state = -1; int count = 0; int i, j; + // worst case with GraphTraceLen=64000 is < 4096 // under normal conditions it's < 2048 + uint8_t rawbits[4096]; int rawbit = 0; int worst = 0, worstPos = 0; @@ -171,10 +168,14 @@ int CmdIndalaDemod(const char *Cmd) count = 0; } } + if (rawbit>0){ PrintAndLog("Recovered %d raw bits, expected: %d", rawbit, GraphTraceLen/32); PrintAndLog("worst metric (0=best..7=worst): %d at pos %d", worst, worstPos); - } else return 0; + } else { + return 0; + } + // Finding the start of a UID int uidlen, long_wait; if (strcmp(Cmd, "224") == 0) { @@ -184,6 +185,7 @@ int CmdIndalaDemod(const char *Cmd) uidlen = 64; long_wait = 29; } + int start; int first = 0; for (start = 0; start <= rawbit - uidlen; start++) { @@ -197,6 +199,7 @@ int CmdIndalaDemod(const char *Cmd) break; } } + if (start == rawbit - uidlen + 1) { PrintAndLog("nothing to wait for"); return 0; @@ -210,12 +213,12 @@ int CmdIndalaDemod(const char *Cmd) } // Dumping UID - uint8_t bits[224]; - char showbits[225]; - showbits[uidlen]='\0'; + uint8_t bits[224] = {0x00}; + char showbits[225] = {0x00}; int bit; i = start; int times = 0; + if (uidlen > rawbit) { PrintAndLog("Warning: not enough raw bits to get a full UID"); for (bit = 0; bit < rawbit; bit++) { @@ -237,8 +240,8 @@ int CmdIndalaDemod(const char *Cmd) //convert UID to HEX uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7; int idx; - uid1=0; - uid2=0; + uid1 = uid2 = 0; + if (uidlen==64){ for( idx=0; idx<64; idx++) { if (showbits[idx] == '0') { @@ -252,11 +255,8 @@ int CmdIndalaDemod(const char *Cmd) PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2); } else { - uid3=0; - uid4=0; - uid5=0; - uid6=0; - uid7=0; + uid3 = uid4 = uid5 = uid6 = uid7 = 0; + for( idx=0; idx<224; idx++) { uid1=(uid1<<1)|(uid2>>31); uid2=(uid2<<1)|(uid3>>31); @@ -264,15 +264,19 @@ int CmdIndalaDemod(const char *Cmd) uid4=(uid4<<1)|(uid5>>31); uid5=(uid5<<1)|(uid6>>31); uid6=(uid6<<1)|(uid7>>31); - if (showbits[idx] == '0') uid7=(uid7<<1)|0; - else uid7=(uid7<<1)|1; + + if (showbits[idx] == '0') + uid7 = (uid7<<1) | 0; + else + uid7 = (uid7<<1) | 1; } PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7); } // Checking UID against next occurrences - for (; i + uidlen <= rawbit;) { int failed = 0; + for (; i + uidlen <= rawbit;) { + failed = 0; for (bit = 0; bit < uidlen; bit++) { if (bits[bit] != rawbits[i++]) { failed = 1; @@ -284,9 +288,12 @@ int CmdIndalaDemod(const char *Cmd) } times += 1; } + PrintAndLog("Occurrences: %d (expected %d)", times, (rawbit - start) / uidlen); // Remodulating for tag cloning + // HACK: 2015-01-04 this will have an impact on our new way of seening lf commands (demod) + // since this changes graphbuffer data. GraphTraceLen = 32*uidlen; i = 0; int phase = 0; @@ -309,15 +316,10 @@ int CmdIndalaDemod(const char *Cmd) int CmdIndalaClone(const char *Cmd) { - unsigned int uid1, uid2, uid3, uid4, uid5, uid6, uid7; UsbCommand c; - uid1=0; - uid2=0; - uid3=0; - uid4=0; - uid5=0; - uid6=0; - uid7=0; + unsigned int uid1, uid2, uid3, uid4, uid5, uid6, uid7; + + uid1 = uid2 = uid3 = uid4 = uid5 = uid6 = uid7 = 0; int n = 0, i = 0; if (strchr(Cmd,'l') != 0) { @@ -339,9 +341,7 @@ int CmdIndalaClone(const char *Cmd) c.d.asDwords[4] = uid5; c.d.asDwords[5] = uid6; c.d.asDwords[6] = uid7; - } - else - { + } else { while (sscanf(&Cmd[i++], "%1x", &n ) == 1) { uid1 = (uid1 << 4) | (uid2 >> 28); uid2 = (uid2 << 4) | (n & 0xf); @@ -359,13 +359,16 @@ int CmdIndalaClone(const char *Cmd) int CmdLFRead(const char *Cmd) { UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K}; + // 'h' means higher-low-frequency, 134 kHz if(*Cmd == 'h') { c.arg[0] = 1; } else if (*Cmd == '\0') { c.arg[0] = 0; } else if (sscanf(Cmd, "%"lli, &c.arg[0]) != 1) { - PrintAndLog("use 'read' or 'read h', or 'read '"); + PrintAndLog("Samples 1: 'lf read'"); + PrintAndLog(" 2: 'lf read h'"); + PrintAndLog(" 3: 'lf read '"); return 0; } SendCommand(&c); @@ -378,10 +381,8 @@ static void ChkBitstream(const char *str) int i; /* convert to bitstream if necessary */ - for (i = 0; i < (int)(GraphTraceLen / 2); i++) - { - if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) - { + for (i = 0; i < (int)(GraphTraceLen / 2); i++){ + if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) { CmdBitstream(str); break; } @@ -390,7 +391,7 @@ static void ChkBitstream(const char *str) int CmdLFSim(const char *Cmd) { - int i; + int i,j; static int gap; sscanf(Cmd, "%i", &gap); @@ -398,18 +399,20 @@ int CmdLFSim(const char *Cmd) /* convert to bitstream if necessary */ ChkBitstream(Cmd); - PrintAndLog("Sending data, please wait..."); - for (i = 0; i < GraphTraceLen; i += 48) { + printf("Sending [%d bytes]", GraphTraceLen); + for (i = 0; i < GraphTraceLen; i += USB_CMD_DATA_SIZE) { UsbCommand c={CMD_DOWNLOADED_SIM_SAMPLES_125K, {i, 0, 0}}; - int j; - for (j = 0; j < 48; j++) { + + for (j = 0; j < USB_CMD_DATA_SIZE; j++) { c.d.asBytes[j] = GraphBuffer[i+j]; } SendCommand(&c); WaitForResponse(CMD_ACK,NULL); + printf("."); } - PrintAndLog("Starting simulator..."); + printf("\n"); + PrintAndLog("Starting to simulate"); UsbCommand c = {CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}}; SendCommand(&c); return 0; @@ -417,7 +420,9 @@ int CmdLFSim(const char *Cmd) int CmdLFSimBidir(const char *Cmd) { - /* Set ADC to twice the carrier for a slight supersampling */ + // Set ADC to twice the carrier for a slight supersampling + // HACK: not implemented in ARMSRC. + PrintAndLog("Not implemented yet."); UsbCommand c = {CMD_LF_SIMULATE_BIDIR, {47, 384, 0}}; SendCommand(&c); return 0; @@ -429,23 +434,17 @@ int CmdLFSimManchester(const char *Cmd) static int clock, gap; static char data[1024], gapstring[8]; - /* get settings/bits */ sscanf(Cmd, "%i %s %i", &clock, &data[0], &gap); - /* clear our graph */ ClearGraph(0); - /* fill it with our bitstream */ for (int i = 0; i < strlen(data) ; ++i) AppendGraph(0, clock, data[i]- '0'); - /* modulate */ CmdManchesterMod(""); - /* show what we've done */ RepaintGraphWindow(); - /* simulate */ sprintf(&gapstring[0], "%i", gap); CmdLFSim(gapstring); return 0; @@ -454,20 +453,23 @@ int CmdLFSimManchester(const char *Cmd) int CmdLFSnoop(const char *Cmd) { UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES}; + // 'h' means higher-low-frequency, 134 kHz c.arg[0] = 0; c.arg[1] = -1; - if (*Cmd == 0) { - // empty - } else if (*Cmd == 'l') { + + if (*Cmd == 'l') { sscanf(Cmd, "l %"lli, &c.arg[1]); } else if(*Cmd == 'h') { c.arg[0] = 1; sscanf(Cmd, "h %"lli, &c.arg[1]); } else if (sscanf(Cmd, "%"lli" %"lli, &c.arg[0], &c.arg[1]) < 1) { - PrintAndLog("use 'snoop' or 'snoop {l,h} [trigger threshold]', or 'snoop [trigger threshold]'"); + PrintAndLog("usage 1: snoop"); + PrintAndLog(" 2: snoop {l,h} [trigger threshold]"); + PrintAndLog(" 3: snoop [trigger threshold]"); return 0; } + SendCommand(&c); WaitForResponse(CMD_ACK,NULL); return 0; @@ -553,37 +555,37 @@ int CmdVchDemod(const char *Cmd) int CmdLFfind(const char *Cmd) { int ans=0; - if (!offline){ + char cmdp = param_getchar(Cmd, 0); + + if (strlen(Cmd) > 1 || cmdp == 'h' || cmdp == 'H') { + PrintAndLog("Usage: lf search <0|1>"); + PrintAndLog(" , if not set, try reading data from tag."); + PrintAndLog(""); + PrintAndLog(" sample: lf search"); + PrintAndLog(" : lf search 1"); + return 0; + } + + if (!offline || (cmdp != '1') ){ ans=CmdLFRead(""); - ans=CmdSamples("20000"); + ans=CmdSamples("20000"); + } else if (GraphTraceLen < 1000) { + PrintAndLog("Data in Graphbuffer was too small."); + return 0; } - if (GraphTraceLen<1000) return 0; - PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag"); - PrintAndLog("Checking for known tags:"); + PrintAndLog("Checking for known tags:"); ans=Cmdaskmandemod(""); - if (ans>0) { - PrintAndLog("Valid EM410x ID Found!"); - return 1; - } + if (ans>0) return 1; ans=CmdFSKdemodHID(""); - if (ans>0) { - PrintAndLog("Valid HID Prox ID Found!"); - return 1; - } + if (ans>0) return 1; ans=CmdFSKdemodIO(""); - if (ans>0) { - PrintAndLog("Valid IO Prox ID Found!"); - return 1; - } + if (ans>0) return 1; //add psk and indala - ans=CmdIndalaDecode(""); - if (ans>0) { - PrintAndLog("Valid Indala ID Found!"); - return 1; - } - // ans=CmdIndalaDemod("224"); - // if (ans>0) return 1; + ans=CmdIndalaDemod(""); + if (ans>0) return 1; + ans=CmdIndalaDemod("224"); + if (ans>0) return 1; PrintAndLog("No Known Tags Found!\n"); return 0; }