]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlfem4x.c
CHG: some magic generation1 tags is not following protocol and answers to the "halt...
[proxmark3-svn] / client / cmdlfem4x.c
index e45c788aad82a3ba5e64821bc0cb738ab7391c45..5a263bf690e6398f2575dc3fd99a77510528a188 100644 (file)
@@ -20,6 +20,9 @@
 #include "cmdlf.h"
 #include "cmdlfem4x.h"
 #include "lfdemod.h"
+
+#define llx PRIx64
+
 char *global_em410xId;
 
 static int CmdHelp(const char *Cmd);
@@ -47,7 +50,7 @@ int CmdEM410xRead(const char *Cmd)
        uint32_t hi=0;
        uint64_t lo=0;
 
-       if(!AskEm410xDemod("", &hi, &lo)) return 0;
+       if(!AskEm410xDemod("", &hi, &lo, false)) return 0;
        PrintAndLog("EM410x pattern found: ");
        printEM410x(hi, lo);
        if (hi){
@@ -70,9 +73,9 @@ int CmdEM410xSim(const char *Cmd)
        uint8_t uid[5] = {0x00};
 
        if (cmdp == 'h' || cmdp == 'H') {
-               PrintAndLog("Usage:  lf em4x 410xsim <UID>");
+               PrintAndLog("Usage:  lf em4x em410xsim <UID>");
                PrintAndLog("");
-               PrintAndLog("     sample: lf em4x 410xsim 0F0368568B");
+               PrintAndLog("     sample: lf em4x em410xsim 0F0368568B");
                return 0;
        }
 
@@ -229,7 +232,6 @@ int CmdEM410xWrite(const char *Cmd)
 
        UsbCommand c = {CMD_EM410X_WRITE_TAG, {card, (uint32_t)(id >> 32), (uint32_t)id}};
        SendCommand(&c);
-
        return 0;
 }
 
@@ -323,6 +325,7 @@ int EM4x50Read(const char *Cmd, bool verbose)
        uint32_t Code[6];
        char tmp[6];
        char tmp2[20];
+       int phaseoff;
        high = low = 0;
        memset(tmpbuff, 0, MAX_GRAPH_TRACE_LEN / 64);
 
@@ -396,9 +399,11 @@ int EM4x50Read(const char *Cmd, bool verbose)
        startblock = i + 4;
 
        // skip over the remainder of LW
-       skip += tmpbuff[i+1] + tmpbuff[i+2] + clk + clk/8;
-       int phaseoff = tmpbuff[i+3]-clk;
-
+       skip += tmpbuff[i+1] + tmpbuff[i+2] + clk;
+       if (tmpbuff[i+3]>clk) 
+               phaseoff = tmpbuff[i+3]-clk;
+       else
+               phaseoff = 0;
        // now do it again to find the end
        end = skip;
        for (i += 3; i < j - 4 ; ++i) {
@@ -423,12 +428,6 @@ int EM4x50Read(const char *Cmd, bool verbose)
                        PrintAndLog("  or after a 'data askedge' command to clean up the read");
                        return 0;
                }
-               if (!complete)
-               {
-                       PrintAndLog("*** Warning!");
-                       PrintAndLog("Partial data - no end found!");
-                       PrintAndLog("Try again with more samples.");
-               }
        } else if (start < 0) return 0;
        start = skip;
        snprintf(tmp2, sizeof(tmp2),"%d %d 1000 %d", clk, invert, clk*47);
@@ -451,10 +450,14 @@ int EM4x50Read(const char *Cmd, bool verbose)
                                if (tmpbuff[i+1] >= clk-tol)
                                        break;
                }
+               if (i >= j-4) break; //next LW not found
                skip += clk;
-               phaseoff = tmpbuff[i+1]-clk;
+               if (tmpbuff[i+1]>clk)
+                       phaseoff = tmpbuff[i+1]-clk;
+               else
+                       phaseoff = 0;
                i += 2;
-               if (ASKmanDemod(tmp2, false, false) < 1) {
+               if (ASKDemod(tmp2, false, false, 1) < 1) {
                        save_restoreGB(0);
                        return 0;
                }
@@ -475,16 +478,22 @@ int EM4x50Read(const char *Cmd, bool verbose)
        }
        //print full code:
        if (verbose || g_debugMode || AllPTest){
+               if (!complete) {
+                       PrintAndLog("*** Warning!");
+                       PrintAndLog("Partial data - no end found!");
+                       PrintAndLog("Try again with more samples.");
+               }
                PrintAndLog("Found data at sample: %i - using clock: %i", start, clk);    
                end = block;
                for (block=0; block < end; block++){
                        PrintAndLog("Block %d: %08x",block,Code[block]);
                }
-               if (AllPTest)
+               if (AllPTest) {
                        PrintAndLog("Parities Passed");
-               else
+               } else {
                        PrintAndLog("Parities Failed");
                        PrintAndLog("Try cleaning the read samples with 'data askedge'");
+               }
        }
 
        //restore GraphBuffer
@@ -597,11 +606,11 @@ static command_t CommandTable[] =
 {
        {"help", CmdHelp, 1, "This help"},
        {"em410xdemod", CmdEMdemodASK, 0, "[findone] -- Extract ID from EM410x tag (option 0 for continuous loop, 1 for only 1 tag)"},  
-       {"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"},
+       {"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag in GraphBuffer"},
        {"em410xsim", CmdEM410xSim, 0, "<UID> -- Simulate EM410x tag"},
        {"em410xwatch", CmdEM410xWatch, 0, "['h'] -- Watches for EM410x 125/134 kHz tags (option 'h' for 134)"},
        {"em410xspoof", CmdEM410xWatchnSpoof, 0, "['h'] --- Watches for EM410x 125/134 kHz tags, and replays them. (option 'h' for 134)" },
-       {"em410xwrite", CmdEM410xWrite, 1, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
+       {"em410xwrite", CmdEM410xWrite, 0, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
        {"em4x50read", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"},
        {"readword", CmdReadWord, 1, "<Word> -- Read EM4xxx word data"},
        {"readwordPWD", CmdReadWordPWD, 1, "<Word> <Password> -- Read EM4xxx word data in password mode"},
Impressum, Datenschutz