X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/1d99b0df4a0c1a2f42fe23ae32cc8f3d090bc985..6982ac2612c12af9fa65437bf4279007d734cc59:/client/command.c diff --git a/client/command.c b/client/command.c index 3b4c147f..0d954258 100644 --- a/client/command.c +++ b/client/command.c @@ -93,6 +93,12 @@ static void CmdTune(char *str) SendCommand(&c); } +static void CmdHiTune(char *str) +{ + UsbCommand c={CMD_MEASURE_ANTENNA_TUNING_HF}; + SendCommand(&c); +} + static void CmdHi15read(char *str) { UsbCommand c={CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693}; @@ -132,6 +138,12 @@ static void CmdHi14areader(char *str) SendCommand(&c); } +static void CmdHi14amifare(char *str) +{ + UsbCommand c={CMD_READER_MIFARE, {strtol(str, NULL, 0), 0, 0}}; + SendCommand(&c); +} + static void CmdHi15reader(char *str) { UsbCommand c={CMD_READER_ISO_15693, {strtol(str, NULL, 0), 0, 0}}; @@ -565,7 +577,6 @@ retest: static void CmdEM410xsim(char *str) { int i, n, j, h, binary[4], parity[4]; - char *s = "0"; /* clock is 64 in EM410x tags */ int clock = 64; @@ -616,12 +627,40 @@ static void CmdEM410xsim(char *str) } /* modulate that biatch */ - Cmdmanchestermod(s); + Cmdmanchestermod(""); /* booyah! */ RepaintGraphWindow(); + + CmdLosim(""); +} + +/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */ +static void CmdLosimManchester(char *str) +{ + static int clock, gap; + static char data[1024], gapstring[8]; + int i; + + /* get settings/bits */ + sscanf(str, "%i %s %i", &clock, &data[0], &gap); + + /* clear our graph */ + CmdClearGraph(0); + + /* fill it with our bitstream */ + for (i= 0; i < strlen(data) ; ++i) + CmdAppendGraph(0, clock, data[i]- '0'); + + /* modulate */ + Cmdmanchestermod(""); + + /* show what we've done */ + RepaintGraphWindow(); - CmdLosim(s); + /* simulate */ + sprintf(&gapstring[0], "%i", gap); + CmdLosim(gapstring); } static void ChkBitstream(char *str) @@ -642,10 +681,14 @@ static void ChkBitstream(char *str) static void CmdLosim(char *str) { int i; + static int gap; + + sscanf(str,"%i",&gap); /* convert to bitstream if necessary */ ChkBitstream(str); + PrintToScrollback("Sending data, please wait..."); for (i = 0; i < GraphTraceLen; i += 48) { UsbCommand c={CMD_DOWNLOADED_SIM_SAMPLES_125K, {i, 0, 0}}; int j; @@ -653,9 +696,11 @@ static void CmdLosim(char *str) c.d.asBytes[j] = GraphBuffer[i+j]; } SendCommand(&c); + wait_for_response(CMD_ACK); } - UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, 0, 0}}; + PrintToScrollback("Starting simulator..."); + UsbCommand c={CMD_SIMULATE_TAG_125K, {GraphTraceLen, gap, 0}}; SendCommand(&c); } @@ -841,7 +886,15 @@ static int CmdHisamplest(char *str, int nrlow) static void CmdHexsamples(char *str) { int i, j, n; - int requested = strtol(str, NULL, 0); + int requested = 0; + int offset = 0; + sscanf(str, "%i %i", &requested, &offset); + if (offset % 4!=0) { + PrintToScrollback("Offset must be a multiple of 4"); + return; + } + offset = offset/4; + int delivered = 0; if (requested == 0) { @@ -851,7 +904,7 @@ static void CmdHexsamples(char *str) n = requested/4; } - for(i = 0; i < n; i += 12) { + for(i = offset; i < n+offset; i += 12) { UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}}; SendCommand(&c); wait_for_response(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K); @@ -2795,80 +2848,96 @@ static struct { int offline; // 1 if the command can be used when in offline mode char *docString; } CommandTable[] = { - {"amp", CmdAmp, 1, "Amplify peaks"}, - {"askdemod", Cmdaskdemod, 1, "<0|1> -- Attempt to demodulate simple ASK tags"}, +/* plot window / data buffer manipulation */ + {"buffclear", CmdBuffClear, 1, "Clear sample buffer and graph window"}, + {"load", CmdLoad, 1, " -- Load trace (to graph window"}, + {"save", CmdSave, 1, " -- Save trace (from graph window)"}, + {"amp", CmdAmp, 1, "Amplify peaks"}, {"autocorr", CmdAutoCorr, 1, " -- Autocorrelation over window"}, - {"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"}, + {"dec", CmdDec, 1, "Decimate samples"}, + {"hpf", CmdHpf, 1, "Remove DC offset from trace"}, + {"ltrim", CmdLtrim, 1, " -- Trim samples from left of trace"}, + {"norm", CmdNorm, 1, "Normalize max/min to +/-500"}, + {"plot", CmdPlot, 1, "Show graph window"}, + {"hide", CmdHide, 1, "Hide graph window"}, + {"grid", CmdGrid, 1, " -- overlay grid on graph window, use zero value to turn off either"}, + {"threshold", CmdThreshold, 1, "Maximize/minimize every value in the graph window depending on threshold"}, + {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"}, + {"scale", CmdScale, 1, " -- Set cursor display scale"}, {"bitstream", Cmdbitstream, 1, "[clock rate] -- Convert waveform into a bitstream"}, - {"buffclear", CmdBuffClear, 1, "Clear sample buffer and graph window"}, - {"dec", CmdDec, 1, "Decimate samples"}, {"detectclock", Cmddetectclockrate, 1, "Detect clock rate"}, + {"exit", CmdQuit, 1, "Exit program"}, + {"quit", CmdQuit, 1, "Exit program"}, + +/* low-level hardware control */ + {"fpgaoff", CmdFPGAOff, 0, "Set FPGA off"}, + {"tune", CmdTune, 0, "Measure antenna tuning"}, + {"hitune", CmdHiTune, 0, "Continuously measure HF antenna tuning"}, + {"readmem", CmdReadmem, 0, "[address] -- Read memory at decimal address from flash"}, + {"reset", CmdReset, 0, "Reset the Proxmark3"}, + {"setlfdivisor", CmdSetDivisor, 0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"}, + {"setmux", CmdSetMux, 0, " -- Set the ADC mux to a specific value"}, + {"version", CmdVersion, 0, "Show version inforation about the connected Proxmark"}, + {"lcd", CmdLcd, 0, " -- Send command/data to LCD"}, + {"lcdreset", CmdLcdReset, 0, "Hardware reset LCD"}, + +/* data transfer functions */ + + {"bitsamples", CmdBitsamples, 0, "Get raw samples as bitstring"}, + {"hexsamples", CmdHexsamples, 0, " [] -- Dump big buffer as hex bytes"}, + {"higet", CmdHi14read_sim, 0, " -- Get samples HF, 'analog'"}, + {"hisamples", CmdHisamples, 0, "Get raw samples for HF tag"}, + {"hisampless", CmdHisampless, 0, " -- Get signed raw samples, HF tag"}, + {"hisamplest", CmdHi14readt, 0, "Get samples HF, for testing"}, + {"losamples", CmdLosamples, 0, "[128 - 16000] -- Get raw samples for LF tag"}, {"detectreader", CmdDetectReader, 0, "['l'|'h'] -- Detect external reader field (option 'l' or 'h' to limit to LF or HF)"}, + +/* (de-)modulation */ + + {"askdemod", Cmdaskdemod, 1, "<0|1> -- Attempt to demodulate simple ASK tags"}, + {"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"}, + {"fskdemod", CmdFSKdemod, 1, "Demodulate graph window as a HID FSK"}, + {"hi14bdemod", CmdHi14bdemod, 1, "Demodulate ISO14443 Type B from tag"}, + {"hi15demod", CmdHi15demod, 1, "Demodulate ISO15693 from tag"}, + {"hiddemod", CmdHiddemod, 1, "Demodulate HID Prox Card II (not optimal)"}, + {"hidfskdemod", CmdHIDdemodFSK, 0, "Realtime HID FSK demodulator"}, + {"indalademod", CmdIndalademod, 1, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"}, + {"mandemod", Cmdmanchesterdemod, 1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"}, + {"manmod", Cmdmanchestermod, 1, "[clock rate] -- Manchester modulate a binary stream"}, + {"tidemod", CmdTIDemod, 1, "Demodulate raw bits for TI-type LF tag"}, + {"vchdemod", CmdVchdemod, 1, "['clone'] -- Demodulate samples for VeriChip"}, + +/* simulation */ {"em410xsim", CmdEM410xsim, 1, " -- Simulate EM410x tag"}, + {"hi14sim", CmdHi14sim, 0, "Fake ISO 14443 tag"}, + {"hi14asim", CmdHi14asim, 0, " -- Fake ISO 14443a tag"}, + {"hi15sim", CmdHi15tag, 0, "Fake an ISO15693 tag"}, + {"hidsimtag", CmdHIDsimTAG, 0, " -- HID tag simulator"}, + {"hisimlisten", CmdHisimlisten, 0, "Get HF samples as fake tag"}, + {"losim", CmdLosim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"}, + {"losimman", CmdLosimManchester, 0, " [GAP] Simulate arbitrary Manchester LF tag"}, + {"losimbidir", CmdLosimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, + +/* card reading functions */ {"em410xread", CmdEM410xread, 1, "[clock rate] -- Extract ID from EM410x tag"}, {"em410xwatch", CmdEM410xwatch, 0, "Watches for EM410x tags"}, {"em4x50read", CmdEM4x50read, 1, "Extract data from EM4x50 tag"}, - {"exit", CmdQuit, 1, "Exit program"}, - {"flexdemod", CmdFlexdemod, 1, "Demodulate samples for FlexPass"}, - {"fpgaoff", CmdFPGAOff, 0, "Set FPGA off"}, - {"fskdemod", CmdFSKdemod, 1, "Demodulate graph window as a HID FSK"}, - {"grid", CmdGrid, 1, " -- overlay grid on graph window, use zero value to turn off either"}, - {"hexsamples", CmdHexsamples, 0, " -- Dump big buffer as hex bytes"}, {"hi14alist", CmdHi14alist, 0, "List ISO 14443a history"}, + {"hi14amifare", CmdHi14amifare, 0, "Read out sector 0 parity error messages"}, {"hi14areader", CmdHi14areader, 0, "Act like an ISO14443 Type A reader"}, - {"hi14asim", CmdHi14asim, 0, " -- Fake ISO 14443a tag"}, {"hi14asnoop", CmdHi14asnoop, 0, "Eavesdrop ISO 14443 Type A"}, - {"hi14bdemod", CmdHi14bdemod, 1, "Demodulate ISO14443 Type B from tag"}, {"hi14list", CmdHi14list, 0, "List ISO 14443 history"}, {"hi14read", CmdHi14read, 0, "Read HF tag (ISO 14443)"}, - {"hi14sim", CmdHi14sim, 0, "Fake ISO 14443 tag"}, {"hi14snoop", CmdHi14snoop, 0, "Eavesdrop ISO 14443"}, - {"hi15demod", CmdHi15demod, 1, "Demodulate ISO15693 from tag"}, {"hi15read", CmdHi15read, 0, "Read HF tag (ISO 15693)"}, {"hi15reader", CmdHi15reader, 0, "Act like an ISO15693 reader"}, - {"hi15sim", CmdHi15tag, 0, "Fake an ISO15693 tag"}, - {"hiddemod", CmdHiddemod, 1, "Demodulate HID Prox Card II (not optimal)"}, - {"hide", CmdHide, 1, "Hide graph window"}, - {"hidfskdemod", CmdHIDdemodFSK, 0, "Realtime HID FSK demodulator"}, - {"hidsimtag", CmdHIDsimTAG, 0, " -- HID tag simulator"}, - {"higet", CmdHi14read_sim, 0, " -- Get samples HF, 'analog'"}, - {"hisamples", CmdHisamples, 0, "Get raw samples for HF tag"}, - {"hisampless", CmdHisampless, 0, " -- Get signed raw samples, HF tag"}, - {"hisamplest", CmdHi14readt, 0, "Get samples HF, for testing"}, - {"hisimlisten", CmdHisimlisten, 0, "Get HF samples as fake tag"}, - {"hpf", CmdHpf, 1, "Remove DC offset from trace"}, - {"indalademod", CmdIndalademod, 0, "['224'] -- Demodulate samples for Indala 64 bit UID (option '224' for 224 bit)"}, - {"lcd", CmdLcd, 0, " -- Send command/data to LCD"}, - {"lcdreset", CmdLcdReset, 0, "Hardware reset LCD"}, {"legicrfread", CmdLegicRfRead, 0, "Start the LEGIC RF reader"}, - {"load", CmdLoad, 1, " -- Load trace (to graph window"}, {"locomread", CmdLoCommandRead, 0, " <'0' period> <'1' period> ['h'] -- Modulate LF reader field to send command before read (all periods in microseconds) (option 'h' for 134)"}, - {"loread", CmdLoread, 0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)"}, - {"losamples", CmdLosamples, 0, "[128 - 16000] -- Get raw samples for LF tag"}, - {"losim", CmdLosim, 0, "Simulate LF tag"}, - {"losimbidir", CmdLosimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"}, - {"ltrim", CmdLtrim, 1, " -- Trim samples from left of trace"}, - {"mandemod", Cmdmanchesterdemod, 1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)"}, - {"manmod", Cmdmanchestermod, 1, "[clock rate] -- Manchester modulate a binary stream"}, - {"norm", CmdNorm, 1, "Normalize max/min to +/-500"}, - {"plot", CmdPlot, 1, "Show graph window"}, - {"quit", CmdQuit, 1, "Quit program"}, - {"readmem", CmdReadmem, 0, "[address] -- Read memory at decimal address from flash"}, - {"reset", CmdReset, 0, "Reset the Proxmark3"}, - {"save", CmdSave, 1, " -- Save trace (from graph window)"}, - {"scale", CmdScale, 1, " -- Set cursor display scale"}, - {"setlfdivisor", CmdSetDivisor, 0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"}, - {"setmux", CmdSetMux, 0, " -- Set the ADC mux to a specific value"}, + {"loread", CmdLoread, 0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)"}, {"sri512read", CmdSri512read, 0, " -- Read contents of a SRI512 tag"}, {"srix4kread", CmdSrix4kread, 0, " -- Read contents of a SRIX4K tag"}, - {"tidemod", CmdTIDemod, 1, "Demodulate raw bits for TI-type LF tag"}, - {"tiread", CmdTIRead, 0, "Read and decode a TI 134 kHz tag"}, - {"tiwrite", CmdTIWrite, 0, "Write new data to a r/w TI 134 kHz tag"}, - {"threshold", CmdThreshold, 1, "Maximize/minimize every value in the graph window depending on threshold"}, - {"tune", CmdTune, 0, "Measure antenna tuning"}, - {"vchdemod", CmdVchdemod, 0, "['clone'] -- Demodulate samples for VeriChip"}, - {"version", CmdVersion, 0, "Show version inforation about the connected Proxmark"}, - {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"}, + {"tiread", CmdTIRead, 0, "Read and decode a TI 134 kHz tag"}, + {"tiwrite", CmdTIWrite, 0, "Write new data to a r/w TI 134 kHz tag"}, }; static struct { @@ -2888,7 +2957,7 @@ static struct { void CommandReceived(char *cmd) { int i; - char line[256]; + char line[512]; PrintToScrollback("> %s", cmd); @@ -2997,14 +3066,19 @@ void UsbCommandReceived(UsbCommand *c) /* Maybe it's a response: */ switch(current_command) { case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K: - if (c->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response; - int i; - for(i=0; i<48; i++) sample_buf[i] = c->d.asBytes[i]; - received_command = c->cmd; - return; - default: - unexpected_response: - PrintToScrollback("unrecognized command %08x\n", c->cmd); - break; + if (c->cmd != CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K) goto unexpected_response; + int i; + for(i=0; i<48; i++) sample_buf[i] = c->d.asBytes[i]; + received_command = c->cmd; + return; + case CMD_DOWNLOADED_SIM_SAMPLES_125K: + if (c->cmd != CMD_ACK) goto unexpected_response; + // got ACK + received_command = c->cmd; + return; + default: + unexpected_response: + PrintToScrollback("unrecognized command %08x\n", c->cmd); + break; } }