]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
CHG: Added PR #220 from PM3 Master. ref: https://github.com/Proxmark/proxmark3...
authoriceman1001 <iceman@iuse.se>
Wed, 1 Mar 2017 19:14:46 +0000 (20:14 +0100)
committericeman1001 <iceman@iuse.se>
Wed, 1 Mar 2017 19:14:46 +0000 (20:14 +0100)
13 files changed:
CHANGELOG.md
client/cmddata.c
client/cmdhfmf.c
client/cmdlffdx.c
client/cmdlfnedap.c
client/cmdlfnoralsy.c
client/cmdlfpresco.c
client/proxgui.h
client/proxguiqt.cpp
client/ui.c
client/ui.h
common/lfdemod.c
common/lfdemod.h

index 83b44d74245e6deb3f002b3a31701a4b092bd627..0ec40164ca6e92a95c9db83369be867dc9d98e07 100644 (file)
@@ -2,7 +2,12 @@
 All notable changes to this project will be documented in this file.
 This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
 
-## [unreleased][unreleased]    
+## [unreleased][unreleased]
+  - hf mf dump - added retry loops to try each read attempt up to 3 times.  makes getting a complete dump easier with many antennas. (marshmellow)
+
+  - Added markers in the graph around found Sequence Terminator after askmandemod. (marshmellow)
+  - Added data mtrim <start> <stop> command to trim out samples between start and stop. (marshmellow)
+  - Added data setgraphmarkers <orange> <blue> command to set two extra markers on the graph (marshmellow)
   - added json support in lua (vitorio)
   - added a buspirate settings file for at91sam7s512 (adamlaurie)
   - `lf read` timeouts is now depended on what threshold level you set in `lf config`  (marshmellow)
index 19e01d82bf8c3770eeaa9e2882c25c9872ca1102..f9bb47c25941ce3af092b9b26c3be84f12435beb 100644 (file)
@@ -531,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);
@@ -553,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;
@@ -2100,6 +2103,11 @@ void setGrid_Clock(uint8_t clock){
        RepaintGraphWindow();
 }
 
+int CmdSetGraphMarkers(const char *Cmd) {
+       sscanf(Cmd, "%i %i", &CursorCPos, &CursorDPos);
+       RepaintGraphWindow();
+       return 0;
+}
 
 int CmdHexsamples(const char *Cmd)
 {
@@ -2361,6 +2369,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;
@@ -2593,6 +2617,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)"},
@@ -2602,6 +2627,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"},
index 04998e181bf724f1085e9f38384407d4fcbbd226..ede88cb7996d01d6acf1b73ae59ba5e4e72110a8 100644 (file)
@@ -492,8 +492,9 @@ int CmdHF14AMfDump(const char *Cmd) {
        PrintAndLog("|-----------------------------------------|");\r
        PrintAndLog("|------ Reading sector access bits...-----|");\r
        PrintAndLog("|-----------------------------------------|");\r
-       \r
+       uint8_t tries = 0;\r
        for (sectorNo = 0; sectorNo < numSectors; sectorNo++) {\r
+               for (tries = 0; tries < 3; tries++) {           \r
                UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 0, 0}};\r
                memcpy(c.d.asBytes, keyA[sectorNo], 6);\r
                clearCommandBuffer();\r
@@ -507,7 +508,8 @@ int CmdHF14AMfDump(const char *Cmd) {
                                rights[sectorNo][1] = ((data[7] & 0x20)>>3) | ((data[8] & 0x2)<<0) | ((data[8] & 0x20)>>5); // C1C2C3 for data area 1\r
                                rights[sectorNo][2] = ((data[7] & 0x40)>>4) | ((data[8] & 0x4)>>1) | ((data[8] & 0x40)>>6); // C1C2C3 for data area 2\r
                                rights[sectorNo][3] = ((data[7] & 0x80)>>5) | ((data[8] & 0x8)>>2) | ((data[8] & 0x80)>>7); // C1C2C3 for sector trailer\r
-                       } else {\r
+                                       break;\r
+                               } else if (tries == 2) { // on last try set defaults\r
                                PrintAndLog("Could not get access rights for sector %2d. Trying with defaults...", sectorNo);\r
                                rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00;\r
                                rights[sectorNo][3] = 0x01;\r
@@ -518,6 +520,7 @@ int CmdHF14AMfDump(const char *Cmd) {
                        rights[sectorNo][3] = 0x01;\r
                }\r
        }\r
+       }\r
        \r
        PrintAndLog("|-----------------------------------------|");\r
        PrintAndLog("|----- Dumping all blocks to file... -----|");\r
