mirror of
				https://github.com/Proxmark/proxmark3.git
				synced 2025-11-01 00:56:00 +08:00 
			
		
		
		
	Fix printdemodbuffer length tests + add length...
parameter increase askdemod MaxBits fix util.c sprint_bin_break and increase buffer size (had memory overflow possible before)
This commit is contained in:
		
							parent
							
								
									51923aca85
								
							
						
					
					
						commit
						ace26dbdfd
					
				
					 3 changed files with 35 additions and 15 deletions
				
			
		|  | @ -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, &); | ||||
| 	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"},   | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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) { | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue