X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/f6d9fb173fec6d117faeb6c39cf37ee449d4ef16..bb42a03ef1318442fa0e8e2e07c7dbf8bd49fc96:/client/cmdlf.c diff --git a/client/cmdlf.c b/client/cmdlf.c index 93a9f586..f56aa1b7 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -356,88 +356,152 @@ int CmdIndalaClone(const char *Cmd) return 0; } -int CmdLFReadUsage() +int usage_lf_read() { - PrintAndLog("Usage: lf read [H|] [b ] [d ] [a 0|1]"); + PrintAndLog("Usage: lf read"); PrintAndLog("Options: "); PrintAndLog(" h This help"); - PrintAndLog(" H High frequency (134 KHz). Defaults to 125 KHz"); - PrintAndLog(" Manually set divisor. 88-> 134KHz, 95-> 125 Hz"); - PrintAndLog(" b Sets resolution of bits per sample. Default (max): 8"); - PrintAndLog(" d Sets decimation. A value of N saves only 1 in N samples. Default: 1"); - PrintAndLog(" a [0|1] Averaging - if set, will average the stored sample value when decimating. Default: 1"); + PrintAndLog("This function takes no arguments. "); + PrintAndLog("Use 'lf config' to set parameters."); + return 0; +} +int usage_lf_snoop() +{ + PrintAndLog("Usage: lf snoop"); + PrintAndLog("Options: "); + PrintAndLog(" h This help"); + PrintAndLog("This function takes no arguments. "); + PrintAndLog("Use 'lf config' to set parameters."); + return 0; +} + +int usage_lf_config() +{ + PrintAndLog("Usage: lf config [H|] [b ] [d ] [a 0|1]"); + PrintAndLog("Options: "); + PrintAndLog(" h This help"); + PrintAndLog(" L Low frequency (125 KHz)"); + PrintAndLog(" H High frequency (134 KHz)"); + PrintAndLog(" q Manually set divisor. 88-> 134KHz, 95-> 125 Hz"); + PrintAndLog(" b Sets resolution of bits per sample. Default (max): 8"); + PrintAndLog(" d Sets decimation. A value of N saves only 1 in N samples. Default: 1"); + PrintAndLog(" a [0|1] Averaging - if set, will average the stored sample value when decimating. Default: 1"); + PrintAndLog(" t Sets trigger threshold. 0 means no threshold"); PrintAndLog("Examples:"); - PrintAndLog(" lf read"); + PrintAndLog(" lf config b 8 L"); PrintAndLog(" Samples at 125KHz, 8bps."); - PrintAndLog(" lf read h b 4 d 3"); + PrintAndLog(" lf config H b 4 d 3"); PrintAndLog(" Samples at 134KHz, averages three samples into one, stored with "); PrintAndLog(" a resolution of 4 bits per sample."); + PrintAndLog(" lf read"); + PrintAndLog(" Performs a read (active field)"); + PrintAndLog(" lf snoop"); + PrintAndLog(" Performs a snoop (no active field)"); return 0; } -int CmdLFRead(const char *Cmd) + +int CmdLFSetConfig(const char *Cmd) { - uint8_t divisor = 95;//Frequency divisor - uint8_t bps = 8; // Bits per sample - uint8_t decimation = 1; //How many to keep - bool averaging = 1; // Should we use averaging when discarding samples? + + uint8_t divisor = 0;//Frequency divisor + uint8_t bps = 0; // Bits per sample + uint8_t decimation = 0; //How many to keep + bool averaging = 1; // Defaults to true bool errors = FALSE; + int trigger_threshold =-1;//Means no change + uint8_t unsigned_trigg = 0; uint8_t cmdp =0; - if(param_getchar(Cmd, cmdp) == 'h') + while(param_getchar(Cmd, cmdp) != 0x00) { - return CmdLFReadUsage(); + PrintAndLog("working %c", param_getchar(Cmd, cmdp)); + switch(param_getchar(Cmd, cmdp)) + { + case 'h': + return usage_lf_config(); + case 'H': + divisor = 88; + cmdp++; + break; + case 'L': + divisor = 95; + cmdp++; + break; + case 'q': + errors |= param_getdec(Cmd,cmdp+1,&divisor); + cmdp+=2; + break; + case 't': + errors |= param_getdec(Cmd,cmdp+1,&unsigned_trigg); + cmdp+=2; + if(!errors) trigger_threshold = unsigned_trigg; + break; + case 'b': + errors |= param_getdec(Cmd,cmdp+1,&bps); + cmdp+=2; + break; + case 'd': + errors |= param_getdec(Cmd,cmdp+1,&decimation); + cmdp+=2; + break; + case 'a': + averaging = param_getchar(Cmd,cmdp+1) == '1'; + cmdp+=2; + break; + default: + PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + errors = 1; + break; + } + if(errors) break; } - - // Divisor - if(param_getchar(Cmd, cmdp) == 'H') { - divisor = 88; - cmdp++; - }else if(param_isdec(Cmd,cmdp) ) + if(cmdp == 0) { - errors |= param_getdec(Cmd,cmdp, &divisor); - } - //BPS - if(param_getchar(Cmd, cmdp) == 'b') { - errors |= param_getdec(Cmd,cmdp+1,&bps); - cmdp+=2; - } - //Decimation - if(param_getchar(Cmd, cmdp) == 'd') - { - errors |= param_getdec(Cmd,cmdp+1,&decimation); - cmdp+=2; - } - //Averaging - if(param_getchar(Cmd, cmdp) == 'a') - { - averaging = param_getchar(Cmd,cmdp+1) == '1'; - cmdp+=2; + errors = 1;// No args } + //Validations if(errors) { - return CmdLFReadUsage(); + return usage_lf_config(); } - //Bps is limited to 8, so fits in lower half of arg1 - if(bps > 8) bps = 8; + if(bps >> 8) 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)); + SendCommand(&c); + return 0; +} - //Feedback - PrintAndLog("Sampling config: "); - PrintAndLog(" divisor: %d ", divisor); - PrintAndLog(" bps: %d ", bps); - PrintAndLog(" decimation: %d ", decimation); - PrintAndLog(" averaging: %d ", averaging); - PrintAndLog("OBS, this is sticky on the device and affects all LF listening operations"); - PrintAndLog("To reset, issue 'lf read'"); +int CmdLFRead(const char *Cmd) +{ + uint8_t cmdp =0; + if(param_getchar(Cmd, cmdp) == 'h') + { + return usage_lf_read(); + } //And ship it to device - //Averaging is a flag on high-bit of arg[1] UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K}; - c.arg[0] = divisor; - c.arg[1] = bps | (averaging << 7) ; - c.arg[2] = decimation; + SendCommand(&c); + WaitForResponse(CMD_ACK,NULL); + return 0; +} + +int CmdLFSnoop(const char *Cmd) +{ + uint8_t cmdp =0; + if(param_getchar(Cmd, cmdp) == 'h') + { + return usage_lf_snoop(); + } + UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES}; SendCommand(&c); WaitForResponse(CMD_ACK,NULL); return 0; @@ -455,7 +519,7 @@ static void ChkBitstream(const char *str) } } } - +//appears to attempt to simulate manchester int CmdLFSim(const char *Cmd) { int i,j; @@ -517,30 +581,6 @@ int CmdLFSimManchester(const char *Cmd) return 0; } -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 == '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("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; -} int CmdVchDemod(const char *Cmd) { @@ -642,26 +682,41 @@ int CmdLFfind(const char *Cmd) } PrintAndLog("NOTE: some demods output possible binary\n if it finds something that looks like a tag"); - PrintAndLog("Checking for known tags:"); + PrintAndLog("\nChecking for known tags:\n"); ans=CmdFSKdemodIO(""); if (ans>0) { - PrintAndLog("Valid IO Prox ID Found!"); + 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("Valid HID Prox ID Found!"); + PrintAndLog("\nValid HID Prox ID Found!"); return 1; } //add psk and indala - ans=CmdIndalaDecode("0"); + ans=CmdIndalaDecode(""); if (ans>0) { - PrintAndLog("Valid Indala ID Found!"); + PrintAndLog("\nValid Indala ID Found!"); return 1; } ans=Cmdaskmandemod(""); if (ans>0) { - PrintAndLog("Valid EM410x ID Found!"); + PrintAndLog("\nValid EM410x ID Found!"); return 1; } PrintAndLog("No Known Tags Found!\n"); @@ -673,12 +728,13 @@ 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)"}, {"em4x", CmdLFEM4X, 1, "{ EM4X RFIDs... }"}, + {"config", CmdLFSetConfig, 0, "Set config for LF sampling, bit/sample, decimation, frequency"}, {"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"}, {"hid", CmdLFHID, 1, "{ HID RFIDs... }"}, {"io", CmdLFIO, 1, "{ ioProx tags... }"}, {"indalademod", CmdIndalaDemod, 1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"}, {"indalaclone", CmdIndalaClone, 0, " ['l']-- Clone Indala to T55x7 (tag must be in antenna)(UID in HEX)(option 'l' for 224 UID"}, - {"read", CmdLFRead, 0, "['h' or ] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134, alternatively: f=12MHz/(divisor+1))"}, + {"read", CmdLFRead, 0, "Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"}, {"search", CmdLFfind, 1, "Read and Search for valid known tag (in offline mode it you can load first then search)"}, {"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"}, {"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},