]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
update more demods for graphing
authormarshmellow42 <marshmellowrf@gmail.com>
Wed, 12 Apr 2017 21:55:31 +0000 (17:55 -0400)
committermarshmellow42 <marshmellowrf@gmail.com>
Wed, 12 Apr 2017 21:55:31 +0000 (17:55 -0400)
still todo fsk based tag demods (like HID, AWID, IO, Pyramid...)

20 files changed:
client/cmddata.c
client/cmdlfawid.c
client/cmdlfem4x.c
client/cmdlffdx.c
client/cmdlfgproxii.c
client/cmdlfhid.c
client/cmdlfindala.c
client/cmdlfio.c
client/cmdlfjablotron.c
client/cmdlfnexwatch.c
client/cmdlfnoralsy.c
client/cmdlfparadox.c
client/cmdlfpresco.c
client/cmdlfpyramid.c
client/cmdlfsecurakey.c
client/cmdlfviking.c
client/cmdlfvisa2000.c
client/proxguiqt.cpp
common/lfdemod.c
common/lfdemod.h

index 7a411324de4c0a9384e62942c2eaa7c6c7708d7a..a59236e6d64e915b62ec3ac87962fc949c5f601b 100644 (file)
@@ -394,7 +394,7 @@ int CmdBiphaseDecodeRaw(const char *Cmd)
        uint8_t BitStream[MAX_DEMOD_BUF_LEN]={0};
        size = sizeof(BitStream);
        if ( !getDemodBuf(BitStream, &size) ) return 0;
-       errCnt=BiphaseRawDecode(BitStream, &size, offset, invert);
+       errCnt=BiphaseRawDecode(BitStream, &size, &offset, invert);
        if (errCnt<0){
                PrintAndLog("Error during decode:%d", errCnt);
                return 0;
@@ -407,10 +407,12 @@ int CmdBiphaseDecodeRaw(const char *Cmd)
        if (errCnt>0){
                PrintAndLog("# Errors found during Demod (shown as 7 in bit stream): %d",errCnt);
        }
+
        PrintAndLog("Biphase Decoded using offset: %d - # invert:%d - data:",offset,invert);
        PrintAndLog("%s", sprint_bin_break(BitStream, size, 16));
        
        if (offset) setDemodBuf(DemodBuffer,DemodBufferLen-offset, offset);  //remove first bit from raw demod
+       setClockGrid(g_DemodClock, g_DemodStartIdx + g_DemodClock*offset/2);
        return 1;
 }
 
@@ -423,26 +425,28 @@ int ASKbiphaseDemod(const char *Cmd, bool verbose)
        sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr);
 
        uint8_t BitStream[MAX_GRAPH_TRACE_LEN];   
-       size_t size = getFromGraphBuf(BitStream);         
+       size_t size = getFromGraphBuf(BitStream);
+       int startIdx = 0;
        //invert here inverts the ask raw demoded bits which has no effect on the demod, but we need the pointer
-       int errCnt = askdemod(BitStream, &size, &clk, &invert, maxErr, 0, 0);  
+       int errCnt = askdemod_ext(BitStream, &size, &clk, &invert, maxErr, 0, 0, &startIdx);  
        if ( errCnt < 0 || errCnt > maxErr ) {   
                if (g_debugMode) PrintAndLog("DEBUG: no data or error found %d, clock: %d", errCnt, clk);  
                        return 0;  
-       } 
+       }
 
        //attempt to Biphase decode BitStream
-       errCnt = BiphaseRawDecode(BitStream, &size, offset, invert);
+       errCnt = BiphaseRawDecode(BitStream, &size, &offset, invert);
        if (errCnt < 0){
                if (g_debugMode || verbose) PrintAndLog("Error BiphaseRawDecode: %d", errCnt);
                return 0;
-       } 
+       }
        if (errCnt > maxErr) {
                if (g_debugMode || verbose) PrintAndLog("Error BiphaseRawDecode too many errors: %d", errCnt);
                return 0;
        }
        //success set DemodBuffer and return
        setDemodBuf(BitStream, size, 0);
+       setClockGrid(clk, startIdx + clk*offset/2);
        if (g_debugMode || verbose){
                PrintAndLog("Biphase Decoded using offset: %d - clock: %d - # errors:%d - data:",offset,clk,errCnt);
                printDemodBuff();
index 225816df554496e020498590ab103b00fb36b623..7f0b9910e1df78b558ca9a07a64737392dd45f26 100644 (file)
@@ -126,6 +126,7 @@ int CmdFSKdemodAWID(const char *Cmd)
        uint32_t rawHi = bytebits_to_byte(BitStream+idx+32,32);
        uint32_t rawHi2 = bytebits_to_byte(BitStream+idx,32);
        setDemodBuf(BitStream,96,idx);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (idx*g_DemodClock));
 
        size = removeParity(BitStream, idx+8, 4, 1, 88);
        if (size != 66){
index 83a7da4e3eb0a156383608cd6eff8f7703a7361a..6587afe8e4d636469437fd72840a85609cac7ab6 100644 (file)
@@ -153,7 +153,8 @@ int AskEm410xDecode(bool verbose, uint32_t *hi, uint64_t *lo )
        if (Em410xDecode(BitStream, &BitLen, &idx, hi, lo)) {
                //set GraphBuffer for clone or sim command
                setDemodBuf(DemodBuffer, (BitLen==40) ? 64 : 128, idx+1);
-               g_DemodStartIdx += (idx+1)*g_DemodClock;
+               setClockGrid(g_DemodClock, g_DemodStartIdx + ((idx+1)*g_DemodClock));
+
                if (g_debugMode) {
                        PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
                        printDemodBuff();
@@ -704,6 +705,8 @@ bool EM4x05testDemodReadData(uint32_t *word, bool readCmd) {
                }
 
                setDemodBuf(DemodBuffer, 32, 0);
+               setClockGrid(0,0);
+
                *word = bytebits_to_byteLSBF(DemodBuffer, 32);
        }
        return true;
index e90d024e892c3e963fdacc8c239072533f35e4cf..234db59fbb2583a2ff2bd27879abb5bb7d16db14 100644 (file)
@@ -159,6 +159,8 @@ int CmdFdxDemod(const char *Cmd){
 
        // set and leave DemodBuffer intact
        setDemodBuf(DemodBuffer, 128, preambleIndex);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (preambleIndex*g_DemodClock));
+
        uint8_t bits_no_spacer[117];
        memcpy(bits_no_spacer, DemodBuffer + 11, 117);
 
index 1657f7618a78113d5a857b6e36bf2f3f5803942e..71c5f391706b2f3ae4631bcec7a597fd471da806 100644 (file)
@@ -83,7 +83,9 @@ int CmdG_Prox_II_Demod(const char *Cmd)
                PrintAndLog("Decoded Raw: %s", sprint_hex(ByteStream, 8)); 
        }
        PrintAndLog("Raw: %08x%08x%08x", raw1,raw2,raw3);
-       setDemodBuf(DemodBuffer+ans, 96, 0);
+       setDemodBuf(DemodBuffer, 96, ans);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
+
        return 1;
 }
 //by marshmellow
index e580a10db5f44ebc68c8adc2b7e1356b3c87111a..a9693fb2f4f7e87029a77895679ccf4b5b818ee8 100644 (file)
@@ -99,6 +99,7 @@ int CmdFSKdemodHID(const char *Cmd)
       (unsigned int) fmtLen, (unsigned int) fc, (unsigned int) cardnum);
   }
   setDemodBuf(BitStream,BitLen,idx);
+  setClockGrid(g_DemodClock, g_DemodStartIdx + (idx*g_DemodClock));
   if (g_debugMode){ 
     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen);
     printDemodBuff();
index fc396ac61db859e8314ec5f6b97bcbbddf4fe99b..de1757e9ee35243a5ae1fab388eec03addc3f55f 100644 (file)
@@ -46,6 +46,7 @@ int CmdIndalaDecode(const char *Cmd) {
                return -1;
        }
        setDemodBuf(DemodBuffer, size, (size_t)startIdx);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (startIdx*g_DemodClock));
        if (invert)
                if (g_debugMode)
                        PrintAndLog("Had to invert bits");
