]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
ADD: `analyse nuid` - generates NUID 4byte from a UID 7byte. Mifare Classic Ev1...
[proxmark3-svn] / client / cmddata.c
index 6a5753c72a43426c79bb9c922cba7cbaeb714b07..00932a369d811be86ebabaddfdf01f4debb7e538 100644 (file)
@@ -364,95 +364,98 @@ int CmdGetBitStream(const char *Cmd)
 //print 64 bit EM410x ID in multiple formats
 void printEM410x(uint32_t hi, uint64_t id)
 {
-       if (id || hi){
-               uint64_t iii=1;
-               uint64_t id2lo=0;
-               uint32_t ii=0;
-               uint32_t i=0;
-               for (ii=5; ii>0;ii--){
-                       for (i=0;i<8;i++){
-                               id2lo=(id2lo<<1LL) | ((id & (iii << (i+((ii-1)*8)))) >> (i+((ii-1)*8)));
-                       }
+       if (!id && !hi) return;
+       
+       PrintAndLog("EM410x %s pattern found", (hi) ? "XL" : "" );
+
+       uint64_t iii=1;
+       uint64_t id2lo=0;
+       uint32_t ii=0;
+       uint32_t i=0;
+       for (ii=5; ii>0;ii--){
+               for (i=0;i<8;i++){
+                       id2lo=(id2lo<<1LL) | ((id & (iii << (i+((ii-1)*8)))) >> (i+((ii-1)*8)));
                }
-               if (hi){
-                       //output 88 bit em id
-                       PrintAndLog("\nEM TAG ID      : %06X%016" PRIX64, hi, id);
-               } else{
-                       //output 40 bit em id
-                       PrintAndLog("\nEM TAG ID      : %010" PRIX64, id);
-                       PrintAndLog("Unique TAG ID  : %010" PRIX64, id2lo);
-                       PrintAndLog("\nPossible de-scramble patterns");
-                       PrintAndLog("HoneyWell IdentKey {");
-                       PrintAndLog("DEZ 8          : %08" PRIu64, id & 0xFFFFFF);
-                       PrintAndLog("DEZ 10         : %010" PRIu64, id & 0xFFFFFFFF);
-                       PrintAndLog("DEZ 5.5        : %05" PRIu64 ".%05" PRIu64, (id>>16LL) & 0xFFFF, (id & 0xFFFF));
-                       PrintAndLog("DEZ 3.5A       : %03" PRIu64 ".%05" PRIu64, (id>>32ll), (id & 0xFFFF));
-                       PrintAndLog("DEZ 3.5B       : %03" PRIu64 ".%05" PRIu64, (id & 0xFF000000) >> 24, (id & 0xFFFF));
-                       PrintAndLog("DEZ 3.5C       : %03" PRIu64 ".%05" PRIu64, (id & 0xFF0000) >> 16, (id & 0xFFFF));
-                       PrintAndLog("DEZ 14/IK2     : %014" PRIu64, id);
-                       PrintAndLog("DEZ 15/IK3     : %015" PRIu64, id2lo);
-                       PrintAndLog("DEZ 20/ZK      : %02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld%02lld",
-                           (id2lo & 0xf000000000) >> 36,
-                           (id2lo & 0x0f00000000) >> 32,
-                           (id2lo & 0x00f0000000) >> 28,
-                           (id2lo & 0x000f000000) >> 24,
-                           (id2lo & 0x0000f00000) >> 20,
-                           (id2lo & 0x00000f0000) >> 16,
-                           (id2lo & 0x000000f000) >> 12,
-                           (id2lo & 0x0000000f00) >> 8,
-                           (id2lo & 0x00000000f0) >> 4,
-                           (id2lo & 0x000000000f)
-                       );
-                       uint64_t paxton = (((id>>32) << 24) | (id & 0xffffff))  + 0x143e00;
-                       PrintAndLog("}\nOther          : %05" PRIu64 "_%03" PRIu64 "_%08" PRIu64, (id&0xFFFF), ((id>>16LL) & 0xFF), (id & 0xFFFFFF));  
-                       PrintAndLog("Pattern Paxton : %" PRIu64 " [0x%" PRIX64 "]", paxton, paxton);
-
-                       uint32_t p1id = (id & 0xFFFFFF);
-                       uint8_t arr[32] = {0x00};
-                       int i =0; 
-                       int j = 23;
-                       for (; i < 24; ++i, --j ){
-                               arr[i] = (p1id >> i) & 1;
-                       }
-
-                       uint32_t p1  = 0;
-
-                       p1 |= arr[23] << 21;
-                       p1 |= arr[22] << 23;
-                       p1 |= arr[21] << 20;
-                       p1 |= arr[20] << 22;
-                               
-                       p1 |= arr[19] << 18;
-                       p1 |= arr[18] << 16;
-                       p1 |= arr[17] << 19;
-                       p1 |= arr[16] << 17;
-                               
-                       p1 |= arr[15] << 13;
-                       p1 |= arr[14] << 15;
-                       p1 |= arr[13] << 12;
-                       p1 |= arr[12] << 14;
-
-                       p1 |= arr[11] << 6;
-                       p1 |= arr[10] << 2;
-                       p1 |= arr[9]  << 7;
-                       p1 |= arr[8]  << 1;
-
-                       p1 |= arr[7]  << 0;
-                       p1 |= arr[6]  << 8;
-                       p1 |= arr[5]  << 11;
-                       p1 |= arr[4]  << 3;
-
-                       p1 |= arr[3]  << 10;
-                       p1 |= arr[2]  << 4;
-                       p1 |= arr[1]  << 5;
-                       p1 |= arr[0]  << 9;
-                       PrintAndLog("Pattern 1      : %d [0x%X]", p1, p1);
-
-                       uint16_t sebury1 = id & 0xFFFF;
-                       uint8_t  sebury2 = (id >> 16) & 0x7F;
-                       uint32_t sebury3 = id & 0x7FFFFF;
-                       PrintAndLog("Pattern Sebury : %d %d %d  [0x%X 0x%X 0x%X]", sebury1, sebury2, sebury3, sebury1, sebury2, sebury3);
+       }
+       
+       if (hi){
+               //output 88 bit em id
+               PrintAndLog("\nEM TAG ID      : %06X%016" PRIX64, hi, id);
+       } else{
+               //output 40 bit em id
+               PrintAndLog("\nEM TAG ID      : %010" PRIX64, id);
+               PrintAndLog("\nPossible de-scramble patterns");
+               PrintAndLog("Unique TAG ID  : %010" PRIX64, id2lo);
+               PrintAndLog("HoneyWell IdentKey {");
+               PrintAndLog("DEZ 8          : %08" PRIu64, id & 0xFFFFFF);
+               PrintAndLog("DEZ 10         : %010" PRIu64, id & 0xFFFFFFFF);
+               PrintAndLog("DEZ 5.5        : %05" PRIu64 ".%05" PRIu64, (id>>16LL) & 0xFFFF, (id & 0xFFFF));
+               PrintAndLog("DEZ 3.5A       : %03" PRIu64 ".%05" PRIu64, (id>>32ll), (id & 0xFFFF));
+               PrintAndLog("DEZ 3.5B       : %03" PRIu64 ".%05" PRIu64, (id & 0xFF000000) >> 24, (id & 0xFFFF));
+               PrintAndLog("DEZ 3.5C       : %03" PRIu64 ".%05" PRIu64, (id & 0xFF0000) >> 16, (id & 0xFFFF));
+               PrintAndLog("DEZ 14/IK2     : %014" PRIu64, id);
+               PrintAndLog("DEZ 15/IK3     : %015" PRIu64, id2lo);
+               PrintAndLog("DEZ 20/ZK      : %02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64 "%02" PRIu64,
+                       (id2lo & 0xf000000000) >> 36,
+                       (id2lo & 0x0f00000000) >> 32,
+                       (id2lo & 0x00f0000000) >> 28,
+                       (id2lo & 0x000f000000) >> 24,
+                       (id2lo & 0x0000f00000) >> 20,
+                       (id2lo & 0x00000f0000) >> 16,
+                       (id2lo & 0x000000f000) >> 12,
+                       (id2lo & 0x0000000f00) >> 8,
+                       (id2lo & 0x00000000f0) >> 4,
+                       (id2lo & 0x000000000f)
+               );
+               uint64_t paxton = (((id>>32) << 24) | (id & 0xffffff))  + 0x143e00;
+               PrintAndLog("}\nOther          : %05" PRIu64 "_%03" PRIu64 "_%08" PRIu64, (id&0xFFFF), ((id>>16LL) & 0xFF), (id & 0xFFFFFF));  
+               PrintAndLog("Pattern Paxton : %" PRIu64 " [0x%" PRIX64 "]", paxton, paxton);
+
+               uint32_t p1id = (id & 0xFFFFFF);
+               uint8_t arr[32] = {0x00};
+               int i =0; 
+               int j = 23;
+               for (; i < 24; ++i, --j ){
+                       arr[i] = (p1id >> i) & 1;
                }
+
+               uint32_t p1  = 0;
+
+               p1 |= arr[23] << 21;
+               p1 |= arr[22] << 23;
+               p1 |= arr[21] << 20;
+               p1 |= arr[20] << 22;
+                       
+               p1 |= arr[19] << 18;
+               p1 |= arr[18] << 16;
+               p1 |= arr[17] << 19;
+               p1 |= arr[16] << 17;
+                       
+               p1 |= arr[15] << 13;
+               p1 |= arr[14] << 15;
+               p1 |= arr[13] << 12;
+               p1 |= arr[12] << 14;
+
+               p1 |= arr[11] << 6;
+               p1 |= arr[10] << 2;
+               p1 |= arr[9]  << 7;
+               p1 |= arr[8]  << 1;
+
+               p1 |= arr[7]  << 0;
+               p1 |= arr[6]  << 8;
+               p1 |= arr[5]  << 11;
+               p1 |= arr[4]  << 3;
+
+               p1 |= arr[3]  << 10;
+               p1 |= arr[2]  << 4;
+               p1 |= arr[1]  << 5;
+               p1 |= arr[0]  << 9;
+               PrintAndLog("Pattern 1      : %d [0x%X]", p1, p1);
+
+               uint16_t sebury1 = id & 0xFFFF;
+               uint8_t  sebury2 = (id >> 16) & 0x7F;
+               uint32_t sebury3 = id & 0x7FFFFF;
+               PrintAndLog("Pattern Sebury : %d %d %d  [0x%X 0x%X 0x%X]", sebury1, sebury2, sebury3, sebury1, sebury2, sebury3);
        }
        return;
 }
@@ -468,26 +471,30 @@ int AskEm410xDecode(bool verbose, uint32_t *hi, uint64_t *lo )
                if (g_debugMode){
                        if (ans == -1)
                                PrintAndLog("DEBUG: Error - Em410x not only 0|1 in decoded bitstream");
+                       else if (ans == -2)
+                               PrintAndLog("DEBUG: Error - Em410x preamble not found");
                        else if (ans == -3)
                                PrintAndLog("DEBUG: Error - Em410x Size not correct: %d", size);
                        else if (ans == -4)
-                               PrintAndLog("DEBUG: Error - Em410x preamble not found");
-                       else if (ans == -5)
                                PrintAndLog("DEBUG: Error - Em410x parity failed");
                }
                return 0;
        }
-       
+       if (!lo && !hi) {
+               PrintAndLog("DEBUG: Error - Em410x decoded to all zeros");
+               return 0;
+       }
+               
        //set GraphBuffer for clone or sim command
        setDemodBuf(BitStream, size, idx);
        if (g_debugMode){
                PrintAndLog("DEBUG: Em410x idx: %d, Len: %d, Printing Demod Buffer:", idx, size);
                printDemodBuff();
        }
-       if (verbose){
-               PrintAndLog("EM410x pattern found: ");
+       
+       if (verbose)
                printEM410x(*hi, *lo);
-       }
+
        return 1;
 }
 
@@ -524,6 +531,7 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
        int clk = 0;
        int maxErr = 100;
        int maxLen = 0;
+       uint8_t askamp = 0;
        char amp = param_getchar(Cmd, 0);
        uint8_t BitStream[MAX_GRAPH_TRACE_LEN] = {0};
        sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &amp);
@@ -546,14 +554,16 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
                askAmp(BitStream, BitLen); 
 
        bool st = false;
-       if (*stCheck) st = DetectST(BitStream, &BitLen, &foundclk);
+       size_t ststart = 0, stend = 0;
+       if (*stCheck) st = DetectST_ext(BitStream, &BitLen, &foundclk, &ststart, &stend);
        if (st) {
                *stCheck = st;
                clk = (clk == 0) ? foundclk : clk;
-               if (verbose || g_debugMode) PrintAndLog("\nFound Sequence Terminator");
+               CursorCPos = ststart;
+               CursorDPos = stend;
+               if (verbose || g_debugMode) PrintAndLog("\nFound Sequence Terminator - First one is shown by orange and blue graph markers");
        }
-               
-       int errCnt = askdemod(BitStream, &BitLen, &clk, &invert, maxErr, 0, askType);
+       int errCnt = askdemod(BitStream, &BitLen, &clk, &invert, maxErr, askamp, askType);
        if (errCnt<0 || BitLen<16){  //if fatal error (or -1)
                if (g_debugMode) PrintAndLog("DEBUG: no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk);
                return 0;
@@ -827,7 +837,7 @@ int CmdVikingDemod(const char *Cmd)
                return 0;
        }
        size_t size = DemodBufferLen;
-       //call lfdemod.c demod for Viking
+
        int ans = VikingDemod_AM(DemodBuffer, &size);
        if (ans < 0) {
                if (g_debugMode) PrintAndLog("DEBUG: Error - Viking Demod %d %s", ans, (ans == -5)?"[chksum error]":"");
@@ -1043,29 +1053,30 @@ int CmdDetectClockRate(const char *Cmd)
        if (strlen(Cmd) > 6 || strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H')
                return usage_data_detectclock();
 
-       int ans = 0;
+       int clock = 0;
        switch ( cmdp ) {
                case 'a' :
                case 'A' :
-                       ans = GetAskClock(Cmd+1, true, false);
+                       clock = GetAskClock(Cmd+1, true, false);
                        break;
                case 'f' :
                case 'F' :
-                       ans = GetFskClock("", true, false);
+                       clock = GetFskClock("", true, false);
                        break;
                case 'n' :
                case 'N' :
-                       ans = GetNrzClock("", true, false);
+                       clock = GetNrzClock("", true, false);
                        break;
                case 'p' :
                case 'P' :
-                       ans = GetPskClock("", true, false);
+                       clock = GetPskClock("", true, false);
                        break;
                default :
                        PrintAndLog ("Please specify a valid modulation to detect the clock of - see option h for help");
                        break;
        }
-       return ans;
+       RepaintGraphWindow();
+       return clock;
 }
 
 char *GetFSKType(uint8_t fchigh, uint8_t fclow, uint8_t invert)
@@ -2088,6 +2099,16 @@ int CmdGrid(const char *Cmd)
        RepaintGraphWindow();
        return 0;
 }
+void setGrid_Clock(uint8_t clock){
+       PlotGridXdefault = clock;
+       RepaintGraphWindow();
+}
+
+int CmdSetGraphMarkers(const char *Cmd) {
+       sscanf(Cmd, "%i %i", &CursorCPos, &CursorDPos);
+       RepaintGraphWindow();
+       return 0;
+}
 
 int CmdHexsamples(const char *Cmd)
 {
@@ -2349,6 +2370,22 @@ int CmdRtrim(const char *Cmd)
        return 0;
 }
 
+// trim graph (middle) piece
+int CmdMtrim(const char *Cmd) {
+       int start = 0, stop = 0;
+       sscanf(Cmd, "%i %i", &start, &stop);
+
+       if (start > GraphTraceLen       || stop > GraphTraceLen || start > stop) return 0;
+       start++; //leave start position sample
+
+       GraphTraceLen -= stop - start;
+       for (int i = 0; i < GraphTraceLen; i++) {
+               GraphBuffer[start+i] = GraphBuffer[stop+i];
+       }
+       return 0;
+}
+
+
 int CmdNorm(const char *Cmd)
 {
        int i;
@@ -2581,6 +2618,7 @@ static command_t CommandTable[] =
        {"load",            CmdLoad,            1, "<filename> -- Load trace (to graph window"},
        {"ltrim",           CmdLtrim,           1, "<samples> -- Trim samples from left of trace"},
        {"rtrim",           CmdRtrim,           1, "<location to end trace> -- Trim samples from right of trace"},
+       {"mtrim",           CmdMtrim,           1, "<start> <stop> -- Trim out samples from the specified start to the specified stop"},
        {"manrawdecode",    Cmdmandecoderaw,    1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"},
        {"norm",            CmdNorm,            1, "Normalize max/min to +/-128"},
        {"plot",            CmdPlot,            1, "Show graph window (hit 'h' in window for keystroke help)"},
@@ -2590,6 +2628,7 @@ static command_t CommandTable[] =
        {"rawdemod",        CmdRawDemod,        1, "[modulation] ... <options> -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"},  
        {"samples",         CmdSamples,         0, "[512 - 40000] -- Get raw samples for graph window (GraphBuffer)"},
        {"save",            CmdSave,            1, "<filename> -- Save trace (from graph window)"},
+       {"setgraphmarkers", CmdSetGraphMarkers, 1, "[orange_marker] [blue_marker] (in graph window)"},
        {"scale",           CmdScale,           1, "<int> -- Set cursor display scale"},
        {"setdebugmode",    CmdSetDebugMode,    1, "<0|1|2> -- Turn on or off Debugging Level for lf demods"},
        {"shiftgraphzero",  CmdGraphShiftZero,  1, "<shift> -- Shift 0 for Graphed wave + or - shift value"},
Impressum, Datenschutz