X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/96f39a47a98990dbe0ea35f15d9a764d188e1ead..9552d5919b1376568700c1b20ed1f5af8692e0c2:/client/cmdlf.c diff --git a/client/cmdlf.c b/client/cmdlf.c index 9d62b2a8..46927f74 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -575,12 +575,13 @@ int usage_lf_simfsk(void) int usage_lf_simask(void) { //print help - PrintAndLog("Usage: lf simask [c ] [i] [m|r] [s] [d ]"); + PrintAndLog("Usage: lf simask [c ] [i] [b|m|r] [s] [d ]"); PrintAndLog("Options: "); PrintAndLog(" h This help"); PrintAndLog(" c Manually set clock - can autodetect if using DemodBuffer"); PrintAndLog(" i invert data"); - PrintAndLog(" m sim ask/manchester"); + PrintAndLog(" b sim ask/biphase"); + PrintAndLog(" m sim ask/manchester - Default"); PrintAndLog(" r sim ask/raw"); PrintAndLog(" s TBD- -to enable a gap between playback repetitions - default: no gap"); PrintAndLog(" d Data to sim as hex - omit to sim from DemodBuffer"); @@ -708,7 +709,7 @@ int CmdLFaskSim(const char *Cmd) { //autodetect clock from Graphbuffer if using demod buffer //will need clock, invert, manchester/raw as m or r, separator as s, and bitstream - uint8_t manchester = 1, separator = 0; + uint8_t encoding = 1, separator = 0; //char cmdp = Cmd[0], par3='m', par4=0; uint8_t clk=0, invert=0; bool errors = FALSE; @@ -730,12 +731,16 @@ int CmdLFaskSim(const char *Cmd) errors |= param_getdec(Cmd,cmdp+1,&clk); cmdp+=2; break; + case 'b': + encoding=2; //biphase + cmdp++; + break; case 'm': - manchester=1; + encoding=1; cmdp++; break; case 'r': - manchester=0; + encoding=0; cmdp++; break; case 's': @@ -776,10 +781,10 @@ int CmdLFaskSim(const char *Cmd) setDemodBuf(data, dataLen, 0); } if (clk == 0) clk = 64; - if (manchester == 0) clk = clk/2; //askraw needs to double the clock speed + if (encoding == 0) clk = clk/2; //askraw needs to double the clock speed uint16_t arg1, arg2; size_t size=DemodBufferLen; - arg1 = clk << 8 | manchester; + arg1 = clk << 8 | encoding; arg2 = invert << 8 | separator; if (size > USB_CMD_DATA_SIZE) { PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", size, USB_CMD_DATA_SIZE); @@ -1016,7 +1021,7 @@ int CmdLFfind(const char *Cmd) int ans=0; char cmdp = param_getchar(Cmd, 0); char testRaw = param_getchar(Cmd, 1); - if (strlen(Cmd) > 2 || cmdp == 'h' || cmdp == 'H') { + if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: lf search <0|1> [u]"); PrintAndLog(" , if not set, try reading data from tag."); PrintAndLog(" [Search for Unknown tags] , if not set, reads only known tags."); @@ -1025,7 +1030,6 @@ int CmdLFfind(const char *Cmd) PrintAndLog(" : lf search 1 = use data from GraphBuffer & search for known tags"); PrintAndLog(" : lf search u = try reading data from tag & search for known and unknown tags"); PrintAndLog(" : lf search 1 u = use data from GraphBuffer & search for known and unknown tags"); - return 0; } @@ -1037,29 +1041,36 @@ int CmdLFfind(const char *Cmd) return 0; } if (cmdp == 'u' || cmdp == 'U') testRaw = 'u'; + PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag"); PrintAndLog("False Positives ARE possible\n"); PrintAndLog("\nChecking for known tags:\n"); + ans=CmdFSKdemodIO(""); + if (ans>0) { PrintAndLog("\nValid IO Prox ID Found!"); return 1; } + ans=CmdFSKdemodPyramid(""); if (ans>0) { PrintAndLog("\nValid Pyramid ID Found!"); return 1; } + ans=CmdFSKdemodParadox(""); if (ans>0) { PrintAndLog("\nValid Paradox ID Found!"); return 1; } + ans=CmdFSKdemodAWID(""); if (ans>0) { PrintAndLog("\nValid AWID ID Found!"); return 1; } + ans=CmdFSKdemodHID(""); if (ans>0) { PrintAndLog("\nValid HID Prox ID Found!"); @@ -1085,24 +1096,56 @@ int CmdLFfind(const char *Cmd) if (testRaw=='u' || testRaw=='U'){ //test unknown tag formats (raw mode) PrintAndLog("\nChecking for Unknown tags:\n"); - ans=CmdDetectClockRate("f"); + ans=AutoCorrelate(4000, FALSE, FALSE); + + if (ans > 0) { + + PrintAndLog("Possible Auto Correlation of %d repeating samples",ans); + + if ( ans % 8 == 0) { + int bytes = (ans / 8); + PrintAndLog("Possible %d bytes", bytes); + int blocks = 0; + if ( bytes % 2 == 0) { + blocks = (bytes / 2); + PrintAndLog("Possible 2 blocks, width %d", blocks); + } + if ( bytes % 4 == 0) { + blocks = (bytes / 4); + PrintAndLog("Possible 4 blocks, width %d", blocks); + } + if ( bytes % 8 == 0) { + blocks = (bytes / 8); + PrintAndLog("Possible 8 blocks, width %d", blocks); + } + if ( bytes % 16 == 0) { + blocks = (bytes / 16); + PrintAndLog("Possible 16 blocks, width %d", blocks); + } + } + } + ans=GetFskClock("",FALSE,FALSE); //CmdDetectClockRate("F"); // if (ans != 0){ //fsk - ans=CmdFSKrawdemod(""); + ans=FSKrawDemod("",FALSE); if (ans>0) { PrintAndLog("\nUnknown FSK Modulated Tag Found!"); + printDemodBuff(); return 1; } } - ans=Cmdaskmandemod(""); + ans=ASKmanDemod("",FALSE,FALSE); if (ans>0) { PrintAndLog("\nUnknown ASK Modulated and Manchester encoded Tag Found!"); + PrintAndLog("\nif it does not look right it could instead be ASK/Biphase - try 'data rawdemod ab'"); + printDemodBuff(); return 1; } ans=CmdPSK1rawDemod(""); if (ans>0) { - PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data psk2rawdemod'"); + PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data rawdemod p2'"); PrintAndLog("\nCould also be PSK3 - [currently not supported]"); PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod"); + printDemodBuff(); return 1; } PrintAndLog("\nNo Data Found!\n");