mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 13:53:55 -07: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 CmdHexsamples(const char *Cmd)
|
||||||
{
|
{
|
||||||
int n;
|
int i, j;
|
||||||
int requested = 0;
|
int requested = 0;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
sscanf(Cmd, "%i %i", &requested, &offset);
|
char string_buf[25];
|
||||||
|
char* string_ptr = string_buf;
|
||||||
int delivered = 0;
|
|
||||||
uint8_t got[40000];
|
uint8_t got[40000];
|
||||||
|
|
||||||
/* round up to nearest 8 bytes so the printed data is all valid */
|
sscanf(Cmd, "%i %i", &requested, &offset);
|
||||||
if (requested < 8) {
|
|
||||||
|
/* if no args send something */
|
||||||
|
if (requested == 0) {
|
||||||
requested = 8;
|
requested = 8;
|
||||||
}
|
}
|
||||||
if (requested % 8 != 0) {
|
|
||||||
int remainder = requested % 8;
|
|
||||||
requested = requested + 8 - remainder;
|
|
||||||
}
|
|
||||||
if (offset + requested > sizeof(got)) {
|
if (offset + requested > sizeof(got)) {
|
||||||
PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 40000");
|
PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 40000");
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
|
||||||
n = requested;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GetFromBigBuf(got,n,offset);
|
GetFromBigBuf(got,requested,offset);
|
||||||
WaitForResponse(CMD_ACK,NULL);
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
|
|
||||||
for (int j = 0; j < n; j += 8) {
|
i = 0;
|
||||||
PrintAndLog("%02x %02x %02x %02x %02x %02x %02x %02x",
|
for (j = 0; j < requested; j++) {
|
||||||
sample_buf[j+0],
|
i++;
|
||||||
sample_buf[j+1],
|
string_ptr += sprintf(string_ptr, "%02x ", got[j]);
|
||||||
sample_buf[j+2],
|
if (i == 8) {
|
||||||
sample_buf[j+3],
|
*(string_ptr - 1) = '\0'; // remove the trailing space
|
||||||
sample_buf[j+4],
|
PrintAndLog("%s", string_buf);
|
||||||
sample_buf[j+5],
|
string_buf[0] = '\0';
|
||||||
sample_buf[j+6],
|
string_ptr = string_buf;
|
||||||
sample_buf[j+7]
|
i = 0;
|
||||||
);
|
}
|
||||||
delivered += 8;
|
if (j == requested - 1 && string_buf[0] != '\0') { // print any remaining bytes
|
||||||
if (delivered >= requested)
|
*(string_ptr - 1) = '\0';
|
||||||
break;
|
PrintAndLog("%s", string_buf);
|
||||||
|
string_buf[0] = '\0';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,35 +52,20 @@ int CmdHelp(const char *Cmd)
|
||||||
*/
|
*/
|
||||||
int CmdLegicDecode(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_len = 0;
|
||||||
int segment_flag = 0;
|
int segment_flag = 0;
|
||||||
int stamp_len = 0;
|
int stamp_len = 0;
|
||||||
int crc = 0;
|
int crc = 0;
|
||||||
int wrp = 0;
|
int wrp = 0;
|
||||||
int wrc = 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 out_string[3076]; // just use big buffer - bad practice
|
||||||
char token_type[4];
|
char token_type[4];
|
||||||
int delivered = 0;
|
|
||||||
|
|
||||||
h = 0;
|
|
||||||
|
|
||||||
// copy data from proxmark into buffer
|
// copy data from proxmark into buffer
|
||||||
for (i = 0; i < 256; i += 12, h += 48) {
|
GetFromBigBuf(data_buf,sizeof(data_buf),0);
|
||||||
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Output CDF System area (9 bytes) plus remaining header area (12 bytes)
|
// Output CDF System area (9 bytes) plus remaining header area (12 bytes)
|
||||||
|
|
||||||
|
@ -264,24 +249,27 @@ int CmdLegicLoad(const char *Cmd)
|
||||||
|
|
||||||
int CmdLegicSave(const char *Cmd)
|
int CmdLegicSave(const char *Cmd)
|
||||||
{
|
{
|
||||||
int n;
|
|
||||||
int requested = 1024;
|
int requested = 1024;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
char filename[1024];
|
|
||||||
sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
|
|
||||||
if (offset % 4 != 0) {
|
|
||||||
PrintAndLog("Offset must be a multiple of 4");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
offset = offset/4;
|
|
||||||
|
|
||||||
int delivered = 0;
|
int delivered = 0;
|
||||||
|
char filename[1024];
|
||||||
|
uint8_t got[1024];
|
||||||
|
|
||||||
|
sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
|
||||||
|
|
||||||
|
/* 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) {
|
if (requested == 0) {
|
||||||
n = 12;
|
requested = 1024;
|
||||||
requested = 12;
|
}
|
||||||
} else {
|
if (requested % 8 != 0) {
|
||||||
n = requested/4;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *f = fopen(filename, "w");
|
FILE *f = fopen(filename, "w");
|
||||||
|
@ -290,25 +278,21 @@ int CmdLegicSave(const char *Cmd)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = offset; i < n+offset; i += 12) {
|
GetFromBigBuf(got,requested,offset);
|
||||||
UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
SendCommand(&c);
|
|
||||||
WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL);
|
for (int j = 0; j < requested; j += 8) {
|
||||||
for (int j = 0; j < 48; j += 8) {
|
fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||||
fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
|
got[j+0],
|
||||||
sample_buf[j+0],
|
got[j+1],
|
||||||
sample_buf[j+1],
|
got[j+2],
|
||||||
sample_buf[j+2],
|
got[j+3],
|
||||||
sample_buf[j+3],
|
got[j+4],
|
||||||
sample_buf[j+4],
|
got[j+5],
|
||||||
sample_buf[j+5],
|
got[j+6],
|
||||||
sample_buf[j+6],
|
got[j+7]
|
||||||
sample_buf[j+7]
|
);
|
||||||
);
|
delivered += 8;
|
||||||
delivered += 8;
|
|
||||||
if (delivered >= requested)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (delivered >= requested)
|
if (delivered >= requested)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue