From ac3ba7ee694dc67ee4c8bae293111b6c26f551a2 Mon Sep 17 00:00:00 2001 From: marshmellow42 Date: Fri, 9 Jan 2015 16:46:17 -0500 Subject: [PATCH 1/3] lf search use new psk, small demod adjustments adjust thresholds for ask, fsk, io, psk based on more sample testing adjust indala decode to set clock to 32 if no input (autodetect not always correct) --- client/cmddata.c | 6 ++++- client/cmdlf.c | 58 ++++++++++++++++++++++++++++++------------------ common/lfdemod.c | 26 +++++++--------------- 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/client/cmddata.c b/client/cmddata.c index 53a3ce5f..781ca50c 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -870,8 +870,12 @@ int PSKnrzDemod(const char *Cmd){ // optional arguments - same as CmdpskNRZrawDemod (clock & invert) int CmdIndalaDecode(const char *Cmd) { + int ans; + if (strlen(Cmd)>0) + ans=PSKnrzDemod(Cmd); + else + ans=PSKnrzDemod("32"); - int ans=PSKnrzDemod(Cmd); if (ans < 0){ PrintAndLog("Error1: %d",ans); return 0; diff --git a/client/cmdlf.c b/client/cmdlf.c index 18bcf747..d9fe5fa9 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -110,9 +110,9 @@ int CmdFlexdemod(const char *Cmd) i = 0; int phase = 0; for (bit = 0; bit < 64; bit++) { - + phase = (bits[bit] == 0) ? 0 : 1; - + int j; for (j = 0; j < 32; j++) { GraphBuffer[i++] = phase; @@ -123,7 +123,7 @@ int CmdFlexdemod(const char *Cmd) RepaintGraphWindow(); return 0; } - + int CmdIndalaDemod(const char *Cmd) { // Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID @@ -167,7 +167,7 @@ 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); @@ -198,7 +198,7 @@ int CmdIndalaDemod(const char *Cmd) break; } } - + if (start == rawbit - uidlen + 1) { PrintAndLog("nothing to wait for"); return 0; @@ -217,7 +217,7 @@ int CmdIndalaDemod(const char *Cmd) 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++) { @@ -235,12 +235,12 @@ int CmdIndalaDemod(const char *Cmd) } times = 1; } - + //convert UID to HEX uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7; int idx; uid1 = uid2 = 0; - + if (uidlen==64){ for( idx=0; idx<64; idx++) { if (showbits[idx] == '0') { @@ -249,7 +249,7 @@ int CmdIndalaDemod(const char *Cmd) } else { uid1=(uid1<<1)|(uid2>>31); uid2=(uid2<<1)|1; - } + } } PrintAndLog("UID=%s (%x%08x)", showbits, uid1, uid2); } @@ -263,10 +263,10 @@ int CmdIndalaDemod(const char *Cmd) uid4=(uid4<<1)|(uid5>>31); uid5=(uid5<<1)|(uid6>>31); uid6=(uid6<<1)|(uid7>>31); - - if (showbits[idx] == '0') + + if (showbits[idx] == '0') uid7 = (uid7<<1) | 0; - else + else uid7 = (uid7<<1) | 1; } PrintAndLog("UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7); @@ -291,7 +291,7 @@ int CmdIndalaDemod(const char *Cmd) 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) + // 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; @@ -559,23 +559,37 @@ int CmdLFfind(const char *Cmd) ans=CmdSamples("20000"); } 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:"); + ans=Cmdaskmandemod(""); - if (ans>0) return 1; + if (ans>0) { + PrintAndLog("Valid EM410x ID Found!"); + return 1; + } ans=CmdFSKdemodHID(""); - if (ans>0) return 1; + if (ans>0) { + PrintAndLog("Valid HID Prox ID Found!"); + return 1; + } ans=CmdFSKdemodIO(""); - if (ans>0) return 1; + if (ans>0) { + PrintAndLog("Valid IO Prox ID Found!"); + return 1; + } //add psk and indala - ans=CmdIndalaDemod(""); - if (ans>0) return 1; - ans=CmdIndalaDemod("224"); - if (ans>0) return 1; + ans=CmdIndalaDecode(""); + if (ans>0) { + PrintAndLog("Valid Indala ID Found!"); + return 1; + } + // ans=CmdIndalaDemod("224"); + // if (ans>0) return 1; PrintAndLog("No Known Tags Found!\n"); return 0; } -static command_t CommandTable[] = +static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, {"cmdread", CmdLFCommandRead, 0, " <'0' period> <'1' period> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"}, @@ -602,7 +616,7 @@ static command_t CommandTable[] = int CmdLF(const char *Cmd) { CmdsParse(CommandTable, Cmd); - return 0; + return 0; } int CmdHelp(const char *Cmd) diff --git a/common/lfdemod.c b/common/lfdemod.c index 25e52552..11ad1403 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -300,7 +300,7 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) else if (BinStream[i] < low) low = BinStream[i]; } - if ((high < 158)){ //throw away static + if ((high < 134)){ //throw away static high has to be more than 6 on graph. noise <= -10 here // PrintAndLog("no data found"); return -2; } @@ -407,21 +407,11 @@ size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow { uint32_t last_transition = 0; uint32_t idx = 1; - uint32_t maxVal=0; + //uint32_t maxVal=0; if (fchigh==0) fchigh=10; if (fclow==0) fclow=8; - // we do care about the actual theshold value as sometimes near the center of the - // wave we may get static that changes direction of wave for one value - // if our value is too low it might affect the read. and if our tag or - // antenna is weak a setting too high might not see anything. [marshmellow] - if (size<100) return 0; - for(idx=1; idx<100; idx++){ - if(maxVal Date: Tue, 13 Jan 2015 17:21:36 -0500 Subject: [PATCH 2/3] Small lf bug fixes and threshold adjustments adjusted lf demod thresholds based on additional testing fixed bug in hid bit length calc in cmddata.c fixed bugs in lf search --- client/cmddata.c | 53 +++++++++++++++++++++++++++++++----------------- client/cmdlf.c | 33 ++++++++++++++++++++---------- common/lfdemod.c | 34 +++++++++++++++---------------- 3 files changed, 73 insertions(+), 47 deletions(-) diff --git a/client/cmddata.c b/client/cmddata.c index ed0a0758..a88fa4e1 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -618,7 +618,7 @@ int CmdFSKdemodHID(const char *Cmd) uint32_t cardnum = 0; if (((hi>>5)&1)==1){//if bit 38 is set then < 37 bit format is used uint32_t lo2=0; - lo2=(((hi & 15) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit + lo2=(((hi & 31) << 12) | (lo>>20)); //get bits 21-37 to check for format len bit uint8_t idx3 = 1; while(lo2>1){ //find last bit set to 1 (format len bit) lo2=lo2>>1; @@ -631,10 +631,6 @@ int CmdFSKdemodHID(const char *Cmd) cardnum = (lo>>1)&0xFFFF; fc = (lo>>17)&0xFF; } - if(fmtLen==37){ - cardnum = (lo>>1)&0x7FFFF; - fc = ((hi&0xF)<<12)|(lo>>20); - } if(fmtLen==34){ cardnum = (lo>>1)&0xFFFF; fc= ((hi&1)<<15)|(lo>>17); @@ -645,10 +641,10 @@ int CmdFSKdemodHID(const char *Cmd) } } else { //if bit 38 is not set then 37 bit format is used - fmtLen= 37; - fc =0; - cardnum=0; - if(fmtLen==37){ + fmtLen = 37; + fc = 0; + cardnum = 0; + if(fmtLen == 37){ cardnum = (lo>>1)&0x7FFFF; fc = ((hi&0xF)<<12)|(lo>>20); } @@ -870,24 +866,35 @@ int PSKnrzDemod(const char *Cmd){ // optional arguments - same as CmdpskNRZrawDemod (clock & invert) int CmdIndalaDecode(const char *Cmd) { - int ans; - if (strlen(Cmd)>0) - ans=PSKnrzDemod(Cmd); - else - ans=PSKnrzDemod("32"); + uint8_t verbose = 1; + int ans; + if (strlen(Cmd)>0){ + if (Cmd[0]=='0'){ + verbose=0; + ans = PSKnrzDemod("32"); + }else{ + ans = PSKnrzDemod(Cmd); + } + } else{ //default to RF/32 + ans = PSKnrzDemod("32"); + } if (ans < 0){ - PrintAndLog("Error1: %d",ans); + if (verbose) + PrintAndLog("Error1: %d",ans); return 0; } uint8_t invert=0; ans = indala26decode(DemodBuffer,(size_t *) &DemodBufferLen, &invert); if (ans < 1) { - PrintAndLog("Error2: %d",ans); + if (verbose) + PrintAndLog("Error2: %d",ans); return -1; } char showbits[251]; - if(invert==1) PrintAndLog("Had to invert bits"); + if (invert) + if (verbose) + PrintAndLog("Had to invert bits"); //convert UID to HEX uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7; int idx; @@ -951,11 +958,19 @@ int CmdPskClean(const char *Cmd) //prints binary found and saves in graphbuffer for further commands int CmdpskNRZrawDemod(const char *Cmd) { - int errCnt= PSKnrzDemod(Cmd); + uint8_t verbose = 1; + int errCnt; + if (strlen(Cmd)>0){ + if (Cmd[0]=='0') + verbose=0; + } + + errCnt = PSKnrzDemod(Cmd); //output if (errCnt<0) return 0; if (errCnt>0){ - PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); + if (verbose) + PrintAndLog("# Errors during Demoding (shown as 77 in bit stream): %d",errCnt); } PrintAndLog("PSK or NRZ demoded bitstream:"); // Now output the bitstream to the scrollback by line of 16 bits diff --git a/client/cmdlf.c b/client/cmdlf.c index 65d6fdd5..e3361cb5 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -566,26 +566,37 @@ int CmdLFfind(const char *Cmd) return 0; } - if (!offline || (cmdp != '1') ){ + 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; } + PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag"); PrintAndLog("Checking for known tags:"); - ans=Cmdaskmandemod(""); - if (ans>0) return 1; - ans=CmdFSKdemodHID(""); - if (ans>0) return 1; ans=CmdFSKdemodIO(""); - if (ans>0) return 1; + if (ans>0) { + PrintAndLog("Valid IO Prox ID Found!"); + return 1; + } + ans=CmdFSKdemodHID(""); + if (ans>0) { + PrintAndLog("Valid HID Prox ID Found!"); + return 1; + } //add psk and indala - ans=CmdIndalaDemod(""); - if (ans>0) return 1; - ans=CmdIndalaDemod("224"); - if (ans>0) return 1; + ans=CmdIndalaDecode("0"); + if (ans>0) { + PrintAndLog("Valid Indala ID Found!"); + return 1; + } + ans=Cmdaskmandemod(""); + if (ans>0) { + PrintAndLog("Valid EM410x ID Found!"); + return 1; + } PrintAndLog("No Known Tags Found!\n"); return 0; } diff --git a/common/lfdemod.c b/common/lfdemod.c index 11ad1403..2352caad 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -19,7 +19,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future // otherwise could be a void with no arguments //set defaults - int high=0, low=128; + int high=0, low=255; uint64_t lo=0; uint32_t i = 0; @@ -84,7 +84,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) { int i; - int high = 0, low = 128; + int high = 0, low = 255; *clk=DetectASKClock(BinStream, *size, *clk); //clock default if (*clk<8) *clk =64; @@ -100,7 +100,7 @@ int askmandemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) else if (BinStream[i] < low) low = BinStream[i]; } - if ((high < 158) ){ //throw away static + if ((high < 129) ){ //throw away static (anything < 1 graph) //PrintAndLog("no data found"); return -2; } @@ -283,7 +283,7 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) { uint32_t i; // int invert=0; //invert default - int high = 0, low = 128; + int high = 0, low = 255; *clk=DetectASKClock(BinStream, *size, *clk); //clock default uint8_t BitStream[502] = {0}; @@ -300,7 +300,8 @@ int askrawdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert) else if (BinStream[i] < low) low = BinStream[i]; } - if ((high < 134)){ //throw away static high has to be more than 6 on graph. noise <= -10 here + if ((high < 129)){ //throw away static high has to be more than 0 on graph. + //noise <= -10 here // PrintAndLog("no data found"); return -2; } @@ -410,8 +411,8 @@ size_t fsk_wave_demod(uint8_t * dest, size_t size, uint8_t fchigh, uint8_t fclow //uint32_t maxVal=0; if (fchigh==0) fchigh=10; if (fclow==0) fclow=8; - //set the threshold close to 0 (graph) to avoid static - uint8_t threshold_value = 134; //(uint8_t)(((maxVal-128)*.75)+128); + //set the threshold close to 0 (graph) or 128 std to avoid static + uint8_t threshold_value = 123; // sync to first lo-hi transition, and threshold @@ -471,7 +472,7 @@ size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t maxCons if ( dest[idx-1]==1 ) { n=myround2((float)(n+1)/((float)(rfLen)/(float)fclow)); } else {// 0->1 crossing - n=myround2((float)(n+1)/((float)(rfLen-2)/(float)fchigh)); //-2 for fudge factor + n=myround2((float)(n+1)/((float)(rfLen-1)/(float)fchigh)); //-1 for fudge factor } if (n == 0) n = 1; @@ -563,7 +564,7 @@ uint32_t bytebits_to_byte(uint8_t* src, size_t numbits) int IOdemodFSK(uint8_t *dest, size_t size) { - static const uint8_t THRESHOLD = 134; + static const uint8_t THRESHOLD = 129; uint32_t idx=0; //make sure buffer has data if (size < 66) return -1; @@ -607,7 +608,7 @@ int DetectASKClock(uint8_t dest[], size_t size, int clock) { int i=0; int peak=0; - int low=128; + int low=255; int clk[]={16,32,40,50,64,100,128,256}; int loopCnt = 256; //don't need to loop through entire array... if (size 1280) gLen=1280; // get high @@ -889,7 +889,7 @@ int pskNRZrawDemod(uint8_t *dest, size_t *size, int *clk, int *invert) int lastBit = 0; //set first clock check uint32_t bitnum = 0; //output counter uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave - if (*clk==32)tol=2; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely + if (*clk==32) tol = 2; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely uint32_t iii = 0; uint8_t errCnt =0; uint32_t bestStart = *size; From dc065b4e3467effd6b4f695dd3bc781da872d394 Mon Sep 17 00:00:00 2001 From: marshmellow42 Date: Tue, 13 Jan 2015 17:52:48 -0500 Subject: [PATCH 3/3] slight em410xdecode adjustments a little faster --- common/lfdemod.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/common/lfdemod.c b/common/lfdemod.c index 2352caad..062818ef 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -19,21 +19,9 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) //no arguments needed - built this way in case we want this to be a direct call from "data " cmds in the future // otherwise could be a void with no arguments //set defaults - int high=0, low=255; uint64_t lo=0; - uint32_t i = 0; - uint32_t initLoopMax = 65; - if (initLoopMax>size) initLoopMax=size; - - for (;i < initLoopMax; ++i) //65 samples should be plenty to find high and low values - { - if (BitStream[i] > high) - high = BitStream[i]; - else if (BitStream[i] < low) - low = BitStream[i]; - } - if (((high !=1)||(low !=0))){ //allow only 1s and 0s + if (BitStream[10]>1){ //allow only 1s and 0s // PrintAndLog("no data found"); return 0; } @@ -51,9 +39,9 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) idx+=9; for (i=0; i<10;i++){ for(ii=0; ii<5; ++ii){ - parityTest += BitStream[(i*5)+ii+idx]; + parityTest ^= BitStream[(i*5)+ii+idx]; } - if (parityTest== ((parityTest>>1)<<1)){ + if (!parityTest){ parityTest=0; for (ii=0; ii<4;++ii){ lo=(lo<<1LL)|(BitStream[(i*5)+ii+idx]); @@ -63,7 +51,7 @@ uint64_t Em410xDecode(uint8_t *BitStream, size_t size) //PrintAndLog("DEBUG: EM parity failed parity val: %d, i:%d, ii:%d,idx:%d, Buffer: %d%d%d%d%d",parityTest,i,ii,idx,BitStream[idx+ii+(i*5)-5],BitStream[idx+ii+(i*5)-4],BitStream[idx+ii+(i*5)-3],BitStream[idx+ii+(i*5)-2],BitStream[idx+ii+(i*5)-1]); parityTest=0; idx-=8; - if (resetCnt>5)return 0; + if (resetCnt>5)return 0; //try 5 times resetCnt++; goto restart;//continue; }