CHG: 'hf mf csave'

CHG: 'hf mf esave'  -
This commit is contained in:
Chris 2018-09-16 23:05:09 +02:00
commit 5c0517526a

View file

@ -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;
} }