mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-02-24 15:44:47 +08:00
More patches from en4rab to the hexsamples, plus patches to legicsave and legicdecode (also by en4rab).
This commit is contained in:
parent
1c611bbd26
commit
4961e292aa
2 changed files with 62 additions and 81 deletions
|
@ -393,46 +393,43 @@ int CmdGrid(const char *Cmd)
|
|||
|
||||
int CmdHexsamples(const char *Cmd)
|
||||
{
|
||||
int n;
|
||||
int i, j;
|
||||
int requested = 0;
|
||||
int offset = 0;
|
||||
char string_buf[25];
|
||||
char* string_ptr = string_buf;
|
||||
uint8_t got[40000];
|
||||
|
||||
sscanf(Cmd, "%i %i", &requested, &offset);
|
||||
|
||||
int delivered = 0;
|
||||
uint8_t got[40000];
|
||||
|
||||
/* round up to nearest 8 bytes so the printed data is all valid */
|
||||
if (requested < 8) {
|
||||
/* if no args send something */
|
||||
if (requested == 0) {
|
||||
requested = 8;
|
||||
}
|
||||
if (requested % 8 != 0) {
|
||||
int remainder = requested % 8;
|
||||
requested = requested + 8 - remainder;
|
||||
}
|
||||
if (offset + requested > sizeof(got)) {
|
||||
PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 40000");
|
||||
return 0;
|
||||
} else {
|
||||
n = requested;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
GetFromBigBuf(got,n,offset);
|
||||
GetFromBigBuf(got,requested,offset);
|
||||
WaitForResponse(CMD_ACK,NULL);
|
||||
|
||||
for (int j = 0; j < n; j += 8) {
|
||||
PrintAndLog("%02x %02x %02x %02x %02x %02x %02x %02x",
|
||||
sample_buf[j+0],
|
||||
sample_buf[j+1],
|
||||
sample_buf[j+2],
|
||||
sample_buf[j+3],
|
||||
sample_buf[j+4],
|
||||
sample_buf[j+5],
|
||||
sample_buf[j+6],
|
||||
sample_buf[j+7]
|
||||
);
|
||||
delivered += 8;
|
||||
if (delivered >= requested)
|
||||
break;
|
||||
i = 0;
|
||||
for (j = 0; j < requested; j++) {
|
||||
i++;
|
||||
string_ptr += sprintf(string_ptr, "%02x ", got[j]);
|
||||
if (i == 8) {
|
||||
*(string_ptr - 1) = '\0'; // remove the trailing space
|
||||
PrintAndLog("%s", string_buf);
|
||||
string_buf[0] = '\0';
|
||||
string_ptr = string_buf;
|
||||
i = 0;
|
||||
}
|
||||
if (j == requested - 1 && string_buf[0] != '\0') { // print any remaining bytes
|
||||
*(string_ptr - 1) = '\0';
|
||||
PrintAndLog("%s", string_buf);
|
||||
string_buf[0] = '\0';
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -52,35 +52,20 @@ int CmdHelp(const char *Cmd)
|
|||
*/
|
||||
int CmdLegicDecode(const char *Cmd)
|
||||
{
|
||||
int h, i, j, k, n;
|
||||
int i, j, k, n;
|
||||
int segment_len = 0;
|
||||
int segment_flag = 0;
|
||||
int stamp_len = 0;
|
||||
int crc = 0;
|
||||
int wrp = 0;
|
||||
int wrc = 0;
|
||||
int data_buf[1032]; // receiver buffer
|
||||
uint8_t data_buf[1024]; // receiver buffer
|
||||
char out_string[3076]; // just use big buffer - bad practice
|
||||
char token_type[4];
|
||||
int delivered = 0;
|
||||
|
||||
h = 0;
|
||||
|
||||
// copy data from proxmark into buffer
|
||||
for (i = 0; i < 256; i += 12, h += 48) {
|
||||
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};
|
||||
SendCommand(&c);
|
||||
WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL);
|
||||
|
||||
for (j = 0; j < 48; j += 8) {
|
||||
for (k = 0; k < 8; k++) {
|
||||
data_buf[h+j+k] = sample_buf[j+k];
|
||||
}
|
||||
delivered += 8;
|
||||
if (delivered >= 1024)
|
||||
break;
|
||||
}
|
||||
}
|
||||
GetFromBigBuf(data_buf,sizeof(data_buf),0);
|
||||
WaitForResponse(CMD_ACK,NULL);
|
||||
|
||||
// Output CDF System area (9 bytes) plus remaining header area (12 bytes)
|
||||
|
||||
|
@ -264,51 +249,50 @@ int CmdLegicLoad(const char *Cmd)
|
|||
|
||||
int CmdLegicSave(const char *Cmd)
|
||||
{
|
||||
int n;
|
||||
int requested = 1024;
|
||||
int offset = 0;
|
||||
int delivered = 0;
|
||||
char filename[1024];
|
||||
uint8_t got[1024];
|
||||
|
||||
sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
|
||||
if (offset % 4 != 0) {
|
||||
PrintAndLog("Offset must be a multiple of 4");
|
||||
|
||||
/* If no length given save entire legic read buffer */
|
||||
/* round up to nearest 8 bytes so the saved data can be used with legicload */
|
||||
if (requested == 0) {
|
||||
requested = 1024;
|
||||
}
|
||||
if (requested % 8 != 0) {
|
||||
int remainder = requested % 8;
|
||||
requested = requested + 8 - remainder;
|
||||
}
|
||||
|
||||
if (offset + requested > sizeof(got)) {
|
||||
PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 1024");
|
||||
return 0;
|
||||
}
|
||||
offset = offset/4;
|
||||
|
||||
int delivered = 0;
|
||||
|
||||
if (requested == 0) {
|
||||
n = 12;
|
||||
requested = 12;
|
||||
} else {
|
||||
n = requested/4;
|
||||
}
|
||||
|
||||
|
||||
FILE *f = fopen(filename, "w");
|
||||
if(!f) {
|
||||
PrintAndLog("couldn't open '%s'", Cmd+1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int i = offset; i < n+offset; i += 12) {
|
||||
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};
|
||||
SendCommand(&c);
|
||||
WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL);
|
||||
for (int j = 0; j < 48; j += 8) {
|
||||
fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
sample_buf[j+0],
|
||||
sample_buf[j+1],
|
||||
sample_buf[j+2],
|
||||
sample_buf[j+3],
|
||||
sample_buf[j+4],
|
||||
sample_buf[j+5],
|
||||
sample_buf[j+6],
|
||||
sample_buf[j+7]
|
||||
);
|
||||
delivered += 8;
|
||||
if (delivered >= requested)
|
||||
break;
|
||||
}
|
||||
GetFromBigBuf(got,requested,offset);
|
||||
WaitForResponse(CMD_ACK,NULL);
|
||||
|
||||
for (int j = 0; j < requested; j += 8) {
|
||||
fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
got[j+0],
|
||||
got[j+1],
|
||||
got[j+2],
|
||||
got[j+3],
|
||||
got[j+4],
|
||||
got[j+5],
|
||||
got[j+6],
|
||||
got[j+7]
|
||||
);
|
||||
delivered += 8;
|
||||
if (delivered >= requested)
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue