mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-12 08:16:09 -07:00
add: save and load options in hf list (#577)
This commit is contained in:
parent
53c7a7053d
commit
3bcc4d77e1
1 changed files with 133 additions and 48 deletions
125
client/cmdhf.c
125
client/cmdhf.c
|
@ -355,21 +355,44 @@ int CmdHFList(const char *Cmd)
|
||||||
{
|
{
|
||||||
bool showWaitCycles = false;
|
bool showWaitCycles = false;
|
||||||
bool markCRCBytes = false;
|
bool markCRCBytes = false;
|
||||||
|
bool loadFromFile = false;
|
||||||
|
bool saveToFile = false;
|
||||||
|
char param1 = '\0';
|
||||||
|
char param2 = '\0';
|
||||||
|
char param3 = '\0';
|
||||||
char type[40] = {0};
|
char type[40] = {0};
|
||||||
int tlen = param_getstr(Cmd,0,type, sizeof(type));
|
char filename[FILE_PATH_SIZE];
|
||||||
char param1 = param_getchar(Cmd, 1);
|
|
||||||
char param2 = param_getchar(Cmd, 2);
|
|
||||||
bool errors = false;
|
|
||||||
uint8_t protocol = 0;
|
uint8_t protocol = 0;
|
||||||
//Validate params
|
|
||||||
|
// parse command line
|
||||||
|
int tlen = param_getstr(Cmd, 0, type, sizeof(type));
|
||||||
|
if (param_getlength(Cmd, 1) == 1) {
|
||||||
|
param1 = param_getchar(Cmd, 1);
|
||||||
|
} else {
|
||||||
|
param_getstr(Cmd, 1, filename, sizeof(filename));
|
||||||
|
}
|
||||||
|
if (param_getlength(Cmd, 2) == 1) {
|
||||||
|
param2 = param_getchar(Cmd, 2);
|
||||||
|
} else if (strlen(filename) == 0) {
|
||||||
|
param_getstr(Cmd, 2, filename, sizeof(filename));
|
||||||
|
}
|
||||||
|
if (param_getlength(Cmd, 3) == 1) {
|
||||||
|
param3 = param_getchar(Cmd, 3);
|
||||||
|
} else if (strlen(filename) == 0) {
|
||||||
|
param_getstr(Cmd, 3, filename, sizeof(filename));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate param1
|
||||||
|
bool errors = false;
|
||||||
|
|
||||||
if(tlen == 0) {
|
if(tlen == 0) {
|
||||||
errors = true;
|
errors = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(param1 == 'h'
|
if(param1 == 'h'
|
||||||
|| (param1 != 0 && param1 != 'f' && param1 != 'c')
|
|| (param1 != 0 && param1 != 'f' && param1 != 'c' && param1 != 'l')
|
||||||
|| (param2 != 0 && param2 != 'f' && param2 != 'c')) {
|
|| (param2 != 0 && param2 != 'f' && param2 != 'c' && param2 != 'l')
|
||||||
|
|| (param3 != 0 && param3 != 'f' && param3 != 'c' && param3 != 'l')) {
|
||||||
errors = true;
|
errors = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,16 +409,41 @@ int CmdHFList(const char *Cmd)
|
||||||
protocol = TOPAZ;
|
protocol = TOPAZ;
|
||||||
} else if(strcmp(type,"raw") == 0) {
|
} else if(strcmp(type,"raw") == 0) {
|
||||||
protocol = -1; //No crc, no annotations
|
protocol = -1; //No crc, no annotations
|
||||||
|
} else if (strcmp(type, "save") == 0) {
|
||||||
|
saveToFile = true;
|
||||||
} else {
|
} else {
|
||||||
errors = true;
|
errors = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (param1 == 'f' || param2 == 'f' || param3 == 'f') {
|
||||||
|
showWaitCycles = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param1 == 'c' || param2 == 'c' || param3 == 'c') {
|
||||||
|
markCRCBytes = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (param1 == 'l' || param2 == 'l' || param3 == 'l') {
|
||||||
|
loadFromFile = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((loadFromFile || saveToFile) && strlen(filename) == 0) {
|
||||||
|
errors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadFromFile && saveToFile) {
|
||||||
|
errors = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (errors) {
|
if (errors) {
|
||||||
PrintAndLog("List protocol data in trace buffer.");
|
PrintAndLog("List or save protocol data.");
|
||||||
PrintAndLog("Usage: hf list <protocol> [f][c]");
|
PrintAndLog("Usage: hf list <protocol> [f] [c] [l <filename>]");
|
||||||
|
PrintAndLog(" hf list save <filename>");
|
||||||
PrintAndLog(" f - show frame delay times as well");
|
PrintAndLog(" f - show frame delay times as well");
|
||||||
PrintAndLog(" c - mark CRC bytes");
|
PrintAndLog(" c - mark CRC bytes");
|
||||||
|
PrintAndLog(" l - load data from file instead of trace buffer");
|
||||||
|
PrintAndLog(" save - save data to file");
|
||||||
PrintAndLog("Supported <protocol> values:");
|
PrintAndLog("Supported <protocol> values:");
|
||||||
PrintAndLog(" raw - just show raw data without annotations");
|
PrintAndLog(" raw - just show raw data without annotations");
|
||||||
PrintAndLog(" 14a - interpret data as iso14443a communications");
|
PrintAndLog(" 14a - interpret data as iso14443a communications");
|
||||||
|
@ -406,27 +454,52 @@ int CmdHFList(const char *Cmd)
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
PrintAndLog("example: hf list 14a f");
|
PrintAndLog("example: hf list 14a f");
|
||||||
PrintAndLog("example: hf list iclass");
|
PrintAndLog("example: hf list iclass");
|
||||||
|
PrintAndLog("example: hf list save myCardTrace.trc");
|
||||||
|
PrintAndLog("example: hf list 14a l myCardTrace.trc");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (param1 == 'f' || param2 == 'f') {
|
|
||||||
showWaitCycles = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (param1 == 'c' || param2 == 'c') {
|
|
||||||
markCRCBytes = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t *trace;
|
uint8_t *trace;
|
||||||
uint16_t tracepos = 0;
|
uint32_t tracepos = 0;
|
||||||
trace = malloc(USB_CMD_DATA_SIZE);
|
uint32_t traceLen = 0;
|
||||||
|
|
||||||
|
if (loadFromFile) {
|
||||||
|
#define TRACE_CHUNK_SIZE (1<<16) // 64K to start with. Will be enough for BigBuf and some room for future extensions
|
||||||
|
FILE *tracefile = NULL;
|
||||||
|
size_t bytes_read;
|
||||||
|
trace = malloc(TRACE_CHUNK_SIZE);
|
||||||
|
if (trace == NULL) {
|
||||||
|
PrintAndLog("Cannot allocate memory for trace");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
if ((tracefile = fopen(filename,"rb")) == NULL) {
|
||||||
|
PrintAndLog("Could not open file %s", filename);
|
||||||
|
free(trace);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
while (!feof(tracefile)) {
|
||||||
|
bytes_read = fread(trace+traceLen, 1, TRACE_CHUNK_SIZE, tracefile);
|
||||||
|
traceLen += bytes_read;
|
||||||
|
if (!feof(tracefile)) {
|
||||||
|
uint8_t *p = realloc(trace, traceLen + TRACE_CHUNK_SIZE);
|
||||||
|
if (p == NULL) {
|
||||||
|
PrintAndLog("Cannot allocate memory for trace");
|
||||||
|
free(trace);
|
||||||
|
fclose(tracefile);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
trace = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(tracefile);
|
||||||
|
} else {
|
||||||
|
trace = malloc(USB_CMD_DATA_SIZE);
|
||||||
// Query for the size of the trace
|
// Query for the size of the trace
|
||||||
UsbCommand response;
|
UsbCommand response;
|
||||||
GetFromBigBuf(trace, USB_CMD_DATA_SIZE, 0);
|
GetFromBigBuf(trace, USB_CMD_DATA_SIZE, 0);
|
||||||
WaitForResponse(CMD_ACK, &response);
|
WaitForResponse(CMD_ACK, &response);
|
||||||
uint16_t traceLen = response.arg[2];
|
traceLen = response.arg[2];
|
||||||
if (traceLen > USB_CMD_DATA_SIZE) {
|
if (traceLen > USB_CMD_DATA_SIZE) {
|
||||||
uint8_t *p = realloc(trace, traceLen);
|
uint8_t *p = realloc(trace, traceLen);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
|
@ -438,7 +511,18 @@ int CmdHFList(const char *Cmd)
|
||||||
GetFromBigBuf(trace, traceLen, 0);
|
GetFromBigBuf(trace, traceLen, 0);
|
||||||
WaitForResponse(CMD_ACK, NULL);
|
WaitForResponse(CMD_ACK, NULL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (saveToFile) {
|
||||||
|
FILE *tracefile = NULL;
|
||||||
|
if ((tracefile = fopen(filename,"wb")) == NULL) {
|
||||||
|
PrintAndLog("Could not create file %s", filename);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fwrite(trace, 1, traceLen, tracefile);
|
||||||
|
PrintAndLog("Recorded Activity (TraceLen = %d bytes) written to file %s", traceLen, filename);
|
||||||
|
fclose(tracefile);
|
||||||
|
} else {
|
||||||
PrintAndLog("Recorded Activity (TraceLen = %d bytes)", traceLen);
|
PrintAndLog("Recorded Activity (TraceLen = %d bytes)", traceLen);
|
||||||
PrintAndLog("");
|
PrintAndLog("");
|
||||||
PrintAndLog("Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer");
|
PrintAndLog("Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer");
|
||||||
|
@ -453,6 +537,7 @@ int CmdHFList(const char *Cmd)
|
||||||
{
|
{
|
||||||
tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles, markCRCBytes);
|
tracepos = printTraceLine(tracepos, traceLen, trace, protocol, showWaitCycles, markCRCBytes);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
free(trace);
|
free(trace);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue