mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-09-20 15:26:13 +08:00
ADD: @marshmello42 's fixes for low frequency demodulation lengths greater the 512bits.
This commit is contained in:
parent
0a886a1d1b
commit
bf32dd923f
|
@ -34,6 +34,7 @@ of stream transmissions (marshmellow)
|
||||||
- Added option c to 'hf list' (mark CRC bytes) (piwi)
|
- Added option c to 'hf list' (mark CRC bytes) (piwi)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- Added `[l] <length>` option to data printdemodbuffer
|
||||||
- Adjusted lf awid clone to optionally clone to Q5 tags
|
- Adjusted lf awid clone to optionally clone to Q5 tags
|
||||||
- Adjusted lf t55xx detect to find Q5 tags (t5555) instead of just t55x7
|
- Adjusted lf t55xx detect to find Q5 tags (t5555) instead of just t55x7
|
||||||
- Adjusted all lf NRZ demods - works more acurately and consistantly (as long as you have strong signal)
|
- Adjusted all lf NRZ demods - works more acurately and consistantly (as long as you have strong signal)
|
||||||
|
|
|
@ -58,11 +58,12 @@ int CmdSetDebugMode(const char *Cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
int usage_data_printdemodbuf(){
|
int usage_data_printdemodbuf(){
|
||||||
PrintAndLog("Usage: data printdemodbuffer x o <offset>");
|
PrintAndLog("Usage: data printdemodbuffer x o <offset> l <length>");
|
||||||
PrintAndLog("Options:");
|
PrintAndLog("Options:");
|
||||||
PrintAndLog(" h This help");
|
PrintAndLog(" h This help");
|
||||||
PrintAndLog(" x output in hex (omit for binary output)");
|
PrintAndLog(" x output in hex (omit for binary output)");
|
||||||
PrintAndLog(" o <offset> enter offset in # of bits");
|
PrintAndLog(" o <offset> enter offset in # of bits");
|
||||||
|
PrintAndLog(" l <length> enter length to print in # of bits or hex characters respectively");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +88,8 @@ int CmdPrintDemodBuff(const char *Cmd)
|
||||||
char hex[512]={0x00};
|
char hex[512]={0x00};
|
||||||
bool hexMode = false;
|
bool hexMode = false;
|
||||||
bool errors = 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;
|
char cmdp = 0;
|
||||||
while(param_getchar(Cmd, cmdp) != 0x00)
|
while(param_getchar(Cmd, cmdp) != 0x00)
|
||||||
{
|
{
|
||||||
|
@ -103,10 +105,16 @@ int CmdPrintDemodBuff(const char *Cmd)
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
case 'O':
|
case 'O':
|
||||||
offset = param_get8(Cmd, cmdp+1);
|
offset = param_get32ex(Cmd, cmdp+1, 0, 10);
|
||||||
if (!offset) errors = true;
|
if (!offset) errors = true;
|
||||||
cmdp += 2;
|
cmdp += 2;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
case 'L':
|
||||||
|
length = param_get32ex(Cmd, cmdp+1, 512, 10);
|
||||||
|
if (!length) errors = true;
|
||||||
|
cmdp += 2;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
|
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
|
||||||
errors = true;
|
errors = true;
|
||||||
|
@ -116,11 +124,12 @@ int CmdPrintDemodBuff(const char *Cmd)
|
||||||
}
|
}
|
||||||
//Validations
|
//Validations
|
||||||
if(errors) return usage_data_printdemodbuf();
|
if(errors) return usage_data_printdemodbuf();
|
||||||
|
length = (length > (DemodBufferLen-offset)) ? DemodBufferLen-offset : length;
|
||||||
int numBits = (DemodBufferLen-offset) & 0x7FC; //make sure we don't exceed our string
|
int numBits = (length) & 0x00FFC; //make sure we don't exceed our string
|
||||||
|
|
||||||
if (hexMode){
|
if (hexMode){
|
||||||
char *buf = (char *) (DemodBuffer + offset);
|
char *buf = (char *) (DemodBuffer + offset);
|
||||||
|
numBits = (numBits > sizeof(hex)) ? sizeof(hex) : numBits;
|
||||||
numBits = binarraytohex(hex, buf, numBits);
|
numBits = binarraytohex(hex, buf, numBits);
|
||||||
if (numBits==0) return 0;
|
if (numBits==0) return 0;
|
||||||
PrintAndLog("DemodBuffer: %s",hex);
|
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);
|
char amp = param_getchar(Cmd, 0);
|
||||||
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
|
||||||
sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &);
|
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) {
|
if (invert != 0 && invert != 1) {
|
||||||
PrintAndLog("Invalid argument: %s", Cmd);
|
PrintAndLog("Invalid argument: %s", Cmd);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -955,21 +964,20 @@ int FSKrawDemod(const char *Cmd, bool verbose)
|
||||||
if (BitLen==0) return 0;
|
if (BitLen==0) return 0;
|
||||||
//get field clock lengths
|
//get field clock lengths
|
||||||
uint16_t fcs=0;
|
uint16_t fcs=0;
|
||||||
if (fchigh==0 || fclow == 0){
|
if (!fchigh || !fclow) {
|
||||||
fcs = countFC(BitStream, BitLen, 1);
|
fcs = countFC(BitStream, BitLen, 1);
|
||||||
if (fcs==0){
|
if (!fcs) {
|
||||||
fchigh = 10;
|
fchigh = 10;
|
||||||
fclow = 8;
|
fclow = 8;
|
||||||
} else {
|
} else {
|
||||||
fchigh = (fcs >> 8) & 0xFF;
|
fchigh = (fcs >> 8) & 0x00FF;
|
||||||
fclow = fcs & 0xFF;
|
fclow = fcs & 0x00FF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//get bit clock length
|
//get bit clock length
|
||||||
if (rfLen == 0){
|
if (!rfLen){
|
||||||
rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow);
|
rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow);
|
||||||
if (rfLen == 0) rfLen = 50;
|
if (!rfLen) rfLen = 50;
|
||||||
}
|
}
|
||||||
int size = fskdemod(BitStream, BitLen, rfLen, invert, fchigh, fclow);
|
int size = fskdemod(BitStream, BitLen, rfLen, invert, fchigh, fclow);
|
||||||
if (size > 0){
|
if (size > 0){
|
||||||
|
@ -977,10 +985,11 @@ int FSKrawDemod(const char *Cmd, bool verbose)
|
||||||
|
|
||||||
// Now output the bitstream to the scrollback by line of 16 bits
|
// Now output the bitstream to the scrollback by line of 16 bits
|
||||||
if (verbose || g_debugMode) {
|
if (verbose || g_debugMode) {
|
||||||
PrintAndLog("\nUsing Clock:%d, invert:%d, fchigh:%d, fclow:%u", rfLen, invert, fchigh, fclow);
|
PrintAndLog("\nUsing Clock:%u, invert:%u, fchigh:%u, fclow:%u", rfLen, invert, fchigh, fclow);
|
||||||
PrintAndLog("%s decoded bitstream:", GetFSKType(fchigh, fclow, invert));
|
PrintAndLog("%s decoded bitstream:", GetFSKType(fchigh, fclow, invert));
|
||||||
printDemodBuff();
|
printDemodBuff();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
if (g_debugMode) PrintAndLog("no FSK data found");
|
if (g_debugMode) PrintAndLog("no FSK data found");
|
||||||
|
@ -2392,7 +2401,7 @@ static command_t CommandTable[] =
|
||||||
{"manrawdecode", Cmdmandecoderaw, 1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"},
|
{"manrawdecode", Cmdmandecoderaw, 1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"},
|
||||||
{"norm", CmdNorm, 1, "Normalize max/min to +/-128"},
|
{"norm", CmdNorm, 1, "Normalize max/min to +/-128"},
|
||||||
{"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"},
|
{"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)"},
|
{"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"},
|
{"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"},
|
{"rawdemod", CmdRawDemod, 1, "[modulation] ... <options> -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"},
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#define MAX_BIN_BREAK_LENGTH (3072+384+1)
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
@ -122,17 +123,26 @@ 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) {
|
char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) {
|
||||||
|
// make sure we don't go beyond our char array memory
|
||||||
int maxLen = ( len > 1020) ? 1020 : len;
|
int max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks);
|
||||||
static char buf[1024];
|
static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits
|
||||||
memset(buf, 0x00, 1024);
|
//clear memory
|
||||||
|
memset(buf, 0x00, sizeof(buf));
|
||||||
char *tmp = buf;
|
char *tmp = buf;
|
||||||
|
|
||||||
for (size_t i=0; i < maxLen; ++i){
|
size_t in_index = 0;
|
||||||
sprintf(tmp++, "%u", data[i]);
|
// loop through the out_index to make sure we don't go too far
|
||||||
if (breaks > 0 && !((i+1) % breaks))
|
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");
|
sprintf(tmp++, "%s","\n");
|
||||||
}
|
}
|
||||||
|
in_index++;
|
||||||
|
}
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -171,7 +181,8 @@ void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest) {
|
||||||
// hh,gg,ff,ee,dd,cc,bb,aa, pp,oo,nn,mm,ll,kk,jj,ii
|
// hh,gg,ff,ee,dd,cc,bb,aa, pp,oo,nn,mm,ll,kk,jj,ii
|
||||||
// up to 64 bytes or 512 bits
|
// up to 64 bytes or 512 bits
|
||||||
uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){
|
uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){
|
||||||
static uint8_t buf[64];
|
//static uint8_t buf[64];
|
||||||
|
uint8_t buf[64];
|
||||||
memset(buf, 0x00, 64);
|
memset(buf, 0x00, 64);
|
||||||
uint8_t *tmp = buf;
|
uint8_t *tmp = buf;
|
||||||
for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){
|
for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){
|
||||||
|
|
|
@ -300,7 +300,7 @@ int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr
|
||||||
uint8_t midBit = 0;
|
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
|
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
|
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;
|
lastBit = start - *clk;
|
||||||
|
|
||||||
for (i = start; i < *size; ++i) {
|
for (i = start; i < *size; ++i) {
|
||||||
|
|
Loading…
Reference in a new issue