mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 13:23:51 -07:00
CHG: 'hf mf csave'
CHG: 'hf mf esave' -
This commit is contained in:
parent
151ad3b31f
commit
5c0517526a
1 changed files with 74 additions and 156 deletions
216
client/cmdhfmf.c
216
client/cmdhfmf.c
|
@ -2427,80 +2427,49 @@ int CmdHF14AMfELoad(const char *Cmd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MFBLOCK_SIZE 16
|
||||||
int CmdHF14AMfESave(const char *Cmd) {
|
int CmdHF14AMfESave(const char *Cmd) {
|
||||||
FILE * f;
|
|
||||||
char filename[FILE_PATH_SIZE];
|
char filename[FILE_PATH_SIZE];
|
||||||
char * fnameptr = filename;
|
char * fnameptr = filename;
|
||||||
uint8_t buf[64];
|
uint8_t *dump;
|
||||||
int i, j, len, numBlocks;
|
int len, bytes, nameParamNo = 1;
|
||||||
int nameParamNo = 1;
|
uint16_t blocks;
|
||||||
|
|
||||||
memset(filename, 0, sizeof(filename));
|
memset(filename, 0, sizeof(filename));
|
||||||
memset(buf, 0, sizeof(buf));
|
|
||||||
|
|
||||||
char c = param_getchar(Cmd, 0);
|
char c = tolower(param_getchar(Cmd, 0));
|
||||||
|
if (c == 'h') return usage_hf14_esave();
|
||||||
|
|
||||||
if ( c == 'h' || c == 'H') return usage_hf14_esave();
|
blocks = NumOfBlocks(c);
|
||||||
|
bytes = blocks * MFBLOCK_SIZE;
|
||||||
|
|
||||||
switch (c) {
|
dump = malloc(bytes);
|
||||||
case '0' : numBlocks = 5*4; break;
|
if (!dump) {
|
||||||
case '1' :
|
PrintAndLogEx(WARNING, "Fail, cannot allocate memory");
|
||||||
case '\0': numBlocks = 16*4; break;
|
return 1;
|
||||||
case '2' : numBlocks = 32*4; break;
|
|
||||||
case '4' : numBlocks = 256; break;
|
|
||||||
default: {
|
|
||||||
numBlocks = 16*4;
|
|
||||||
nameParamNo = 0;
|
|
||||||
}
|
}
|
||||||
|
memset(dump, 0, bytes);
|
||||||
|
|
||||||
|
PrintAndLogEx(INFO, "dowingloading from emulator memory");
|
||||||
|
if (!GetFromDevice( BIG_BUF_EML, dump, bytes, 0, NULL, 2500, false)) {
|
||||||
|
PrintAndLogEx(WARNING, "Fail, transfer from device time-out");
|
||||||
|
free(dump);
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = param_getstr(Cmd, nameParamNo, filename, sizeof(filename));
|
len = param_getstr(Cmd, nameParamNo, filename, sizeof(filename));
|
||||||
|
|
||||||
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;
|
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;
|
||||||
|
|
||||||
// user supplied filename?
|
// user supplied filename?
|
||||||
if (len < 1) {
|
if (len < 1) {
|
||||||
// get filename (UID from memory)
|
fnameptr += sprintf(fnameptr, "hf-mf-");
|
||||||
if (mfEmlGetMem(buf, 0, 1)) {
|
FillFileNameByUID(fnameptr, dump, "-dump", 4);
|
||||||
PrintAndLogEx(WARNING, "Can\'t get UID from block: %d", 0);
|
|
||||||
len = sprintf(fnameptr, "dump");
|
|
||||||
fnameptr += len;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (j = 0; j < 7; j++, fnameptr += 2)
|
|
||||||
sprintf(fnameptr, "%02X", buf[j]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fnameptr += len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add file extension
|
saveFile(filename, "bin", dump, bytes);
|
||||||
sprintf(fnameptr, ".eml");
|
saveFileEML(filename, "eml", dump, bytes, MFBLOCK_SIZE);
|
||||||
|
free(dump);
|
||||||
// open file
|
|
||||||
f = fopen(filename, "w+");
|
|
||||||
|
|
||||||
if ( !f ) {
|
|
||||||
PrintAndLogEx(WARNING, "Can't open file %s ", filename);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// put hex
|
|
||||||
for (i = 0; i < numBlocks; i++) {
|
|
||||||
if (mfEmlGetMem(buf, i, 1)) {
|
|
||||||
PrintAndLogEx(WARNING, "Cant get block: %d", i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for (j = 0; j < 16; j++)
|
|
||||||
fprintf(f, "%02X", buf[j]);
|
|
||||||
|
|
||||||
if (i != numBlocks -1)
|
|
||||||
fprintf(f, "\n");
|
|
||||||
printf("."); fflush(stdout);
|
|
||||||
}
|
|
||||||
PrintAndLogEx(NORMAL, "\n");
|
|
||||||
fclose(f);
|
|
||||||
PrintAndLogEx(SUCCESS, "Saved %d blocks to file: %s", numBlocks, filename);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2811,74 +2780,49 @@ int CmdHF14AMfCGetSc(const char *Cmd) {
|
||||||
|
|
||||||
int CmdHF14AMfCSave(const char *Cmd) {
|
int CmdHF14AMfCSave(const char *Cmd) {
|
||||||
|
|
||||||
FILE * feml;
|
char filename[FILE_PATH_SIZE];
|
||||||
FILE * fbin;
|
char * fnameptr = filename;
|
||||||
char filename[2][FILE_PATH_SIZE];
|
uint8_t *dump;
|
||||||
char * femlptr = filename[0];
|
bool fillEmulator = false;
|
||||||
char * fbinptr = filename[1];
|
bool errors = false, hasname = false, useuid = false;
|
||||||
bool fillFromEmulator = false;
|
int i, len, flags;
|
||||||
bool errors = false;
|
uint8_t numblocks = 0, cmdp = 0;
|
||||||
bool hasname = false;
|
uint16_t bytes = 0;
|
||||||
uint8_t buf[16];
|
|
||||||
int i, j, len, flags;
|
|
||||||
uint8_t numblocks = 0;
|
|
||||||
uint8_t cmdp = 0;
|
|
||||||
char ctmp;
|
char ctmp;
|
||||||
|
|
||||||
memset(filename, 0, sizeof(filename));
|
while (param_getchar(Cmd, cmdp) != 0x00 && !errors) {
|
||||||
memset(buf, 0, sizeof(buf));
|
ctmp = tolower(param_getchar(Cmd, cmdp));
|
||||||
|
switch (ctmp) {
|
||||||
while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {
|
|
||||||
ctmp = param_getchar(Cmd, cmdp);
|
|
||||||
switch(ctmp) {
|
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'E':
|
useuid = true;
|
||||||
fillFromEmulator = true;
|
fillEmulator = true;
|
||||||
cmdp++;
|
cmdp++;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'H':
|
|
||||||
return usage_hf14_csave();
|
return usage_hf14_csave();
|
||||||
case '0':
|
case '0':
|
||||||
case '1':
|
case '1':
|
||||||
case '2':
|
case '2':
|
||||||
case '4':
|
case '4':
|
||||||
numblocks = NumOfBlocks(ctmp);
|
numblocks = NumOfBlocks(ctmp);
|
||||||
|
bytes = numblocks * MFBLOCK_SIZE;
|
||||||
PrintAndLogEx(SUCCESS, "Saving magic mifare %cK", ctmp);
|
PrintAndLogEx(SUCCESS, "Saving magic mifare %cK", ctmp);
|
||||||
cmdp++;
|
cmdp++;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
case 'U':
|
useuid = true;
|
||||||
// get filename based on UID
|
|
||||||
if (mfCGetBlock(0, buf, MAGIC_SINGLE)) {
|
|
||||||
PrintAndLogEx(FAILED, "Cant get block: %d", 0);
|
|
||||||
femlptr += sprintf(femlptr, "dump");
|
|
||||||
fbinptr += sprintf(fbinptr, "dump");
|
|
||||||
} else {
|
|
||||||
for (j = 0; j < 7; j++) {
|
|
||||||
femlptr += sprintf(femlptr, "%02x", buf[j]);
|
|
||||||
fbinptr += sprintf(fbinptr, "%02x", buf[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hasname = true;
|
hasname = true;
|
||||||
cmdp++;
|
cmdp++;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
case 'O':
|
len = param_getstr(Cmd, cmdp+1, filename, FILE_PATH_SIZE);
|
||||||
// input file
|
|
||||||
len = param_getstr(Cmd, cmdp+1, filename[0], FILE_PATH_SIZE);
|
|
||||||
len = param_getstr(Cmd, cmdp+1, filename[1], FILE_PATH_SIZE);
|
|
||||||
|
|
||||||
if (len < 1) {
|
if (len < 1) {
|
||||||
errors = true;
|
errors = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;
|
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;
|
||||||
|
|
||||||
femlptr += len;
|
useuid = false;
|
||||||
fbinptr += len;
|
|
||||||
|
|
||||||
hasname = true;
|
hasname = true;
|
||||||
cmdp += 2;
|
cmdp += 2;
|
||||||
break;
|
break;
|
||||||
|
@ -2889,75 +2833,49 @@ int CmdHF14AMfCSave(const char *Cmd) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// must have filename when saving.
|
if (!hasname && !fillEmulator) errors = true;
|
||||||
if (!hasname && !fillFromEmulator) errors = true;
|
|
||||||
|
|
||||||
//Validations
|
|
||||||
if (errors || cmdp == 0) return usage_hf14_csave();
|
if (errors || cmdp == 0) return usage_hf14_csave();
|
||||||
|
|
||||||
if (fillFromEmulator) {
|
dump = malloc(bytes);
|
||||||
// put into emulator
|
if (!dump) {
|
||||||
|
PrintAndLogEx(WARNING, "Fail, cannot allocate memory");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
memset(dump, 0, bytes);
|
||||||
|
|
||||||
flags = MAGIC_INIT + MAGIC_WUPC;
|
flags = MAGIC_INIT + MAGIC_WUPC;
|
||||||
for (i = 0; i < numblocks; i++) {
|
for (i = 0; i < numblocks; i++) {
|
||||||
if (i == 1) flags = 0;
|
if (i == 1) flags = 0;
|
||||||
if (i == numblocks - 1) flags = MAGIC_HALT + MAGIC_OFF;
|
if (i == numblocks - 1) flags = MAGIC_HALT + MAGIC_OFF;
|
||||||
|
|
||||||
if (mfCGetBlock(i, buf, flags)) {
|
if (mfCGetBlock(i, dump + (i*MFBLOCK_SIZE), flags)) {
|
||||||
PrintAndLogEx(WARNING, "Cant get block: %d", i);
|
PrintAndLogEx(WARNING, "Cant get block: %d", i);
|
||||||
return 3;
|
free(dump);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mfEmlSetMem(buf, i, 1)) {
|
if ( useuid ){
|
||||||
|
fnameptr += sprintf(fnameptr, "hf-mf-");
|
||||||
|
FillFileNameByUID(fnameptr, dump, "-dump", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fillEmulator) {
|
||||||
|
PrintAndLogEx(INFO, "uploading to emulator memory");
|
||||||
|
for (i = 0; i < numblocks; i += 5) {
|
||||||
|
if (mfEmlSetMem(dump + (i*MFBLOCK_SIZE), i, 5)) {
|
||||||
PrintAndLogEx(WARNING, "Cant set emul block: %d", i);
|
PrintAndLogEx(WARNING, "Cant set emul block: %d", i);
|
||||||
return 3;
|
|
||||||
}
|
}
|
||||||
printf("."); fflush(stdout);
|
printf("."); fflush(stdout);
|
||||||
}
|
}
|
||||||
PrintAndLogEx(NORMAL, "\n");
|
PrintAndLogEx(NORMAL, "\n");
|
||||||
return 0;
|
PrintAndLogEx(SUCCESS, "uploaded %d bytes to emulator memory", bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(femlptr, ".eml");
|
saveFile(filename, "bin", dump, bytes);
|
||||||
sprintf(fbinptr, ".bin");
|
saveFileEML(filename, "eml", dump, bytes, MFBLOCK_SIZE);
|
||||||
|
free(dump);
|
||||||
if ((feml = fopen(filename[0], "w+")) == NULL ) {
|
|
||||||
PrintAndLogEx(WARNING, "File not found or locked");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((fbin = fopen(filename[1], "wb")) == NULL) {
|
|
||||||
PrintAndLogEx(WARNING, "File not found or locked");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dump to files
|
|
||||||
flags = MAGIC_INIT + MAGIC_WUPC;
|
|
||||||
for (i = 0; i < numblocks; i++) {
|
|
||||||
if (i == 1) flags = 0;
|
|
||||||
if (i == numblocks - 1) flags = MAGIC_HALT + MAGIC_OFF;
|
|
||||||
|
|
||||||
if (mfCGetBlock(i, buf, flags)) {
|
|
||||||
PrintAndLogEx(WARNING, "Cant get block: %d", i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// eml
|
|
||||||
for (j = 0; j < 16; j++)
|
|
||||||
fprintf(feml, "%02x", buf[j]);
|
|
||||||
|
|
||||||
if (i != numblocks -1)
|
|
||||||
fprintf(feml,"\n");
|
|
||||||
|
|
||||||
// bin
|
|
||||||
fwrite(buf, 1, sizeof(buf), fbin);
|
|
||||||
printf("."); fflush(stdout);
|
|
||||||
}
|
|
||||||
PrintAndLogEx(NORMAL, "\n");
|
|
||||||
fflush(feml); fflush(fbin);
|
|
||||||
fclose(feml); fclose(fbin);
|
|
||||||
|
|
||||||
for (uint8_t i=0; i<2; ++i)
|
|
||||||
PrintAndLogEx(SUCCESS, "Saved %d blocks to file: %s", numblocks, filename[i]);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue