CHG: Added PR #220 from PM3 Master. ref: https://github.com/Proxmark/proxmark3/pull/220
This commit is contained in:
@@ -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, "<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"},
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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)",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user