index cfcc7d6294dc7093a77c1246587d1960fedea01c..be8cf25edbacba1c1dfe5775df0d8b75a7349ee7 100644 (file)
@@ -119,6 +119,8 @@ int CmdFSKdemodIO(const char *Cmd)
 
   PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version,facilitycode,number,code,code2, crc, crcStr);
   setDemodBuf(BitStream,64,idx);
+  setClockGrid(g_DemodClock, g_DemodStartIdx + (idx*g_DemodClock));
+
   if (g_debugMode){
     PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx,64);
     printDemodBuff();
index a2984ac89948f2dad1cdf38b708d71b0a47a4e1b..9c69099edbdfb651a6aed4a5db90303502032f17 100644 (file)
@@ -117,8 +117,8 @@ int CmdJablotronDemod(const char *Cmd) {
                return 0;
        }
 
-       setDemodBuf(DemodBuffer+ans, 64, 0);
-       //setGrid_Clock(64);
+       setDemodBuf(DemodBuffer, 64, ans);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
 
        //got a good demod
        uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32);
index 64ea54e5d88db84871c3bdc757fd4e7c45b8a256..caabe83559d47fdaf118815ab76ddea666287516 100644 (file)
@@ -38,7 +38,8 @@ int CmdPSKNexWatch(const char *Cmd)
        }
        if (size != 128) return 0;
        setDemodBuf(DemodBuffer, size, startIdx+4);
