From a9eeb576983f932ee622554ccd4e08be10e695b5 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 1 Mar 2017 20:14:46 +0100 Subject: [PATCH] CHG: Added PR #220 from PM3 Master. ref: https://github.com/Proxmark/proxmark3/pull/220 --- CHANGELOG.md | 7 ++++++- client/cmddata.c | 34 ++++++++++++++++++++++++++++++---- client/cmdhfmf.c | 16 ++++++++++++---- client/cmdlffdx.c | 1 + client/cmdlfnedap.c | 3 ++- client/cmdlfnoralsy.c | 1 + client/cmdlfpresco.c | 1 + client/proxgui.h | 2 +- client/proxguiqt.cpp | 20 ++++++++++++++++---- client/ui.c | 2 +- client/ui.h | 2 +- common/lfdemod.c | 23 ++++++++++++++++++----- common/lfdemod.h | 1 + 13 files changed, 91 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83b44d74..0ec40164 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 command to trim out samples between start and stop. (marshmellow) + - Added data setgraphmarkers 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) diff --git a/client/cmddata.c b/client/cmddata.c index 19e01d82..f9bb47c2 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -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, &); @@ -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, " -- Load trace (to graph window"}, {"ltrim", CmdLtrim, 1, " -- Trim samples from left of trace"}, {"rtrim", CmdRtrim, 1, " -- Trim samples from right of trace"}, + {"mtrim", CmdMtrim, 1, " -- 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] ... -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, " -- Save trace (from graph window)"}, + {"setgraphmarkers", CmdSetGraphMarkers, 1, "[orange_marker] [blue_marker] (in graph window)"}, {"scale", CmdScale, 1, " -- Set cursor display scale"}, {"setdebugmode", CmdSetDebugMode, 1, "<0|1|2> -- Turn on or off Debugging Level for lf demods"}, {"shiftgraphzero", CmdGraphShiftZero, 1, " -- Shift 0 for Graphed wave + or - shift value"}, diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c index 04998e18..ede88cb7 100644 --- a/client/cmdhfmf.c +++ b/client/cmdhfmf.c @@ -492,8 +492,9 @@ int CmdHF14AMfDump(const char *Cmd) { PrintAndLog("|-----------------------------------------|"); PrintAndLog("|------ Reading sector access bits...-----|"); PrintAndLog("|-----------------------------------------|"); - + uint8_t tries = 0; for (sectorNo = 0; sectorNo < numSectors; sectorNo++) { + for (tries = 0; tries < 3; tries++) { UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 0, 0}}; memcpy(c.d.asBytes, keyA[sectorNo], 6); clearCommandBuffer(); @@ -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 rights[sectorNo][2] = ((data[7] & 0x40)>>4) | ((data[8] & 0x4)>>1) | ((data[8] & 0x40)>>6); // C1C2C3 for data area 2 rights[sectorNo][3] = ((data[7] & 0x80)>>5) | ((data[8] & 0x8)>>2) | ((data[8] & 0x80)>>7); // C1C2C3 for sector trailer - } else { + break; + } else if (tries == 2) { // on last try set defaults PrintAndLog("Could not get access rights for sector %2d. Trying with defaults...", sectorNo); rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00; rights[sectorNo][3] = 0x01; @@ -518,6 +520,7 @@ int CmdHF14AMfDump(const char *Cmd) { rights[sectorNo][3] = 0x01; } } + } PrintAndLog("|-----------------------------------------|"); PrintAndLog("|----- Dumping all blocks to file... -----|"); @@ -527,7 +530,7 @@ int CmdHF14AMfDump(const char *Cmd) { for (sectorNo = 0; isOK && sectorNo < numSectors; sectorNo++) { for (blockNo = 0; isOK && blockNo < NumBlocksPerSector(sectorNo); blockNo++) { bool received = false; - + for (tries = 0; tries < 3; tries++) { if (blockNo == NumBlocksPerSector(sectorNo) - 1) { // sector trailer. At least the Access Conditions can always be read with key A. UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}}; memcpy(c.d.asBytes, keyA[sectorNo], 6); @@ -544,12 +547,18 @@ int CmdHF14AMfDump(const char *Cmd) { } else if (rights[sectorNo][data_area] == 0x07) { // no key would work isOK = false; PrintAndLog("Access rights do not allow reading of sector %2d block %3d", sectorNo, blockNo); + tries = 2; } else { // key A would work UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}}; memcpy(c.d.asBytes, keyA[sectorNo], 6); clearCommandBuffer(); SendCommand(&c); received = WaitForResponseTimeout(CMD_ACK,&resp,1500); + } + } + if (received) { + isOK = resp.arg[0] & 0xff; + if (isOK) break; } } @@ -594,7 +603,6 @@ int CmdHF14AMfDump(const char *Cmd) { uint16_t numblocks = FirstBlockOfSector(numSectors - 1) + NumBlocksPerSector(numSectors - 1); fwrite(carddata, 1, 16*numblocks, fout); fclose(fout); - fout = NULL; PrintAndLog("Dumped %d blocks (%d bytes) to file dumpdata.bin", numblocks, 16*numblocks); } diff --git a/client/cmdlffdx.c b/client/cmdlffdx.c index 17f50ab1..da22a833 100644 --- a/client/cmdlffdx.c +++ b/client/cmdlffdx.c @@ -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 ) { diff --git a/client/cmdlfnedap.c b/client/cmdlfnedap.c index 8f5832ad..7a3268bb 100644 --- a/client/cmdlfnedap.c +++ b/client/cmdlfnedap.c @@ -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); diff --git a/client/cmdlfnoralsy.c b/client/cmdlfnoralsy.c index 405d0d43..32c92d86 100644 --- a/client/cmdlfnoralsy.c +++ b/client/cmdlfnoralsy.c @@ -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); diff --git a/client/cmdlfpresco.c b/client/cmdlfpresco.c index 84b6f4a2..3afb3d24 100644 --- a/client/cmdlfpresco.c +++ b/client/cmdlfpresco.c @@ -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); diff --git a/client/proxgui.h b/client/proxgui.h index b1694530..e83e75e7 100644 --- a/client/proxgui.h +++ b/client/proxgui.h @@ -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; diff --git a/client/proxguiqt.cpp b/client/proxguiqt.cpp index 151f6ce9..a845468f 100644 --- a/client/proxguiqt.cpp +++ b/client/proxguiqt.cpp @@ -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)", diff --git a/client/ui.c b/client/ui.c index 87fede08..4fabbe70 100644 --- a/client/ui.c +++ b/client/ui.c @@ -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; diff --git a/client/ui.h b/client/ui.h index 6891a821..3886c12b 100644 --- a/client/ui.h +++ b/client/ui.h @@ -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 diff --git a/common/lfdemod.c b/common/lfdemod.c index c177468f..58b843e2 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -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