]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Fix printdemodbuffer length tests + add length...
authormarshmellow42 <marshmellowrf@gmail.com>
Tue, 8 Dec 2015 02:18:30 +0000 (21:18 -0500)
committermarshmellow42 <marshmellowrf@gmail.com>
Tue, 8 Dec 2015 02:18:30 +0000 (21:18 -0500)
parameter
increase askdemod MaxBits
fix util.c sprint_bin_break and increase buffer size (had memory
overflow possible before)

client/cmddata.c
client/util.c
common/lfdemod.c

index 30546f1190da6fbb2120af5529d3dd4eacc92e32..e8b77d1ddedfd578e565e610b60220990ec68a03 100644 (file)
@@ -58,11 +58,12 @@ int CmdSetDebugMode(const char *Cmd)
 }
 
 int usage_data_printdemodbuf(){
-               PrintAndLog("Usage: data printdemodbuffer x o <offset>");
+               PrintAndLog("Usage: data printdemodbuffer x o <offset> l <length>");
                PrintAndLog("Options:        ");
                PrintAndLog("       h          This help");
                PrintAndLog("       x          output in hex (omit for binary output)");
                PrintAndLog("       o <offset> enter offset in # of bits");
+               PrintAndLog("       l <length> enter length to print in # of bits or hex characters respectively");
                return 0;       
 }
 
@@ -87,7 +88,8 @@ int CmdPrintDemodBuff(const char *Cmd)
        char hex[512]={0x00};
        bool hexMode = false;
        bool errors = false;
-       uint8_t offset = 0;
+       uint32_t offset = 0; //could be size_t but no param_get16...
+       uint32_t length = 512;
        char cmdp = 0;
        while(param_getchar(Cmd, cmdp) != 0x00)
        {
@@ -103,10 +105,16 @@ int CmdPrintDemodBuff(const char *Cmd)
                        break;
                case 'o':
                case 'O':
-                       offset = param_get8(Cmd, cmdp+1);
+                       offset = param_get32ex(Cmd, cmdp+1, 0, 10);
                        if (!offset) errors = true;
                        cmdp += 2;
                        break;
+               case 'l':
+               case 'L':
+                       length = param_get32ex(Cmd, cmdp+1, 512, 10);
+                       if (!length) errors = true;
+                       cmdp += 2;
+                       break;
                default:
                        PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
                        errors = true;
@@ -116,11 +124,12 @@ int CmdPrintDemodBuff(const char *Cmd)
        }
        //Validations
        if(errors) return usage_data_printdemodbuf();
-
-       int numBits = (DemodBufferLen-offset) & 0x7FC; //make sure we don't exceed our string
+       length = (length > (DemodBufferLen-offset)) ? DemodBufferLen-offset : length; 
+       int numBits = (length) & 0x00FFC; //make sure we don't exceed our string
 
        if (hexMode){
                char *buf = (char *) (DemodBuffer + offset);
+               numBits = (numBits > sizeof(hex)) ? sizeof(hex) : numBits;
                numBits = binarraytohex(hex, buf, numBits);
                if (numBits==0) return 0;
                PrintAndLog("DemodBuffer: %s",hex);             
@@ -313,7 +322,7 @@ int ASKDemod(const char *Cmd, bool verbose, bool emSearch, uint8_t askType)
        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);
-       if (!maxLen) maxLen = 512*64;
+       if (!maxLen) maxLen = BIGBUF_SIZE;
        if (invert != 0 && invert != 1) {
                PrintAndLog("Invalid argument: %s", Cmd);
                return 0;
@@ -2383,7 +2392,7 @@ static command_t CommandTable[] =
        {"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)"},
-       {"printdemodbuffer",CmdPrintDemodBuff,  1, "[x] [o] <offset> -- print the data in the DemodBuffer - 'x' for hex output"},
+       {"printdemodbuffer",CmdPrintDemodBuff,  1, "[x] [o] <offset> [l] <length> -- print the data in the DemodBuffer - 'x' for hex output"},
        {"pskindalademod",  CmdIndalaDecode,    1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"},
        {"psknexwatchdemod",CmdPSKNexWatch,     1, "Demodulate a NexWatch tag (nexkey, quadrakey) (PSK1) from GraphBuffer"},
        {"rawdemod",        CmdRawDemod,        1, "[modulation] ... <options> -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"},  
index 056b5676016bdbbd95ed8dec5497ec7967f0a58c..35af3d668e8edad7af2364b38b8b67358306b753 100644 (file)
@@ -9,11 +9,13 @@
 //-----------------------------------------------------------------------------
 
 #include "util.h"
+#define MAX_BIN_BREAK_LENGTH   (3072+384+1)
 
 #ifndef _WIN32
 #include <termios.h>
 #include <sys/ioctl.h> 
 
+
 int ukbhit(void)
 {
   int cnt = 0;
@@ -123,16 +125,25 @@ char *sprint_hex(const uint8_t *data, const size_t len) {
 }
 
 char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) {
-       
-       int maxLen = ( len > 1020) ? 1020 : len;
-       static char buf[1024];
-       memset(buf, 0x00, 1024);
+       // make sure we don't go beyond our char array memory
+       int max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks);
+       static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits
+       //clear memory
+       memset(buf, 0x00, sizeof(buf));
        char *tmp = buf;
 
-       for (size_t i=0; i < maxLen; ++i){
-               sprintf(tmp++, "%u", data[i]);
-               if (breaks > 0 && !((i+1) % breaks))
+       size_t in_index = 0;
+       // loop through the out_index to make sure we don't go too far
+       for (size_t out_index=0; out_index < max_len; out_index++) {
+               // set character
+               sprintf(tmp++, "%u", data[in_index]);
+               // check if a line break is needed
+               if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) {
+                       // increment and print line break
+                       out_index++;
                        sprintf(tmp++, "%s","\n");
+               }
+               in_index++;
        }
 
        return buf;
index 1965a0aea8c0b76ab6ac61c363479d8aa81e9ea1..982a724a018a02fca792b15636098ea57a8384ea 100644 (file)
@@ -300,7 +300,7 @@ int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr
        uint8_t midBit = 0;
        uint8_t tol = 0;  //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave
        if (*clk <= 32) tol = 1;    //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely
-       size_t MaxBits = 1024;
+       size_t MaxBits = 3072;
        lastBit = start - *clk;
 
        for (i = start; i < *size; ++i) {
Impressum, Datenschutz