]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - winsrc/command.cpp
compile clean and flasher targets
[proxmark3-svn] / winsrc / command.cpp
index 3fa75431e6e98915b3c349dccf8db0e55f77dba8..349ede695886c17c79dad93cf893e9854efb3be0 100644 (file)
@@ -256,6 +256,148 @@ static void CmdEM410xwatch(char *str)
        } while (go);\r
 }\r
 \r
+/* Read the transmitted data of an EM4x50 tag\r
+ * Format:\r
+ *\r
+ *  XXXXXXXX [row parity bit (even)] <- 8 bits plus parity\r
+ *  XXXXXXXX [row parity bit (even)] <- 8 bits plus parity\r
+ *  XXXXXXXX [row parity bit (even)] <- 8 bits plus parity\r
+ *  XXXXXXXX [row parity bit (even)] <- 8 bits plus parity\r
+ *  CCCCCCCC                         <- column parity bits\r
+ *  0                                <- stop bit\r
+ *  LW                               <- Listen Window\r
+ *\r
+ * This pattern repeats for every block of data being transmitted.\r
+ * Transmission starts with two Listen Windows (LW - a modulated\r
+ * pattern of 320 cycles each (32/32/128/64/64)).\r
+ *\r
+ * Note that this data may or may not be the UID. It is whatever data\r
+ * is stored in the blocks defined in the control word First and Last \r
+ * Word Read values. UID is stored in block 32.\r
+ */ \r
+static void CmdEM4x50read(char *str)\r
+{\r
+       int i, j, startblock, clock, skip, block, start, end, low, high;\r
+       BOOL complete= FALSE;\r
+       int tmpbuff[MAX_GRAPH_TRACE_LEN / 64];\r
+       char tmp[6];\r
+\r
+       high= low= 0;\r
+       clock= 64;\r
+\r
+       /* first get high and low values */\r
+       for (i = 0; i < GraphTraceLen; i++)\r
+       {\r
+               if (GraphBuffer[i] > high)      \r
+                       high = GraphBuffer[i];\r
+               else if (GraphBuffer[i] < low)\r
+                       low = GraphBuffer[i];\r
+       }\r
+\r
+       /* populate a buffer with pulse lengths */\r
+       i= 0;\r
+       j= 0;\r
+       while(i < GraphTraceLen)\r
+               {\r
+               // measure from low to low\r
+               while(GraphBuffer[i] > low)\r
+                       ++i;\r
+               start= i;\r
+               while(GraphBuffer[i] < high)\r
+                       ++i;\r
+               while(GraphBuffer[i] > low)\r
+                       ++i;\r
+               tmpbuff[j++]= i - start;\r
+               }\r
+\r
+       \r
+       /* look for data start - should be 2 pairs of LW (pulses of 192,128) */\r
+       start= -1;\r
+       skip= 0;\r
+       for (i= 0; i < j - 4 ; ++i)\r
+               {\r
+               skip += tmpbuff[i];\r
+               if (tmpbuff[i] >= 190 && tmpbuff[i] <= 194)\r
+                       if (tmpbuff[i+1] >= 126 && tmpbuff[i+1] <= 130)\r
+                               if (tmpbuff[i+2] >= 190 && tmpbuff[i+2] <= 194)\r
+                                       if (tmpbuff[i+3] >= 126 && tmpbuff[i+3] <= 130)\r
+                                               {\r
+                                               start= i + 3;\r
+                                               break;\r
+                                               }\r
+               }\r
+       startblock= i + 3;\r
+\r
+       /* skip over the remainder of the LW */\r
+       skip += tmpbuff[i+1]+tmpbuff[i+2];\r
+       while(GraphBuffer[skip] > low)\r
+               ++skip;\r
+       skip += 8;\r
+\r
+       /* now do it again to find the end */\r
+       end= start;\r
+       for (i += 3; i < j - 4 ; ++i)\r
+               {\r
+               end += tmpbuff[i];\r
+               if (tmpbuff[i] >= 190 && tmpbuff[i] <= 194)\r
+                       if (tmpbuff[i+1] >= 126 && tmpbuff[i+1] <= 130)\r
+                               if (tmpbuff[i+2] >= 190 && tmpbuff[i+2] <= 194)\r
+                                       if (tmpbuff[i+3] >= 126 && tmpbuff[i+3] <= 130)\r
+                                               {\r
+                                               complete= TRUE;\r
+                                               break;\r
+                                               }\r
+               }\r
+\r
+       if (start >= 0)\r
+               PrintToScrollback("Found data at sample: %i",skip);\r
+       else\r
+               {\r
+               PrintToScrollback("No data found!");\r
+               PrintToScrollback("Try again with more samples.");\r
+               return;\r
+               }\r
+\r
+       if (!complete)\r
+               {\r
+               PrintToScrollback("*** Warning!");\r
+               PrintToScrollback("Partial data - no end found!");\r
+               PrintToScrollback("Try again with more samples.");\r
+               }\r
+\r
+       /* get rid of leading crap */\r
+       sprintf(tmp,"%i",skip);\r
+       CmdLtrim(tmp);\r
+\r
+       /* now work through remaining buffer printing out data blocks */\r
+       block= 0;\r
+       i= startblock;\r
+       while(block < 6)\r
+               {\r
+               PrintToScrollback("Block %i:", block);\r
+               // mandemod routine needs to be split so we can call it for data\r
+               // just print for now for debugging\r
+               Cmdmanchesterdemod("i 64");\r
+               skip= 0;\r
+               /* look for LW before start of next block */\r
+               for ( ; i < j - 4 ; ++i)\r
+                       {\r
+                       skip += tmpbuff[i];\r
+                       if (tmpbuff[i] >= 190 && tmpbuff[i] <= 194)\r
+                               if (tmpbuff[i+1] >= 126 && tmpbuff[i+1] <= 130)\r
+                                       break;\r
+                       }\r
+               while(GraphBuffer[skip] > low)\r
+                       ++skip;\r
+               skip += 8;\r
+               sprintf(tmp,"%i",skip);\r
+               CmdLtrim(tmp);\r
+               start += skip;\r
+               block++;\r
+               }\r
+}\r
+\r
+\r
 /* Read the ID of an EM410x tag.\r
  * Format:\r
  *   1111 1111 1           <-- standard non-repeatable header\r
@@ -497,7 +639,6 @@ static void ChkBitstream(char *str)
 static void CmdLosim(char *str)\r
 {\r
        int i;\r
-       char *zero = "0";\r
 \r
        /* convert to bitstream if necessary */\r
        ChkBitstream(str);\r
