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