-       startIdx = 8+32; //4 = extra i added, 8 = preamble, 32 = reserved bits (always 0)
+       setClockGrid(g_DemodClock, g_DemodStartIdx + ((startIdx+4)*g_DemodClock));
+       startIdx = 8+32; // 8 = preamble, 32 = reserved bits (always 0)
        //get ID
        uint32_t ID = 0;
        for (uint8_t wordIdx=0; wordIdx<4; wordIdx++){
index 282a79aed9492dfc3c0b4ee1dacdc590f13e28fa..2c90fa14da4843637114a680a28993021b1bffb7 100644 (file)
@@ -135,6 +135,7 @@ int CmdNoralsyDemod(const char *Cmd) {
                return 0;
        }
        setDemodBuf(DemodBuffer, 96, ans);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
        //setGrid_Clock(32);
 
        //got a good demod
index 87e49b3a2e98d96eaa40cbdecd361c039fed36e9..6582eb35ffb5ac59601228803f7e15ada0735b39 100644 (file)
@@ -63,6 +63,7 @@ int CmdFSKdemodParadox(const char *Cmd)
        PrintAndLog("Paradox TAG ID: %x%08x - FC: %d - Card: %d - Checksum: %02x - RAW: %08x%08x%08x",
                hi>>10, (hi & 0x3)<<26 | (lo>>10), fc, cardnum, (lo>>2) & 0xFF, rawHi2, rawHi, rawLo);
        setDemodBuf(BitStream,BitLen,idx);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (idx*g_DemodClock));
        if (g_debugMode){ 
                PrintAndLog("DEBUG: idx: %d, len: %d, Printing Demod Buffer:", idx, BitLen);
                printDemodBuff();
index f18c3ec6488e30ff3cff0a999e27c2d5babf5f2a..8ac3a71ea94254a721017152eaa2a79d0657d277 100644 (file)
@@ -144,8 +144,9 @@ int CmdPrescoDemod(const char *Cmd) {
        uint32_t cardid = raw4;
        PrintAndLog("Presco Tag Found: Card ID %08X", cardid);
        PrintAndLog("Raw: %08X%08X%08X%08X", raw1,raw2,raw3,raw4);
-       setDemodBuf(DemodBuffer+ans, 128, 0);
-       
+       setDemodBuf(DemodBuffer, 128, ans);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
+
        uint32_t sitecode = 0, usercode = 0, fullcode = 0;
        bool Q5=false;
        char cmd[12] = {0};
index 9cd4b207bbecfcef2be82b6e4d7bd06a8296c9fd..c7a6cb938217c3bbda3dc8c88e2c33cc0f4049fa 100644 (file)
@@ -152,6 +152,7 @@ int CmdFSKdemodPyramid(const char *Cmd)
        uint32_t rawHi2 = bytebits_to_byte(BitStream+idx+32,32);
        uint32_t rawHi3 = bytebits_to_byte(BitStream+idx,32);
        setDemodBuf(BitStream,128,idx);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (idx*g_DemodClock));
 
        size = removeParity(BitStream, idx+8, 8, 1, 120);
        if (size != 105){
index 87ebb25e9dc3a6c9ef60b52d2390911c40adb355..8085eedc909ec3cb259567ff5d94aa8dd648967c 100644 (file)
@@ -64,7 +64,7 @@ int CmdSecurakeyDemod(const char *Cmd) {
                return 0;
        }
        setDemodBuf(DemodBuffer, 96, ans);
-       //setGrid_Clock(40);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
 
        //got a good demod
        uint32_t raw1 = bytebits_to_byte(DemodBuffer   , 32);
index 3d525c1c9787bc1bcd421962aad0f3036e954673..779156c8d9d4301708c6c1ab0a0153c6ab5c4e62 100644 (file)
@@ -73,7 +73,8 @@ int CmdVikingDemod(const char *Cmd) {
        uint8_t  checksum = bytebits_to_byte(DemodBuffer+ans+32+24, 8);
        PrintAndLog("Viking Tag Found: Card ID %08X, Checksum: %02X", cardid, (unsigned int) checksum);
        PrintAndLog("Raw: %08X%08X", raw1,raw2);
-       setDemodBuf(DemodBuffer+ans, 64, 0);
+       setDemodBuf(DemodBuffer, 64, ans);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
        return 1;
 }
 
index b461d94d56bb698265684ae48671dfb38f534908..562b9bcdb583c06034f1e3762cad1f2656548995 100644 (file)
@@ -119,7 +119,7 @@ int CmdVisa2kDemod(const char *Cmd) {
                return 0;
        }
        setDemodBuf(DemodBuffer, 96, ans);
-       //setGrid_Clock(64);
+       setClockGrid(g_DemodClock, g_DemodStartIdx + (ans*g_DemodClock));
 
        //got a good demod
        uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32);
index c0aff8b6a5ce3b89035bab3e8ca8c37aec708f00..05a048d828df9b3b3d52be9f5e4c444aee90044c 100644 (file)
@@ -19,6 +19,7 @@
 #include <math.h>
 #include <limits.h>
 #include <stdio.h>
+#include <QSlider>
 #include <QHBoxLayout>
 #include <string.h>
 #include "proxguiqt.h"
@@ -431,11 +432,11 @@ void Plot::paintEvent(QPaintEvent *event)
        plotGridLines(&painter, plotRect);
 
        //Start painting graph
-       PlotGraph(GraphBuffer, GraphTraceLen,plotRect,infoRect,&painter,0);
-       PlotGraph(s_Buff, GraphTraceLen,plotRect,infoRect,&painter,1);
        if (showDemod && DemodBufferLen > 8) {
                PlotDemod(DemodBuffer, DemodBufferLen,plotRect,infoRect,&painter,2,g_DemodStartIdx);
        }
+       PlotGraph(s_Buff, GraphTraceLen,plotRect,infoRect,&painter,1);
+       PlotGraph(GraphBuffer, GraphTraceLen,plotRect,infoRect,&painter,0);
        // End graph drawing
 
        //Draw the cursors
@@ -472,6 +473,7 @@ void Plot::paintEvent(QPaintEvent *event)
 
 Plot::Plot(QWidget *parent) : QWidget(parent), GraphStart(0), GraphPixelsPerPoint(1)
 {
+       //Need to set this, otherwise we don't receive keypress events
        setFocusPolicy( Qt::StrongFocus);
        resize(600, 300);
 
index d6ef88a40280e57d3e241baffc772bfd70e1aeed..072bd120a7c315fc8aac100f05e1b55dff74ab0f 100644 (file)
@@ -1130,10 +1130,10 @@ int millerRawDecode(uint8_t *BitStream, size_t *size, int invert) {
 //take 01 or 10 = 1 and 11 or 00 = 0
 //check for phase errors - should never have 111 or 000 should be 01001011 or 10110100 for 1010
 //decodes biphase or if inverted it is AKA conditional dephase encoding AKA differential manchester encoding
-int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int offset, int invert) {
+int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int *offset, int invert) {
        uint16_t bitnum = 0;
        uint16_t errCnt = 0;
-       size_t i = offset;
+       size_t i = *offset;
        uint16_t MaxBits=512;
        //if not enough samples - error
        if (*size < 51) return -1;
@@ -1143,8 +1143,8 @@ int BiphaseRawDecode(uint8_t *BitStream, size_t *size, int offset, int invert) {
                if (BitStream[i+1]==BitStream[i+2]) offsetA=0; 
                if (BitStream[i+2]==BitStream[i+3]) offsetB=0;                                  
        }
-       if (!offsetA && offsetB) offset++;
-       for (i=offset; i<*size-3; i+=2){
+       if (!offsetA && offsetB) *offset+=1;
+       for (i=*offset; i<*size-3; i+=2){
                //check for phase error
                if (BitStream[i+1]==BitStream[i+2]) {
                        BitStream[bitnum++]=7;
@@ -1490,6 +1490,7 @@ size_t aggregate_bits(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert,
 //by marshmellow  (from holiman's base)
 // full fsk demod from GraphBuffer wave to decoded 1s and 0s (no mandemod)
 int fskdemod_ext(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow, int *startIdx) {
+       if (justNoise(dest, *size)) return 0;
        // FSK demodulator
        size = fsk_wave_demod(dest, size, fchigh, fclow, startIdx);
        size = aggregate_bits(dest, size, rfLen, invert, fchigh, fclow, startIdx);
@@ -1631,8 +1632,6 @@ int AWIDdemodFSK(uint8_t *dest, size_t *size) {
        //make sure buffer has enough data
        if (*size < 96*50) return -1;
 
-       if (justNoise(dest, *size)) return -2;
-
        // FSK demodulator
        *size = fskdemod(dest, *size, 50, 1, 10, 8);  // fsk2a RF/50 
        if (*size < 96) return -3;  //did we get a good demod?
@@ -1717,8 +1716,6 @@ int gProxII_Demod(uint8_t BitStream[], size_t *size) {
 
 // loop to get raw HID waveform then FSK demodulate the TAG ID from it
 int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo) {
-       if (justNoise(dest, *size)) return -1;
-
        size_t numStart=0, size2=*size, startIdx=0; 
        // FSK demodulator
        *size = fskdemod(dest, size2,50,1,10,8); //fsk2a
@@ -1747,7 +1744,6 @@ int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32
 }
 
 int IOdemodFSK(uint8_t *dest, size_t size) {
-       if (justNoise(dest, size)) return -1;
        //make sure buffer has data
        if (size < 66*64) return -2;
        // FSK demodulator
@@ -1797,8 +1793,6 @@ int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert) {
 
 // loop to get raw paradox waveform then FSK demodulate the TAG ID from it
 int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo) {
-       if (justNoise(dest, *size)) return -1;
-       
        size_t numStart=0, size2=*size, startIdx=0;
        // FSK demodulator
        *size = fskdemod(dest, size2,50,1,10,8); //fsk2a
@@ -1845,9 +1839,6 @@ int PyramiddemodFSK(uint8_t *dest, size_t *size) {
        //make sure buffer has data
        if (*size < 128*50) return -5;
 
-       //test samples are not just noise
-       if (justNoise(dest, *size)) return -1;
-
        // FSK demodulator
        *size = fskdemod(dest, *size, 50, 1, 10, 8);  // fsk2a RF/50 
        if (*size < 128) return -2;  //did we get a good demod?
index 9f37a969f6457cc6093e1184894cfbcd8ca4705a..56e07e56305684b471b32eb55dc13f3e516d51ba 100644 (file)
@@ -21,7 +21,7 @@ extern size_t   addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen,
 extern int      askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType);
 extern int      askdemod_ext(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType, int *startIdx);
 extern void     askAmp(uint8_t *BitStream, size_t size);
-extern int      BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert);
+extern int      BiphaseRawDecode(uint8_t * BitStream, size_t *size, int *offset, int invert);
 extern uint32_t bytebits_to_byte(uint8_t* src, size_t numbits);
 extern uint32_t bytebits_to_byteLSBF(uint8_t* src, size_t numbits);
 extern uint16_t countFC(uint8_t *BitStream, size_t size, uint8_t fskAdj);
Impressum, Datenschutz