From: iceman1001 Date: Sun, 26 Oct 2014 22:16:25 +0000 (+0100) Subject: Some more nasty bugs fixed in the lf t55xx manchester_decode method. X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/c6be64da095246620420500857f1f34994b769a8 Some more nasty bugs fixed in the lf t55xx manchester_decode method. ADD: a little function to see if GraphBuffer is not used. --- diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c index 0449e34a..1ce937d9 100644 --- a/client/cmdlfem4x.c +++ b/client/cmdlfem4x.c @@ -22,6 +22,7 @@ #include "util.h" #include "data.h" #define LF_TRACE_BUFF_SIZE 12000 +#define LF_BITSSTREAM_LEN 1000 char *global_em410xId; @@ -530,9 +531,9 @@ int CmdReadWord(const char *Cmd) } GraphTraceLen = LF_TRACE_BUFF_SIZE; - uint8_t bits[1000] = {0x00}; + uint8_t bits[LF_BITSSTREAM_LEN] = {0x00}; uint8_t * bitstream = bits; - manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); + manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream,LF_BITSSTREAM_LEN); RepaintGraphWindow(); return 0; } @@ -570,10 +571,9 @@ int CmdReadWordPWD(const char *Cmd) } GraphTraceLen = LF_TRACE_BUFF_SIZE; - uint8_t bits[1000] = {0x00}; - uint8_t * bitstream = bits; - - manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); + uint8_t bits[LF_BITSSTREAM_LEN] = {0x00}; + uint8_t * bitstream = bits; + manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN); RepaintGraphWindow(); return 0; } diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c index 31261a4f..09ba1ee7 100644 --- a/client/cmdlft55xx.c +++ b/client/cmdlft55xx.c @@ -23,15 +23,16 @@ #define LF_TRACE_BUFF_SIZE 12000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..) +#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits = static int CmdHelp(const char *Cmd); int CmdReadBlk(const char *Cmd) { - int Block = -1; - sscanf(Cmd, "%d", &Block); + int block = -1; + sscanf(Cmd, "%d", &block); - if ((Block > 7) | (Block < 0)) { + if ((block > 7) | (block < 0)) { PrintAndLog("Block must be between 0 and 7"); return 1; } @@ -55,7 +56,7 @@ int CmdReadBlk(const char *Cmd) // } // GraphTraceLen = LF_TRACE_BUFF_SIZE; CmdSamples("12000"); - ManchesterDemod(Block); + ManchesterDemod(block); // RepaintGraphWindow(); return 0; } @@ -175,10 +176,10 @@ int CmdReadTrace(const char *Cmd) GraphTraceLen = LF_TRACE_BUFF_SIZE; } - uint8_t bits[1000] = {0x00}; + uint8_t bits[LF_BITSSTREAM_LEN] = {0x00}; uint8_t * bitstream = bits; - manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); + manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN); RepaintGraphWindow(); uint8_t si = 5; @@ -253,10 +254,10 @@ int CmdInfo(const char *Cmd){ CmdReadBlk("0"); } - uint8_t bits[1000] = {0x00}; + uint8_t bits[LF_BITSSTREAM_LEN] = {0x00}; uint8_t * bitstream = bits; - manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); + manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN); uint8_t si = 5; uint32_t bl0 = PackBits(si, 32, bitstream); @@ -324,7 +325,7 @@ int CmdDump(const char *Cmd){ for ( int i = 0; i <8; ++i){ memset(s,0,sizeof(s)); if ( hasPwd ) { - sprintf(s,"%d %s", i, sprint_hex(pwd,4)); + sprintf(s,"%d %02x%02x%02x%02x", i, pwd[0],pwd[1],pwd[2],pwd[3]); CmdReadBlkPWD(s); } else { sprintf(s,"%d", i); @@ -335,6 +336,9 @@ int CmdDump(const char *Cmd){ } int CmdIceFsk(const char *Cmd){ + + if (!HasGraphData()) return 0; + iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE); RepaintGraphWindow(); return 0; @@ -343,16 +347,17 @@ int CmdIceManchester(const char *Cmd){ ManchesterDemod( -1); return 0; } -int ManchesterDemod(int block){ +int ManchesterDemod(int blockNum){ - int blockNum = -1; + if (!HasGraphData()) return 0; + uint8_t sizebyte = 32; uint8_t offset = 5; uint32_t blockData; - uint8_t bits[1000] = {0x00}; + uint8_t bits[LF_BITSSTREAM_LEN] = {0x00}; uint8_t * bitstream = bits; - manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); + manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN); blockData = PackBits(offset, sizebyte, bitstream); if ( blockNum < 0) diff --git a/client/cmdmain.c b/client/cmdmain.c index bf69c5ad..b35ba63c 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -51,9 +51,9 @@ static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help. Use ' help' for details of a particular command."}, {"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"}, - {"hf", CmdHF, 1, "{ HF commands... }"}, + {"hf", CmdHF, 1, "{ High Frequency commands... }"}, {"hw", CmdHW, 1, "{ Hardware commands... }"}, - {"lf", CmdLF, 1, "{ LF commands... }"}, + {"lf", CmdLF, 1, "{ Low Frequency commands... }"}, {"script", CmdScript, 1,"{ Scripting commands }"}, {"quit", CmdQuit, 1, "Exit program"}, {"exit", CmdQuit, 1, "Exit program"}, diff --git a/client/graph.c b/client/graph.c index 541e68f3..8974f4c3 100644 --- a/client/graph.c +++ b/client/graph.c @@ -9,6 +9,7 @@ //----------------------------------------------------------------------------- #include +#include #include #include "ui.h" #include "graph.h" @@ -93,3 +94,15 @@ int GetClock(const char *str, int peak, int verbose) return clock; } + + +/* A simple test to see if there is any data inside Graphbuffer. +*/ +bool HasGraphData(){ + + if ( GraphTraceLen <= 0) { + PrintAndLog("No data available, try reading something first"); + return false; + } + return true; +} \ No newline at end of file diff --git a/client/graph.h b/client/graph.h index cbe81161..ce803c82 100644 --- a/client/graph.h +++ b/client/graph.h @@ -15,9 +15,9 @@ void AppendGraph(int redraw, int clock, int bit); int ClearGraph(int redraw); int DetectClock(int peak); int GetClock(const char *str, int peak, int verbose); +bool HasGraphData(); #define MAX_GRAPH_TRACE_LEN (1024*128) extern int GraphBuffer[MAX_GRAPH_TRACE_LEN]; extern int GraphTraceLen; - #endif diff --git a/client/ui.c b/client/ui.c index 966ab2ca..816bff44 100644 --- a/client/ui.c +++ b/client/ui.c @@ -95,14 +95,14 @@ void SetLogFilename(char *fn) logfilename = fn; } -int manchester_decode( int * data, const size_t len, uint8_t * dataout){ +int manchester_decode( int * data, const size_t len, uint8_t * dataout, size_t dataoutlen){ int bitlength = 0; int i, clock, high, low, startindex; low = startindex = 0; high = 1; - uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * len); - memset(bitStream, 0x00, len); + uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * dataoutlen); + memset(bitStream, 0x00, dataoutlen); /* Detect high and lows */ for (i = 0; i < len; i++) { @@ -116,12 +116,12 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){ clock = GetT55x7Clock( data, len, high ); startindex = DetectFirstTransition(data, len, high); - PrintAndLog(" Clock : %d", clock); + //PrintAndLog(" Clock : %d", clock); if (high != 1) - bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex); + bitlength = ManchesterConvertFrom255(data, len, bitStream, dataoutlen, high, low, clock, startindex); else - bitlength= ManchesterConvertFrom1(data, len, bitStream, clock, startindex); + bitlength= ManchesterConvertFrom1(data, len, bitStream, dataoutlen, clock, startindex); memcpy(dataout, bitStream, bitlength); free(bitStream); @@ -192,7 +192,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){ return i; } - int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex){ + int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int dataoutlen, int high, int low, int clock, int startIndex){ int i, j, z, hithigh, hitlow, bitIndex, startType; i = 0; @@ -205,7 +205,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){ int firstST = 0; // i = clock frame of data - for (; i < (int)(len / clock); i++) + for (; i < (int)(len/clock); i++) { hithigh = 0; hitlow = 0; @@ -261,11 +261,13 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){ if ( firstST == 4) break; + if ( bitIndex >= dataoutlen-1 ) + break; } return bitIndex; } - int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex){ + int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout,int dataoutlen, int clock, int startIndex){ PrintAndLog(" Path B"); diff --git a/client/ui.h b/client/ui.h index 8d16e059..6a45fcfd 100644 --- a/client/ui.h +++ b/client/ui.h @@ -27,13 +27,13 @@ extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault; extern int offline; extern int flushAfterWrite; //buzzy -int manchester_decode( int * data, const size_t len, uint8_t * dataout); +int manchester_decode( int * data, const size_t len, uint8_t * dataout, size_t dataoutlen); int GetT55x7Clock( const int * data, const size_t len, int high ); int DetectFirstTransition(const int * data, const size_t len, int low); void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize); void ManchesterDiffDecodedString( const uint8_t *bitStream, size_t len, uint8_t invert ); -int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex); -int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex); +int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout,int dataoutlen, int high, int low, int clock, int startIndex); +int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int dataoutlen, int clock, int startIndex); void iceFsk2(int * data, const size_t len); void iceFsk3(int * data, const size_t len); #endif