@@ -527,7 +530,7 @@ int CmdHF14AMfDump(const char *Cmd) {
        for (sectorNo = 0; isOK && sectorNo < numSectors; sectorNo++) {\r
                for (blockNo = 0; isOK && blockNo < NumBlocksPerSector(sectorNo); blockNo++) {\r
                        bool received = false;\r
-                       \r
+                       for (tries = 0; tries < 3; tries++) {                   \r
                        if (blockNo == NumBlocksPerSector(sectorNo) - 1) {              // sector trailer. At least the Access Conditions can always be read with key A. \r
                                UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}};\r
                                memcpy(c.d.asBytes, keyA[sectorNo], 6);\r
@@ -544,12 +547,18 @@ int CmdHF14AMfDump(const char *Cmd) {
                                } else if (rights[sectorNo][data_area] == 0x07) {                                                                               // no key would work\r
                                        isOK = false;\r
                                        PrintAndLog("Access rights do not allow reading of sector %2d block %3d", sectorNo, blockNo);\r
+                                               tries = 2;\r
                                } else {                                                                                                                                                                // key A would work\r
                                        UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}};\r
                                        memcpy(c.d.asBytes, keyA[sectorNo], 6);\r
                                        clearCommandBuffer();\r
                                        SendCommand(&c);\r
                                        received = WaitForResponseTimeout(CMD_ACK,&resp,1500);\r
+                                       }\r
+                               }\r
+                               if (received) {\r
+                                       isOK  = resp.arg[0] & 0xff;\r
+                                       if (isOK) break;\r
                                }\r
                        }\r
 \r
@@ -594,7 +603,6 @@ int CmdHF14AMfDump(const char *Cmd) {
                uint16_t numblocks = FirstBlockOfSector(numSectors - 1) + NumBlocksPerSector(numSectors - 1);\r
                fwrite(carddata, 1, 16*numblocks, fout);\r
                fclose(fout);\r
-               fout = NULL;            \r
                PrintAndLog("Dumped %d blocks (%d bytes) to file dumpdata.bin", numblocks, 16*numblocks);\r
        }\r
                \r
index 17f50ab148a227ab559329514dd6f975d3812654..da22a8333729c99441245be216a198df3bacb164 100644 (file)
@@ -149,6 +149,7 @@ int CmdFdxDemod(const char *Cmd) {
        }
 
        setDemodBuf(DemodBuffer, 128, ans);
+       setGrid_Clock(32);
        // remove marker bits (1's every 9th digit after preamble) (pType = 2)
        size = removeParity(DemodBuffer, 11, 9, 2, 117);
        if ( size != 104 ) {
index 8f5832ad92c5aa52f202ae06ea7b4f1c08e3ae46..7a3268bb2043886c12f19defb27c1eb4dfa282b3 100644 (file)
@@ -136,7 +136,8 @@ int CmdLFNedapDemod(const char *Cmd) {
        raw[2] = bytebits_to_byte(DemodBuffer+idx+32,32);
        raw[3] = bytebits_to_byte(DemodBuffer+idx,32);
        setDemodBuf(DemodBuffer,128,idx);
-
+       setGrid_Clock(64);
+       
        uint8_t firstParity = GetParity( DemodBuffer, EVEN, 63);
        if ( firstParity != DemodBuffer[63]  ) {
                PrintAndLog("DEBUG: Error - Nedap 1st 64bit parity check failed:  %d|%d ", DemodBuffer[63], firstParity);
index 405d0d437ded85e9a5e2183d81961089a5dce499..32c92d867777b80c20add7857b5e2f409f47c01c 100644 (file)
@@ -108,6 +108,7 @@ int CmdNoralsyDemod(const char *Cmd) {
                return 0;
        }
        setDemodBuf(DemodBuffer, 96, ans);
+       setGrid_Clock(32);
        
        //got a good demod
        uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32);
index 84b6f4a26fc25d6c40dc81afd287d025309eb27f..3afb3d24e845fdef8d30107dbb7a6a8c1987a08b 100644 (file)
@@ -137,6 +137,7 @@ int CmdPrescoDemod(const char *Cmd) {
                return 0;
        }
        setDemodBuf(DemodBuffer, 128, ans);
+       setGrid_Clock(32);
        
        //got a good demod
        uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32);
index b169453071d65aabf8676ab89454ac19609b298f..e83e75e74cecb81b516231da1168688fc6bd4f96 100644 (file)
@@ -23,7 +23,7 @@ void ExitGraphics(void);
 extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
 extern int GraphTraceLen;
 extern double CursorScaleFactor;
-extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault;
+extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, CursorCPos, CursorDPos;
 extern int CommandFinished;
 extern int offline;
 
index 151f6ce93cbc17d4909fffec4fa91d89f8507be5..a845468f59d56dad8931640f692347f5ce10fb1c 100644 (file)
@@ -99,7 +99,7 @@ ProxGuiQT::~ProxGuiQT(void)
 void ProxWidget::paintEvent(QPaintEvent *event)
 {
        QPainter painter(this);
-       QPainterPath penPath, whitePath, greyPath, lightgreyPath, cursorAPath, cursorBPath;
+       QPainterPath penPath, whitePath, greyPath, lightgreyPath, cursorAPath, cursorBPath, cursorCPath, cursorDPath;
        QRect r;
        QBrush brush(QColor(100, 255, 100));
        QPen pen(QColor(100, 255, 100));
@@ -114,6 +114,10 @@ void ProxWidget::paintEvent(QPaintEvent *event)
 
        if(CursorBPos > GraphTraceLen)
                CursorBPos= 0;
+       if(CursorCPos > GraphTraceLen)
+               CursorCPos= 0;
+       if(CursorDPos > GraphTraceLen)
+               CursorDPos= 0;
 
        r = rect();
 
@@ -238,13 +242,17 @@ void ProxWidget::paintEvent(QPaintEvent *event)
                        penPath.moveTo(x,y);
                }
 
-               if(i == CursorAPos || i == CursorBPos) {
+               if(i == CursorAPos || i == CursorBPos || i == CursorCPos || i == CursorDPos) {
                        QPainterPath *cursorPath;
 
-                       if(i == CursorAPos)
+                       if (i == CursorAPos)
                                cursorPath = &cursorAPath;
-                       else
+                       else if (i == CursorBPos)
                                cursorPath = &cursorBPath;
+                       else if (i == CursorCPos)
+                               cursorPath = &cursorCPath;
+                       else
+                               cursorPath = &cursorDPath;
                        
                        cursorPath->moveTo(x, r.top());
                        cursorPath->lineTo(x, r.bottom());
@@ -263,6 +271,10 @@ void ProxWidget::paintEvent(QPaintEvent *event)
        painter.drawPath(cursorAPath);
        painter.setPen(QColor(255, 0, 255));
        painter.drawPath(cursorBPath);
+       painter.setPen(QColor(255, 153, 0)); //orange
+       painter.drawPath(cursorCPath);
+       painter.setPen(QColor(0, 0, 205)); //light blue
+       painter.drawPath(cursorDPath);
 
        char str[200];
        sprintf(str, "@%d   max=%d min=%d mean=%d n=%d/%d    dt=%d [%.3f] zoom=%.3f CursorA=%d [%d] CursorB=%d [%d]    GridX=%d GridY=%d (%s)",
index 87fede08d149b0f3afe30ead07d88b48d7ff4968..4fabbe70af25c41849115e2aeda87cc3190824aa 100644 (file)
@@ -11,7 +11,7 @@
 
 #include "ui.h"
 double CursorScaleFactor;
-int PlotGridX, PlotGridY, PlotGridXdefault= 64, PlotGridYdefault= 64;
+int PlotGridX, PlotGridY, PlotGridXdefault= 64, PlotGridYdefault= 64, CursorCPos= 0, CursorDPos= 0;
 int offline;
 int flushAfterWrite = 0;
 extern pthread_mutex_t print_lock;
index 6891a82150a552419b5638179af38f448f7772b3..3886c12b90427b46aa53f64f09e0cd31cfe6ae6d 100644 (file)
@@ -45,7 +45,7 @@ void PrintAndLog(char *fmt, ...);
 void SetLogFilename(char *fn);
 
 extern double CursorScaleFactor;
-extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault;
+extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, CursorCPos, CursorDPos;
 extern int offline;
 extern int flushAfterWrite;   //buzzy
 
index c177468f0c312b7e59ed4d4ca05b5fca75a9ad5e..58b843e23e474786bab5a4a79ebd969c07c4d213 100644 (file)
@@ -206,6 +206,7 @@ size_t findModStart(uint8_t dest[], size_t size, uint8_t threshold_value, uint8_
 int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo)
 {
        // sanity check
+       if (*size < 64) return -3;      
        if (BitStream[1] > 1) return -1; 
        
        uint8_t fmtlen;
@@ -214,11 +215,13 @@ int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *h
        // preamble 0111111111
        // include 0 in front to help get start pos
        uint8_t preamble[] = {0,1,1,1,1,1,1,1,1,1};
-       if (!preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx)) 
+       if (!preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx))
                return -2;
-       if (*size < 64) return -3;
+
+       //XL and normal size.
+       if (*size != 64 && *size != 128) return -3;
        
-       fmtlen = (*size == 110) ? 22 : 10;
+       fmtlen = (*size == 128) ? 22 : 10;
 
        //skip last 4bit parity row for simplicity
        *size = removeParity(BitStream, *startIdx + sizeof(preamble), 5, 0, fmtlen * 5);  
@@ -1680,9 +1683,14 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
        return errCnt;
 }
 
+bool DetectST(uint8_t  buffer[], size_t *size, int *foundclock) {
+       size_t ststart = 0, stend = 0;
+       return DetectST_ext(buffer, size, foundclock, &ststart, &stend);
+}
+
 //by marshmellow
 //attempt to identify a Sequence Terminator in ASK modulated raw wave
-bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
+bool DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend) {
        size_t bufsize = *size;
        //need to loop through all samples and identify our clock, look for the ST pattern
        uint8_t fndClk[] = {8,16,32,40,50,64,128};
@@ -1837,7 +1845,7 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
        size_t newloc = 0;
        i=0;
        if (g_debugMode==2) prnt("DEBUG STT: Starting STT trim - start: %d, datalen: %d ",dataloc, datalen);            
-
+       bool firstrun = true;
        // warning - overwriting buffer given with raw wave data with ST removed...
        while ( dataloc < bufsize-(clk/2) ) {
                //compensate for long high at end of ST not being high due to signal loss... (and we cut out the start of wave high part)
@@ -1850,6 +1858,11 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
                        buffer[dataloc] = buffer[dataloc+2];
                        buffer[dataloc+1] = buffer[dataloc+2];
                }
+               if (firstrun) {
+                       *stend = dataloc;
+                       *ststart = dataloc-(clk*4);
+                       firstrun=false;
+               }
                for (i=0; i<datalen; ++i) {
                        if (i+newloc < bufsize) {
                                if (i+newloc < dataloc)
index ce71fad289b2c0aee3027047f284ae5c1bfa1dd7..16d10d4d28e301c2b89b0130f42d505706d43ee8 100644 (file)
@@ -34,6 +34,7 @@ int      DetectNRZClock(uint8_t dest[], size_t size, int clock);
 int      DetectPSKClock(uint8_t dest[], size_t size, int clock);
 int      DetectStrongAskClock(uint8_t dest[], size_t size, uint8_t high, uint8_t low);
 bool     DetectST(uint8_t buffer[], size_t *size, int *foundclock);
+bool     DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend);
 int      fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow);
 int      getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo);
 uint32_t manchesterEncode2Bytes(uint16_t datain);
Impressum, Datenschutz