X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/aed36ae5bd6f1770269e22a6f9e1a2688022f90b..e1778858ddc53a6a82e8ee24f02e6b673687f69a:/client/cmdlf.c?ds=sidebyside diff --git a/client/cmdlf.c b/client/cmdlf.c index 4c586a19..414e4a2b 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -8,6 +8,9 @@ // Low frequency commands //----------------------------------------------------------------------------- #include "cmdlf.h" + +bool g_lf_threshold_set = FALSE; + static int CmdHelp(const char *Cmd); int usage_lf_cmdread(void) { @@ -31,16 +34,14 @@ int usage_lf_read(void){ PrintAndLog("Options:"); PrintAndLog(" h This help"); PrintAndLog(" s silent run no printout"); - PrintAndLog("This function takes no arguments. "); PrintAndLog("Use 'lf config' to set parameters."); return 0; } int usage_lf_snoop(void) { - PrintAndLog("Usage: lf snoop"); + PrintAndLog("Snoop low frequence signal. Use 'lf config' to set parameters."); + PrintAndLog("Usage: lf snoop [h]"); PrintAndLog("Options:"); - PrintAndLog(" h This help"); - PrintAndLog("This function takes no arguments. "); - PrintAndLog("Use 'lf config' to set parameters."); + PrintAndLog(" h This help"); return 0; } int usage_lf_config(void) { @@ -498,24 +499,27 @@ int CmdLFSetConfig(const char *Cmd) { cmdp++; break; case 'q': - errors |= param_getdec(Cmd,cmdp+1,&divisor); + errors |= param_getdec(Cmd, cmdp+1, &divisor); cmdp+=2; break; case 't': - errors |= param_getdec(Cmd,cmdp+1,&unsigned_trigg); + errors |= param_getdec(Cmd, cmdp+1, &unsigned_trigg); cmdp+=2; - if(!errors) trigger_threshold = unsigned_trigg; + if(!errors) { + trigger_threshold = unsigned_trigg; + g_lf_threshold_set = (trigger_threshold > 0); + } break; case 'b': - errors |= param_getdec(Cmd,cmdp+1,&bps); + errors |= param_getdec(Cmd, cmdp+1, &bps); cmdp+=2; break; case 'd': - errors |= param_getdec(Cmd,cmdp+1,&decimation); + errors |= param_getdec(Cmd, cmdp+1, &decimation); cmdp+=2; break; case 'a': - averaging = param_getchar(Cmd,cmdp+1) == '1'; + averaging = param_getchar(Cmd, cmdp+1) == '1'; cmdp+=2; break; default: @@ -532,34 +536,56 @@ int CmdLFSetConfig(const char *Cmd) { //Validations if (errors) return usage_lf_config(); - //Bps is limited to 8, so fits in lower half of arg1 + //Bps is limited to 8 if (bps >> 4) bps = 8; sample_config config = { decimation, bps, averaging, divisor, trigger_threshold }; - //Averaging is a flag on high-bit of arg[1] - UsbCommand c = {CMD_SET_LF_SAMPLING_CONFIG}; - memcpy(c.d.asBytes,&config,sizeof(sample_config)); + UsbCommand c = {CMD_SET_LF_SAMPLING_CONFIG, {0,0,0} }; + memcpy(c.d.asBytes, &config, sizeof(sample_config)); clearCommandBuffer(); SendCommand(&c); return 0; } int CmdLFRead(const char *Cmd) { - bool arg1 = false; - uint8_t cmdp = param_getchar(Cmd, 0); - if ( cmdp == 'h' || cmdp == 'H') return usage_lf_read(); + if (offline) return 0; - //suppress print - if ( cmdp == 's' || cmdp == 'S') arg1 = true; + bool errors = FALSE; + bool arg1 = FALSE; + uint8_t cmdp = 0; + while(param_getchar(Cmd, cmdp) != 0x00) { + switch(param_getchar(Cmd, cmdp)) { + case 'h': + case 'H': + return usage_lf_read(); + case 's': + case 'S': + arg1 = TRUE; + cmdp++; + break; + default: + PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + errors = TRUE; + break; + } + if(errors) break; + } + + //Validations + if (errors) return usage_lf_read(); UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}}; clearCommandBuffer(); SendCommand(&c); - if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) { - PrintAndLog("command execution time out"); - return 1; + if ( g_lf_threshold_set ) { + WaitForResponse(CMD_ACK,NULL); + } else { + if ( !WaitForResponseTimeout(CMD_ACK, NULL ,2500) ) { + PrintAndLog("command execution time out"); + return 1; + } } return 0; } @@ -568,10 +594,11 @@ int CmdLFSnoop(const char *Cmd) { uint8_t cmdp = param_getchar(Cmd, 0); if(cmdp == 'h' || cmdp == 'H') return usage_lf_snoop(); - UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES}; + UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES,{0,0,0}}; clearCommandBuffer(); SendCommand(&c); WaitForResponse(CMD_ACK,NULL); + getSamples("", false); return 0; } @@ -1002,31 +1029,84 @@ int CmdVchDemod(const char *Cmd) { return 0; } + +//by marshmellow +int CheckChipset(bool getDeviceData) { + + if (!getDeviceData) return 0; + + uint32_t word = 0; + save_restoreGB(1); + + //check for em4x05/em4x69 chips first + if (EM4x05IsBlock0(&word)) { + save_restoreGB(0); + PrintAndLog("\nValid EM4x05/EM4x69 Chipset found\nTry `lf em 4x05` commands\n"); + return 1; + } + + //TODO check for t55xx chip... + // if ( t55xxIsBlock0(() { + // save_restoreGB(0); + // PrintAndLog("\nValid T55xx Chipset found\nTry `lf t55xx` commands\n"); + // return 1; + // } + + save_restoreGB(0); + return 0; +} + //by marshmellow int CmdLFfind(const char *Cmd) { int ans = 0; + size_t minLength = 1000; char cmdp = param_getchar(Cmd, 0); char testRaw = param_getchar(Cmd, 1); if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') return usage_lf_find(); - if (!offline && (cmdp != '1')){ + bool getDeviceData = (!offline && (cmdp != '1') ); + + if (getDeviceData) { CmdLFRead("s"); - getSamples("30000", TRUE); - } else if (GraphTraceLen < 1000) { + getSamples("30000", false); + } else if (GraphTraceLen < minLength) { PrintAndLog("Data in Graphbuffer was too small."); return 0; } if (cmdp == 'u' || cmdp == 'U') testRaw = 'u'; - // if ( justNoise(GraphBuffer, GraphTraceLen) ) { - // PrintAndLog("Signal looks just like noise. Quitting."); - // return 0; - // } - 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"); + size_t testLen = minLength; + + // only run these tests if device is online + if (getDeviceData) { + + // only run if graphbuffer is just noise as it should be for hitag/cotag + if (graphJustNoise(GraphBuffer, testLen)) { + + if (CheckChipset(getDeviceData) ) + return 1; + + ans=CmdLFHitagReader("26"); + if (ans==0) + return 1; + + ans=CmdCOTAGRead(""); + if (ans>0){ + PrintAndLog("\nValid COTAG ID Found!"); + return 1; + } + PrintAndLog("Signal looks just like noise. Quitting."); + return 0; + } + } + + // identify chipset + CheckChipset(getDeviceData); + ans=CmdFSKdemodIO(""); if (ans>0) { PrintAndLog("\nValid IO Prox ID Found!"); @@ -1117,9 +1197,8 @@ int CmdLFfind(const char *Cmd) { PrintAndLog("\nValid Presco ID Found!"); return 1; } - // TIdemod? - + // TIdemod? PrintAndLog("\nNo Known Tags Found!\n"); if (testRaw=='u' || testRaw=='U'){ //test unknown tag formats (raw mode) @@ -1181,12 +1260,12 @@ int CmdLFfind(const char *Cmd) { return 0; } -static command_t CommandTable[] = -{ +static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, {"animal", CmdLFFdx, 1, "{ Animal RFIDs... }"}, {"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"}, - {"em4x", CmdLFEM4X, 1, "{ EM4X RFIDs... }"}, + {"cotag", CmdLFCOTAG, 1, "{ COTAG RFIDs... }"}, + {"em", CmdLFEM4X, 1, "{ EM4X RFIDs... }"}, {"guard", CmdLFGuard, 1, "{ Guardall RFIDs... }"}, {"hid", CmdLFHID, 1, "{ HID RFIDs... }"}, {"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"}, @@ -1214,7 +1293,7 @@ static command_t CommandTable[] = {"simfsk", CmdLFfskSim, 0, "[c ] [i] [H ] [L ] [d ] \n\t\t-- Simulate LF FSK tag from demodbuffer or input"}, {"simpsk", CmdLFpskSim, 0, "[1|2|3] [c ] [i] [r ] [d ] \n\t\t-- Simulate LF PSK tag from demodbuffer or input"}, {"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, - {"snoop", CmdLFSnoop, 0, "['l'|'h'|] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"}, + {"snoop", CmdLFSnoop, 0, "Snoop LF"}, {"vchdemod", CmdVchDemod, 1, "['clone'] -- Demodulate samples for VeriChip"}, {NULL, NULL, 0, NULL} };