From eb911aa8d6b2ddf5163fc75f06da416eb968bd9f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 14 Dec 2016 23:23:16 +0100 Subject: [PATCH] ADD: 'lf visa2000' commands. (SIM/CLONE/READ) almost finished. CHG: 'lf xxxxx' reduced number of samples from 30000 -> 20000 in "lf xxxxxx read" commands. CHG: 'data samples' - didn't honor the silent parameter. It now output less for the 'lf xxxxxx read' commands. --- client/Makefile | 1 + client/cmddata.c | 101 ++++++++++++++++++++++------------------ client/cmdlf.c | 14 ++++-- client/cmdlf.h | 1 + client/cmdlfguard.c | 2 +- client/cmdlfio.c | 2 +- client/cmdlfjablotron.c | 2 +- client/cmdlfnedap.c | 2 +- client/cmdlfpresco.c | 2 +- client/cmdlfpyramid.c | 2 +- client/cmdlfviking.c | 2 +- 11 files changed, 74 insertions(+), 57 deletions(-) diff --git a/client/Makefile b/client/Makefile index 68a8b188..3b5f34f5 100644 --- a/client/Makefile +++ b/client/Makefile @@ -140,6 +140,7 @@ CMDSRCS = mifarehost.c \ cmdlfguard.c \ cmdlfnedap.c \ cmdlfjablotron.c \ + cmdlfvisa2000.c \ pm3_binlib.c \ scripting.c \ cmdscript.c \ diff --git a/client/cmddata.c b/client/cmddata.c index f59b7342..08ff7aa8 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -1288,42 +1288,46 @@ int CmdFSKdemodParadox(const char *Cmd) //print ioprox ID and some format details int CmdFSKdemodIO(const char *Cmd) { - int idx=0; + int retval = 0; + int idx = 0; + char crcStr[20]; + memset(crcStr, 0x00, sizeof(crcStr) ); + //something in graphbuffer? if (GraphTraceLen < 65) { if (g_debugMode)PrintAndLog("DEBUG: not enough samples in GraphBuffer"); - return 0; + return retval; } uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; - size_t BitLen = getFromGraphBuf(BitStream); - if (BitLen==0) return 0; + size_t bitlen = getFromGraphBuf(BitStream); + if (bitlen == 0) return retval; //get binary from fsk wave - idx = IOdemodFSK(BitStream,BitLen); + idx = IOdemodFSK(BitStream, bitlen); if (idx<0){ if (g_debugMode){ if (idx==-1){ - PrintAndLog("DEBUG: Just Noise Detected"); + PrintAndLog("DEBUG: IO Prox - Just Noise Detected"); } else if (idx == -2) { - PrintAndLog("DEBUG: not enough samples"); + PrintAndLog("DEBUG: IO Prox - not enough samples"); } else if (idx == -3) { - PrintAndLog("DEBUG: error during fskdemod"); + PrintAndLog("DEBUG: IO Prox - error during fskdemod"); } else if (idx == -4) { - PrintAndLog("DEBUG: Preamble not found"); + PrintAndLog("DEBUG: IO Prox - Preamble not found"); } else if (idx == -5) { - PrintAndLog("DEBUG: Separator bits not found"); + PrintAndLog("DEBUG: IO Prox - Separator bits not found"); } else { - PrintAndLog("DEBUG: Error demoding fsk %d", idx); + PrintAndLog("DEBUG: IO Prox - Error demoding fsk %d", idx); } } - return 0; + return retval; } if (idx==0){ if (g_debugMode){ - PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen); - if (BitLen > 92) PrintAndLog("%s", sprint_bin_break(BitStream,92,16)); + PrintAndLog("DEBUG: IO Prox - Data not found - FSK Bits: %d", bitlen); + if (bitlen > 92) PrintAndLog("%s", sprint_bin_break(BitStream,92,16)); } - return 0; + return retval; } //Index map //0 10 20 30 40 50 60 @@ -1334,10 +1338,11 @@ int CmdFSKdemodIO(const char *Cmd) // //XSF(version)facility:codeone+codetwo (raw) //Handle the data - if (idx+64>BitLen) { - if (g_debugMode) PrintAndLog("not enough bits found - bitlen: %d",BitLen); - return 0; + if (idx + 64 > bitlen) { + if (g_debugMode) PrintAndLog("DEBUG: IO Prox - not enough bits found - bitlen: %d", bitlen); + return retval; } + if (g_debugMode) { PrintAndLog("%d%d%d%d%d%d%d%d %d", BitStream[idx], BitStream[idx+1], BitStream[idx+2], BitStream[idx+3], BitStream[idx+4], BitStream[idx+5], BitStream[idx+6], BitStream[idx+7], BitStream[idx+8]); PrintAndLog("%d%d%d%d%d%d%d%d %d", BitStream[idx+9], BitStream[idx+10], BitStream[idx+11],BitStream[idx+12],BitStream[idx+13],BitStream[idx+14],BitStream[idx+15],BitStream[idx+16],BitStream[idx+17]); @@ -1356,21 +1361,29 @@ int CmdFSKdemodIO(const char *Cmd) uint8_t crc = bytebits_to_byte(BitStream+idx+54,8); uint16_t calccrc = 0; - for (uint8_t i=1; i<6; ++i){ - calccrc += bytebits_to_byte(BitStream+idx+9*i,8); + for (uint8_t i = 1; i < 6; ++i){ + calccrc += bytebits_to_byte(BitStream + idx + 9 * i ,8); } calccrc &= 0xff; calccrc = 0xff - calccrc; - char *crcStr = (crc == calccrc) ? "crc ok": "!crc"; + if (crc == calccrc) { + snprintf(crcStr, 3, "ok"); + retval = 1; + } else { + if (g_debugMode) PrintAndLog("DEBUG: IO Prox - crc failed"); + + snprintf(crcStr, 20, "failed 0x%02X != 0x%02X", crc, calccrc); + retval = 0; + } - PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version,facilitycode,number,code,code2, crc, crcStr); + PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [crc %s]",version,facilitycode,number,code,code2, crcStr); setDemodBuf(BitStream,64,idx); if (g_debugMode){ - PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx,64); + PrintAndLog("DEBUG: IO Prox - idx: %d, Len: %d, Printing demod buffer:", idx, 64); printDemodBuff(); - } - return 1; + } + return retval; } //by marshmellow @@ -1704,8 +1717,7 @@ int CmdFDXBdemodBI(const char *Cmd){ PrintAndLog("reserved Code: %u", reservedCode); PrintAndLog("Animal Tag: %s", animalBit ? "True" : "False"); PrintAndLog("CRC: 0x%04X - [%04X] - %s", crc16, calcCrc, (calcCrc == crc16) ? "Passed" : "Failed"); - PrintAndLog("Extended: 0x%X\n", extended); - + PrintAndLog("Extended: 0x%X\n", extended); return 1; } @@ -1771,8 +1783,7 @@ int CmdIndalaDecode(const char *Cmd) } if (!ans){ - if (g_debugMode) - PrintAndLog("Error1: %d",ans); + if (g_debugMode) PrintAndLog("DEBUG: Indala - Can't demod signal: %d",ans); return 0; } @@ -1780,33 +1791,31 @@ int CmdIndalaDecode(const char *Cmd) size_t size = DemodBufferLen; int startIdx = indala26decode(DemodBuffer, &size, &invert); if (startIdx < 0 || size > 224) { - if (g_debugMode) - PrintAndLog("Error2: %d",ans); + if (g_debugMode) PrintAndLog("DEBUG: Indala - Wrong size, expected [64|224] got: %d", size); return -1; } setDemodBuf(DemodBuffer, size, (size_t)startIdx); if (invert) - if (g_debugMode) - PrintAndLog("Had to invert bits"); + if (g_debugMode) PrintAndLog("DEBUG: Indala - Had to invert bits"); PrintAndLog("BitLen: %d",DemodBufferLen); //convert UID to HEX uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7; - uid1=bytebits_to_byte(DemodBuffer,32); - uid2=bytebits_to_byte(DemodBuffer+32,32); + uid1 = bytebits_to_byte(DemodBuffer,32); + uid2 = bytebits_to_byte(DemodBuffer+32,32); if (DemodBufferLen==64){ PrintAndLog("Indala UID=%s (%x%08x)", sprint_bin_break(DemodBuffer,DemodBufferLen,16), uid1, uid2); } else { - uid3=bytebits_to_byte(DemodBuffer+64,32); - uid4=bytebits_to_byte(DemodBuffer+96,32); - uid5=bytebits_to_byte(DemodBuffer+128,32); - uid6=bytebits_to_byte(DemodBuffer+160,32); - uid7=bytebits_to_byte(DemodBuffer+192,32); + uid3 = bytebits_to_byte(DemodBuffer+64,32); + uid4 = bytebits_to_byte(DemodBuffer+96,32); + uid5 = bytebits_to_byte(DemodBuffer+128,32); + uid6 = bytebits_to_byte(DemodBuffer+160,32); + uid7 = bytebits_to_byte(DemodBuffer+192,32); PrintAndLog("Indala UID=%s (%x%08x%08x%08x%08x%08x%08x)", sprint_bin_break(DemodBuffer,DemodBufferLen,16), uid1, uid2, uid3, uid4, uid5, uid6, uid7); } if (g_debugMode){ - PrintAndLog("DEBUG: printing demodbuffer:"); + PrintAndLog("DEBUG: Indala - printing demodbuffer:"); printDemodBuff(); } return 1; @@ -2091,9 +2100,9 @@ int getSamples(const char *Cmd, bool silent) if ( n == 0 || n > sizeof(got)) n = sizeof(got); - PrintAndLog("Reading %d bytes from device memory\n", n); + if (!silent) PrintAndLog("Reading %d bytes from device memory\n", n); GetFromBigBuf(got,n,0); - PrintAndLog("Data fetched"); + if (!silent) PrintAndLog("Data fetched"); UsbCommand response; if ( !WaitForResponseTimeout(CMD_ACK, &response, 10000) ) { PrintAndLog("timeout while waiting for reply."); @@ -2105,12 +2114,12 @@ int getSamples(const char *Cmd, bool silent) //Old devices without this feature would send 0 at arg[0] if (response.arg[0] > 0) { sample_config *sc = (sample_config *) response.d.asBytes; - PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample, sc->decimation); + if (!silent) PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample, sc->decimation); bits_per_sample = sc->bits_per_sample; } if (bits_per_sample < 8) { - PrintAndLog("Unpacking..."); + if (!silent) PrintAndLog("Unpacking..."); BitstreamOut bout = { got, bits_per_sample * n, 0}; int j =0; for (j = 0; j * bits_per_sample < n * 8 && j < n; j++) { @@ -2118,7 +2127,7 @@ int getSamples(const char *Cmd, bool silent) GraphBuffer[j] = ((int) sample )- 128; } GraphTraceLen = j; - PrintAndLog("Unpacked %d samples" , j ); + if (!silent) PrintAndLog("Unpacked %d samples" , j ); } else { for (int j = 0; j < n; j++) { GraphBuffer[j] = ((int)got[j]) - 128; diff --git a/client/cmdlf.c b/client/cmdlf.c index d64a15c5..63e8a2b5 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -249,8 +249,9 @@ int CmdFlexdemod(const char *Cmd) int CmdIndalaDemod(const char *Cmd) { + // PSK1, Bitrate 32, + // Usage: recover 64bit UID by default, specify "224" as arg to recover a 224bit UID - int state = -1; int count = 0; int i, j; @@ -1012,7 +1013,7 @@ int CmdLFfind(const char *Cmd) { if (!offline && (cmdp != '1')){ CmdLFRead("s"); - getSamples("30000",false); + getSamples("30000", TRUE); } else if (GraphTraceLen < 1000) { PrintAndLog("Data in Graphbuffer was too small."); return 0; @@ -1028,8 +1029,6 @@ int CmdLFfind(const char *Cmd) { PrintAndLog("False Positives ARE possible\n"); PrintAndLog("\nChecking for known tags:\n"); - - ans=CmdFSKdemodIO(""); if (ans>0) { PrintAndLog("\nValid IO Prox ID Found!"); @@ -1100,6 +1099,11 @@ int CmdLFfind(const char *Cmd) { PrintAndLog("\nValid NEDAP ID Found!"); return 1; } + ans=CmdVisa2kDemod(""); + if (ans>0) { + PrintAndLog("\nValid Visa2000 ID Found!"); + return 1; + } // TIdemod? @@ -1172,6 +1176,7 @@ static command_t CommandTable[] = {"guard", CmdLFGuard, 1, "{ Guardall RFIDs... }"}, {"hid", CmdLFHID, 1, "{ HID RFIDs... }"}, {"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"}, +// {"indala", CmdLFIndala, 1, "{ Indala RFIDs... }"}, {"io", CmdLFIO, 1, "{ IOPROX RFIDs... }"}, {"jablotron", CmdLFJablotron, 1, "{ JABLOTRON RFIDs... }"}, {"nedap", CmdLFNedap, 1, "{ NEDAP RFIDs... }"}, @@ -1181,6 +1186,7 @@ static command_t CommandTable[] = {"ti", CmdLFTI, 1, "{ TI RFIDs... }"}, {"t55xx", CmdLFT55XX, 1, "{ T55xx RFIDs... }"}, {"viking", CmdLFViking, 1, "{ Viking RFIDs... }"}, + {"visa2000", CmdLFVisa2k, 1, "{ Visa2000 RFIDs... }"}, {"config", CmdLFSetConfig, 0, "Set config for LF sampling, bit/sample, decimation, frequency"}, {"cmdread", CmdLFCommandRead, 0, " <'0' period> <'1' period> ['h' 134] \n\t\t-- Modulate LF reader field to send command before read (all periods in microseconds)"}, {"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"}, diff --git a/client/cmdlf.h b/client/cmdlf.h index 9b9c495f..bb77ed17 100644 --- a/client/cmdlf.h +++ b/client/cmdlf.h @@ -38,6 +38,7 @@ #include "cmdlfguard.h" // for GuardAll menu #include "cmdlfnedap.h" // for NEDAP menu #include "cmdlfjablotron.h" // for JABLOTRON menu +#include "cmdlfvisa2000.h" // for VISA2000 menu int CmdLF(const char *Cmd); diff --git a/client/cmdlfguard.c b/client/cmdlfguard.c index a6bc5e87..43492678 100644 --- a/client/cmdlfguard.c +++ b/client/cmdlfguard.c @@ -122,7 +122,7 @@ int GetGuardBits(uint32_t fc, uint32_t cn, uint8_t *guardBits) { int CmdGuardRead(const char *Cmd) { CmdLFRead("s"); - getSamples("30000",false); + getSamples("20000", TRUE); return CmdG_Prox_II_Demod(""); } diff --git a/client/cmdlfio.c b/client/cmdlfio.c index 826a26b2..20530d17 100644 --- a/client/cmdlfio.c +++ b/client/cmdlfio.c @@ -38,7 +38,7 @@ int usage_lf_io_clone(void) { PrintAndLog("Enables cloning of IOProx card with specified facility-code and card number onto T55x7."); PrintAndLog("The T55x7 must be on the antenna when issuing this command. T55x7 blocks are calculated and printed in the process."); PrintAndLog(""); - PrintAndLog("Usage: lf awid clone [h] [Q5]"); + PrintAndLog("Usage: lf io clone [h] [Q5]"); PrintAndLog("Options :"); PrintAndLog(" h : This help"); PrintAndLog(" : 8bit version"); diff --git a/client/cmdlfjablotron.c b/client/cmdlfjablotron.c index bd99fede..eff0124d 100644 --- a/client/cmdlfjablotron.c +++ b/client/cmdlfjablotron.c @@ -130,7 +130,7 @@ int CmdJablotronDemod(const char *Cmd) { int CmdJablotronRead(const char *Cmd) { CmdLFRead("s"); - getSamples("30000",false); + getSamples("20000", TRUE); return CmdJablotronDemod(Cmd); } diff --git a/client/cmdlfnedap.c b/client/cmdlfnedap.c index 0c56c8e2..1b745a11 100644 --- a/client/cmdlfnedap.c +++ b/client/cmdlfnedap.c @@ -202,7 +202,7 @@ lf t55xx wr b 4 d 4c0003ff int CmdLFNedapRead(const char *Cmd) { CmdLFRead("s"); - getSamples("30000",false); + getSamples("20000", TRUE); return CmdLFNedapDemod(""); } /* diff --git a/client/cmdlfpresco.c b/client/cmdlfpresco.c index 829e2e6f..3bf5e1be 100644 --- a/client/cmdlfpresco.c +++ b/client/cmdlfpresco.c @@ -153,7 +153,7 @@ int CmdPrescoRead(const char *Cmd) { // read lf silently CmdLFRead("s"); // get samples silently - getSamples("30000",false); + getSamples("20000", TRUE); // demod and output Presco ID return CmdPrescoDemod(Cmd); } diff --git a/client/cmdlfpyramid.c b/client/cmdlfpyramid.c index cf8b2b44..f1097121 100644 --- a/client/cmdlfpyramid.c +++ b/client/cmdlfpyramid.c @@ -74,7 +74,7 @@ int GetPyramidBits(uint32_t fc, uint32_t cn, uint8_t *pyramidBits) { int CmdPyramidRead(const char *Cmd) { CmdLFRead("s"); - getSamples("30000",false); + getSamples("20000", TRUE); return CmdFSKdemodPyramid(""); } diff --git a/client/cmdlfviking.c b/client/cmdlfviking.c index 039e4ae6..4ea35422 100644 --- a/client/cmdlfviking.c +++ b/client/cmdlfviking.c @@ -60,7 +60,7 @@ int CmdVikingRead(const char *Cmd) { // read lf silently CmdLFRead("s"); // get samples silently - getSamples("30000",false); + getSamples("20000", TRUE); // demod and output viking ID return CmdVikingDemod(Cmd); } -- 2.39.2