]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - winsrc/command.cpp
New version of mandemod 64 by Samy: now does not need 'askdemod' anymore, and support...
[proxmark3-svn] / winsrc / command.cpp
index 9c4990a32349e2602c8908bc654018e8eed34b64..a02803db0da870b274571bc0397536cfd7a8d301 100644 (file)
@@ -42,6 +42,14 @@ static void GetFromBigBuf(BYTE *dest, int bytes)
        }\r
 }\r
 \r
+static void CmdReset(char *str)\r
+{\r
+       UsbCommand c;\r
+       c.cmd = CMD_HARDWARE_RESET;\r
+       SendCommand(&c, FALSE);\r
+}\r
+\r
+\r
 static void CmdQuit(char *str)\r
 {\r
        exit(0);\r
@@ -805,7 +813,7 @@ static void CmdHi15demod(char *str)
 {\r
        // The sampling rate is 106.353 ksps/s, for T = 18.8 us\r
 \r
-       // SOF defined as \r
+       // SOF defined as\r
        // 1) Unmodulated time of 56.64us\r
        // 2) 24 pulses of 423.75khz\r
        // 3) logic '1' (unmodulated for 18.88us followed by 8 pulses of 423.75khz)\r
@@ -833,7 +841,7 @@ static void CmdHi15demod(char *str)
                 1,  1,  1,  1\r
        };\r
 \r
-       // EOF defined as \r
+       // EOF defined as\r
        // 1) logic '0' (8 pulses of 423.75khz followed by unmodulated for 18.88us)\r
        // 2) 24 pulses of 423.75khz\r
        // 3) Unmodulated time of 56.64us\r
@@ -1614,15 +1622,24 @@ static void Cmdaskdemod(char *str) {
  *               Typical values can be 64, 32, 128...
  */
 static void Cmdmanchesterdemod(char *str) {
-       int i;
+       int i, j;\r
+       int bit;\r
        int clock;
        int lastval;
+       int low = 0;\r
+       int high = 0;\r
+       int hithigh, hitlow, first;\r
        int lc = 0;
        int bitidx = 0;
        int bit2idx = 0;
-
+       int warnings = 0;\r
 
        sscanf(str, "%i", &clock);
+       if (!clock)\r
+       {\r
+               PrintToScrollback("You must provide a clock rate.");\r
+               return;\r
+       }\r
 
        int tolerance = clock/4;
        /* Holds the decoded bitstream: each clock period contains 2 bits       */
@@ -1634,21 +1651,77 @@ static void Cmdmanchesterdemod(char *str) {
        /* large array */
        int BitStream[MAX_GRAPH_TRACE_LEN];
 
+       /* Detect high and lows */\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
        /* Detect first transition */
        /* Lo-Hi (arbitrary)       */
-       for(i=1;i<GraphTraceLen;i++) {
-               if (GraphBuffer[i-1]<GraphBuffer[i]) {
+       for (i = 0; i < GraphTraceLen; i++)\r
+       {\r
+               if (GraphBuffer[i] == low)\r
+               {\r
+//                     BitStream[0]=0; // Previous state = 0;\r
                lastval = i;
-               BitStream[0]=0; // Previous state = 0;
                break;
                }
        }
+//PrintToScrollback("cool %d %d %d %d", low, high, lastval, GraphBuffer[i]);\r
+\r
+       /* If we're not working with 1/0s, demod based off clock */\r
+       if (high != 1)\r
+       {\r
+               bit = 0;\r
+               for (i = 0; i < (GraphTraceLen / clock); i++)\r
+               {\r
+                       hithigh = 0;\r
+                       hitlow = 0;\r
+                       first = 1;\r
+\r
+                       /* Find out if we hit both high and low peaks */\r
+                       for (j = 0; j < clock; j++)\r
+                       {\r
+                               if (GraphBuffer[(i * clock) + j] == high)\r
+                                       hithigh = 1;\r
+                               else if (GraphBuffer[(i * clock) + j] == low)\r
+                                       hitlow = 1;\r
+\r
+                               /* it doesn't count if it's the first part of our read\r
+                                  because it's really just trailing from the last sequence */\r
+                               if (first && (hithigh || hitlow))\r
+                                       hithigh = hitlow = 0;\r
+                               else\r
+                                       first = 0;\r
+\r
+                               if (hithigh && hitlow)\r
+                                       break;\r
+                       }\r
+\r
+                       /* If we didn't hit both high and low peaks, we had a bit transition */\r
+                       if (!hithigh || !hitlow)\r
+                               bit ^= 1;\r
+\r
+                       BitStream[bit2idx++] = bit;\r
+               }\r
+       }\r
+\r
+       /* standard 1/0 bitstream */\r
+       else\r
+       {\r
 
        /* Then detect duration between 2 successive transitions */
-       for(bitidx = 1 ;i<GraphTraceLen;i++) {
-               if (GraphBuffer[i-1] != GraphBuffer[i]) {
+               for (bitidx = 1; i < GraphTraceLen; i++)\r
+               {\r
+                       if (GraphBuffer[i-1] != GraphBuffer[i])\r
+                       {\r
                        lc = i-lastval;
                        lastval = i;
+\r
                        // Error check: if bitidx becomes too large, we do not
                        // have a Manchester encoded bitstream or the clock is really
                        // wrong!
@@ -1667,8 +1740,15 @@ static void Cmdmanchesterdemod(char *str) {
                                BitStream[bitidx++]=GraphBuffer[i-1];
                        } else {
                                // Error
-                               PrintToScrollback("Warning: Manchester decode error for pulse width detection.");                               
+                                       warnings++;\r
+                               PrintToScrollback("Warning: Manchester decode error for pulse width detection.");
                                PrintToScrollback("(too many of those messages mean either the stream is not Manchester encoded, or clock is wrong)");
+\r
+                                       if (warnings > 100)\r
+                                       {\r
+                                               PrintToScrollback("Error: too many detection errors, aborting.");\r
+                                               return;\r
+                                       }\r
                        }
                }
        }
@@ -1685,11 +1765,20 @@ static void Cmdmanchesterdemod(char *str) {
                        // We cannot end up in this state, this means we are unsynchronized,
                        // move up 1 bit:
                        i++;
+                               warnings++;\r
                        PrintToScrollback("Unsynchronized, resync...");
                        PrintToScrollback("(too many of those messages mean the stream is not Manchester encoded)");
+\r
+                               if (warnings > 100)\r
+                               {\r
+                                       PrintToScrollback("Error: too many decode errors, aborting.");\r
+                                       return;\r
+                               }\r
                }
        }
-       PrintToScrollback("Manchester decoded bitstream \n---------");
+       }\r
+\r
+       PrintToScrollback("Manchester decoded bitstream");\r
        // Now output the bitstream to the scrollback by line of 16 bits
        for (i = 0; i < (bit2idx-16); i+=16) {
                PrintToScrollback("%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i",
@@ -1829,6 +1918,8 @@ static void CmdLcd(char *str)
        }\r
 }\r
 \r
+\r
+\r
 static void CmdTest(char *str)\r
 {\r
 }\r
@@ -1866,58 +1957,60 @@ static struct {
        int             offline;  // 1 if the command can be used when in offline mode\r
        char            *docString;
 } CommandTable[] = {\r
-       "tune",                 CmdTune,0,              "measure antenna tuning",\r
-       "tiread",               CmdTiread,0,            "read a TI-type 134 kHz tag",\r
-       "tibits",               CmdTibits,0,            "get raw bits for TI-type LF tag",\r
-       "tidemod",              CmdTidemod,0,           "demod raw bits for TI-type LF tag",\r
-       "vchdemod",             CmdVchdemod,0,          "demod samples for VeriChip",\r
-       "plot",                 CmdPlot,1,              "show graph window",\r
-       "hide",                 CmdHide,1,              "hide graph window",\r
-       "losim",                CmdLosim,0,             "simulate LF tag",\r
-       "loread",               CmdLoread,0,            "read (125/134 kHz) LF ID-only tag",\r
+       "tune",                         CmdTune,0,              "measure antenna tuning",\r
+       "tiread",                       CmdTiread,0,            "read a TI-type 134 kHz tag",\r
+       "tibits",                       CmdTibits,0,            "get raw bits for TI-type LF tag",\r
+       "tidemod",                      CmdTidemod,0,           "demod raw bits for TI-type LF tag",\r
+       "vchdemod",                     CmdVchdemod,0,          "demod samples for VeriChip",\r
+       "plot",                         CmdPlot,1,              "show graph window",\r
+       "hide",                         CmdHide,1,              "hide graph window",\r
+       "losim",                        CmdLosim,0,             "simulate LF tag",\r
+       "loread",                       CmdLoread,0,            "read (125/134 kHz) LF ID-only tag",\r
        "losamples",            CmdLosamples,0,         "get raw samples for LF tag",\r
        "hisamples",            CmdHisamples,0,         "get raw samples for HF tag",\r
        "hisampless",           CmdHisampless,0,        "get signed raw samples, HF tag",\r
        "hisamplest",           CmdHi14readt,0,         "get samples HF, for testing",\r
-       "higet",                CmdHi14read_sim,0,      "get samples HF, 'analog'",\r
+       "higet",                        CmdHi14read_sim,0,      "get samples HF, 'analog'",\r
        "bitsamples",           CmdBitsamples,0,        "get raw samples as bitstring",\r
        "hexsamples",           CmdHexsamples,0,        "dump big buffer as hex bytes",\r
-       "hi15read",             CmdHi15read,0,          "read HF tag (ISO 15693)",\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
-       "hi14read",             CmdHi14read,0,          "read HF tag (ISO 14443)",\r
+       "hi15sim",                      CmdHi15tag,0,           "fake an ISO15693 tag", // new command greg\r
+       "hi14read",                     CmdHi14read,0,          "read HF tag (ISO 14443)",\r
        "sri512read",           CmdSri512read,0,        "Read contents of a SRI512 tag",\r
        "hi14areader",          CmdHi14areader,0,       "act like an ISO14443 Type A reader",   // ## New reader command\r
        "hi15demod",            CmdHi15demod,1,         "demod ISO15693 from tag",\r
        "hi14bdemod",           CmdHi14bdemod,1,        "demod ISO14443 Type B from tag",\r
-       "autocorr",             CmdAutoCorr,1,          "autocorrelation over window",\r
-       "norm",                 CmdNorm,1,              "normalize max/min to +/-500",\r
-       "dec",                  CmdDec,1,               "decimate",\r
-       "hpf",                  CmdHpf,1,               "remove DC offset from trace",\r
+       "autocorr",                     CmdAutoCorr,1,          "autocorrelation over window",\r
+       "norm",                         CmdNorm,1,              "normalize max/min to +/-500",\r
+       "dec",                          CmdDec,1,               "decimate",\r
+       "hpf",                          CmdHpf,1,               "remove DC offset from trace",\r
        "zerocrossings",        CmdZerocrossings,1,     "count time between zero-crossings",\r
-       "ltrim",                CmdLtrim,1,             "trim from left of trace",\r
-       "scale",                CmdScale,1,             "set cursor display scale",\r
+       "ltrim",                        CmdLtrim,1,             "trim from left of trace",\r
+       "scale",                        CmdScale,1,             "set cursor display scale",\r
        "flexdemod",            CmdFlexdemod,1,         "demod samples for FlexPass",\r
-       "save",                 CmdSave,1,              "save trace (from graph window)",\r
-       "load",                 CmdLoad,1,              "load trace (to graph window",\r
+       "save",                         CmdSave,1,              "save trace (from graph window)",\r
+       "load",                         CmdLoad,1,              "load trace (to graph window",\r
        "hisimlisten",          CmdHisimlisten,0,       "get HF samples as fake tag",\r
-       "hi14sim",              CmdHi14sim,0,           "fake ISO 14443 tag",\r
-       "hi14asim",             CmdHi14asim,0,          "fake ISO 14443a tag",                                  // ## Simulate 14443a tag\r
+       "hi14sim",                      CmdHi14sim,0,           "fake ISO 14443 tag",\r
+       "hi14asim",                     CmdHi14asim,0,          "fake ISO 14443a tag",                                  // ## Simulate 14443a tag\r
        "hi14snoop",            CmdHi14snoop,0,         "eavesdrop ISO 14443",\r
        "hi14asnoop",           CmdHi14asnoop,0,        "eavesdrop ISO 14443 Type A",                   // ## New snoop command\r
-       "hi14list",             CmdHi14list,0,          "list ISO 14443 history",\r
+       "hi14list",                     CmdHi14list,0,          "list ISO 14443 history",\r
        "hi14alist",            CmdHi14alist,0,         "list ISO 14443a history",                              // ## New list command\r
-       "hiddemod",             CmdHiddemod,1,          "HID Prox Card II (not optimal)",\r
+       "hiddemod",                     CmdHiddemod,1,          "HID Prox Card II (not optimal)",\r
        "hidfskdemod",          CmdHIDdemodFSK,0,       "HID FSK demodulator",\r
-       "askdemod",             Cmdaskdemod,1,          "Attempt to demodulate simple ASK tags",\r
+    "indalademod",             CmdIndalademod,0,         "demod samples for Indala",\r
+       "askdemod",                     Cmdaskdemod,1,          "Attempt to demodulate simple ASK tags",\r
        "hidsimtag",            CmdHIDsimTAG,0,         "HID tag simulator",\r
-       "mandemod",             Cmdmanchesterdemod,1,   "Try a Manchester demodulation on a binary stream",\r
-       "fpgaoff",              CmdFPGAOff,0,           "set FPGA off",                                                 // ## FPGA Control\r
-       "lcdreset",             CmdLcdReset,0,          "Hardware reset LCD",\r
-       "lcd",                  CmdLcd,0,               "Send command/data to LCD",\r
+       "mandemod",                     Cmdmanchesterdemod,1,   "Try a Manchester demodulation on a binary stream",\r
+       "fpgaoff",                      CmdFPGAOff,0,           "set FPGA off",                                                 // ## FPGA Control\r
+       "lcdreset",                     CmdLcdReset,0,          "Hardware reset LCD",\r
+       "lcd",                          CmdLcd,0,                       "Send command/data to LCD",\r
        "setlfdivisor",         CmdSetDivisor,0,        "Drive LF antenna at 12Mhz/(divisor+1)",\r
-       "sweeplf",              CmdSweepLF,0,           "Sweep through LF freq range and store results in buffer",\r
-       "quit",                 CmdQuit,0,              "quit program"\r
+       "sweeplf",                      CmdSweepLF,0,           "Sweep through LF freq range and store results in buffer",\r
+       "reset",                        CmdReset,0,                     "Reset the Proxmark3",\r
+       "quit",                         CmdQuit,1,                      "quit program"\r
 };\r
 \r
 \r
@@ -1932,8 +2025,10 @@ void CommandReceived(char *cmd)
        PrintToScrollback("> %s", cmd);\r
 \r
        if(strcmp(cmd, "help")==0) {\r
+               if (offline) PrintToScrollback("Operating in OFFLINE mode (no device connected)");\r
                PrintToScrollback("\r\nAvailable commands:");\r
                for(i = 0; i < sizeof(CommandTable) / sizeof(CommandTable[0]); i++) {\r
+                       if (offline && (CommandTable[i].offline==0)) continue;\r
                        char line[256];\r
                        memset(line, ' ', sizeof(line));\r
                        strcpy(line+2, CommandTable[i].name);\r
@@ -1955,6 +2050,10 @@ void CommandReceived(char *cmd)
                        while(*cmd == ' ') {\r
                                cmd++;\r
                        }\r
+                       if (offline && (CommandTable[i].offline==0)) {\r
+                               PrintToScrollback("Offline mode, cannot use this command.");\r
+                               return;\r
+                       }\r
                        (CommandTable[i].handler)(cmd);\r
                        return;\r
                }\r
Impressum, Datenschutz