@@ -535,6 +676,37 @@ static void CmdLoread(char *str)
        SendCommand(&c, FALSE);\r
 }\r
 \r
+static void CmdDetectReader(char *str)\r
+{\r
+       UsbCommand c;\r
+       // 'l' means LF - 125/134 kHz\r
+       if(*str == 'l') {\r
+               c.ext1 = 1;\r
+       } else if (*str == 'h') {\r
+               c.ext1 = 2;\r
+       } else if (*str != '\0') {\r
+               PrintToScrollback("use 'detectreader' or 'detectreader l' or 'detectreader h'");\r
+               return;\r
+       }\r
+       c.cmd = CMD_LISTEN_READER_FIELD;\r
+        SendCommand(&c, FALSE);\r
+}\r
+\r
+/* send a command before reading */\r
+static void CmdLoCommandRead(char *str)\r
+{\r
+       static char dummy[3];\r
+\r
+       dummy[0]= ' ';\r
+       \r
+       UsbCommand c;\r
+       c.cmd = CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K;\r
+       sscanf(str, "%i %i %i %s %s", &c.ext1, &c.ext2, &c.ext3, (char *) &c.d.asBytes,(char *) &dummy+1);\r
+       // in case they specified 'h'\r
+       strcpy((char *)&c.d.asBytes + strlen((char *)c.d.asBytes), dummy);\r
+       SendCommand(&c, FALSE);\r
+}\r
+\r
 static void CmdLosamples(char *str)\r
 {\r
        int cnt = 0;\r
@@ -1854,8 +2026,7 @@ static void CmdFlexdemod(char *str)
 \r
 static void Cmdaskdemod(char *str) {\r
        int i;\r
-       int n = 0;\r
-       int c,high,low = 0;\r
+       int c, high = 0, low = 0;\r
 \r
        // TODO: complain if we do not give 2 arguments here !\r
        sscanf(str, "%i", &c);\r
@@ -2409,68 +2580,71 @@ static struct {
        int             offline;  // 1 if the command can be used when in offline mode\r
        char            *docString;\r
 } CommandTable[] = {\r
-       "askdemod",                     Cmdaskdemod,1,          "<samples per bit> <0|1> -- Attempt to demodulate simple ASK tags",\r
-       "autocorr",                     CmdAutoCorr,1,          "<window length> -- Autocorrelation over window",\r
-       "bitsamples",           CmdBitsamples,0,        "    Get raw samples as bitstring",\r
-       "bitstream",            Cmdbitstream,1,         "[clock rate] -- Convert waveform into a bitstream",\r
-       "buffclear",            CmdBuffClear,0,         "    Clear sample buffer and graph window",\r
-       "dec",                          CmdDec,1,               "    Decimate samples",\r
-       "detectclock",          Cmddetectclockrate,1, "    Detect clock rate",\r
-       "em410xsim",            CmdEM410xsim,1,         "<UID> -- Simulate EM410x tag",\r
-       "em410xread",           CmdEM410xread,1,        "[clock rate] -- Extract ID from EM410x tag",\r
-       "em410xwatch",          CmdEM410xwatch,0,       "    Watches for EM410x tags",\r
-       "exit",                         CmdQuit,1,                      "    Exit program",\r
-       "flexdemod",            CmdFlexdemod,1,         "    Demodulate samples for FlexPass",\r
-       "fpgaoff",                      CmdFPGAOff,0,           "    Set FPGA off",                                                     // ## FPGA Control\r
-       "hexsamples",           CmdHexsamples,0,        "<blocks> -- Dump big buffer as hex bytes",\r
-       "hi14alist",            CmdHi14alist,0,         "    List ISO 14443a history",                          // ## New list command\r
-       "hi14areader",          CmdHi14areader,0,       "    Act like an ISO14443 Type A reader",       // ## New reader command\r
-       "hi14asim",                     CmdHi14asim,0,          "<UID> -- Fake ISO 14443a tag",                                 // ## Simulate 14443a tag\r
-       "hi14asnoop",           CmdHi14asnoop,0,        "    Eavesdrop ISO 14443 Type A",                       // ## New snoop command\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", // new command greg\r
-       "hi15sim",                      CmdHi15tag,0,           "    Fake an ISO15693 tag", // new command greg\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,0,         "['224'] -- Demodulate samples for Indala",\r
-       "lcd",                          CmdLcd,0,                       "<HEX command> <count> -- Send command/data to LCD",\r
-       "lcdreset",                     CmdLcdReset,0,          "    Hardware reset LCD",\r
-       "load",                         CmdLoad,1,              "<filename> -- Load trace (to graph window",\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
-       "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
-       "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
-       "sri512read",           CmdSri512read,0,        "<int> -- Read contents of a SRI512 tag",\r
-       "sweeplf",                      CmdSweepLF,0,           "    Sweep through LF freq range and store results in buffer",\r
-       "tibits",                       CmdTibits,0,            "    Get raw bits for TI-type LF tag",\r
-       "tidemod",                      CmdTidemod,0,           "    Demodulate raw bits for TI-type LF tag",\r
-       "tiread",                       CmdTiread,0,            "    Read a TI-type 134 kHz tag",\r
-       "tune",                         CmdTune,0,              "    Measure antenna tuning",\r
-       "vchdemod",                     CmdVchdemod,0,          "['clone'] -- Demodulate samples for VeriChip",\r
-       "zerocrossings",        CmdZerocrossings,1,     "    Count time between zero-crossings",\r
+       {"askdemod",                    Cmdaskdemod,1,          "<samples per bit> <0|1> -- Attempt to demodulate simple ASK tags"},\r
+       {"autocorr",                    CmdAutoCorr,1,          "<window length> -- Autocorrelation over window"},\r
+       {"bitsamples",          CmdBitsamples,0,        "    Get raw samples as bitstring"},\r
+       {"bitstream",           Cmdbitstream,1,         "[clock rate] -- Convert waveform into a bitstream"},\r
+       {"buffclear",           CmdBuffClear,0,         "    Clear sample buffer and graph window"},\r
+       {"dec",                         CmdDec,1,               "    Decimate samples"},\r
+       {"detectclock",         Cmddetectclockrate,1, "    Detect clock rate"},\r
+       {"detectreader",                CmdDetectReader,0, "['l'|'h'] -- Detect external reader field (option 'l' or 'h' to limit to LF or HF)"},\r
+       {"em410xsim",           CmdEM410xsim,1,         "<UID> -- Simulate EM410x tag"},\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"},                                                    // ## FPGA Control\r
+       {"hexsamples",          CmdHexsamples,0,        "<blocks> -- Dump big buffer as hex bytes"},\r
+       {"hi14alist",           CmdHi14alist,0,         "    List ISO 14443a history"},                         // ## New list command\r
+       {"hi14areader",         CmdHi14areader,0,       "    Act like an ISO14443 Type A reader"},      // ## New reader command\r
+       {"hi14asim",                    CmdHi14asim,0,          "<UID> -- Fake ISO 14443a tag"},                                        // ## Simulate 14443a tag\r
+       {"hi14asnoop",          CmdHi14asnoop,0,        "    Eavesdrop ISO 14443 Type A"},                      // ## New snoop command\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"}, // new command greg\r
+       {"hi15sim",                     CmdHi15tag,0,           "    Fake an ISO15693 tag"}, // new command greg\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,0,         "['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
+       {"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
+       {"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
+       {"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
+       {"sri512read",          CmdSri512read,0,        "<int> -- Read contents of a SRI512 tag"},\r
+       {"sweeplf",                     CmdSweepLF,0,           "    Sweep through LF freq range and store results in buffer"},\r
+       {"tibits",                      CmdTibits,0,            "    Get raw bits for TI-type LF tag"},\r
+       {"tidemod",                     CmdTidemod,0,           "    Demodulate raw bits for TI-type LF tag"},\r
+       {"tiread",                      CmdTiread,0,            "    Read a TI-type 134 kHz tag"},\r
+       {"tune",                                CmdTune,0,              "    Measure antenna tuning"},\r
+       {"vchdemod",                    CmdVchdemod,0,          "['clone'] -- Demodulate samples for VeriChip"},\r
+       {"zerocrossings",       CmdZerocrossings,1,     "    Count time between zero-crossings"},\r
 };\r
 \r
 \r
Impressum, Datenschutz