X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/564c9ae2b68afc0d8b0455fb9b9d2aba0ca6c574..7dae65ce9919e65c0d6ccd7c2c669c55ef4c8ee3:/client/cmdhflegic.c diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c index a68d29a7..62c43f04 100644 --- a/client/cmdhflegic.c +++ b/client/cmdhflegic.c @@ -149,7 +149,16 @@ int usage_legic_esave(void){ PrintAndLog(" hf legic esave 2 myfile"); return 0; } - +int usage_legic_wipe(void){ + PrintAndLog("Fills a legic tag memory with zeros. From byte7 and to the end."); + PrintAndLog(" Usage: hf legic wipe [h]"); + PrintAndLog("Options:"); + PrintAndLog(" h : this help"); + PrintAndLog(""); + PrintAndLog("Samples:"); + PrintAndLog(" hf legic wipe"); + return 0; +} /* * Output BigBuf and deobfuscate LEGIC RF tag data. * This is based on information given in the talk held @@ -627,14 +636,13 @@ int CmdLegicRfWrite(const char *Cmd) { PrintAndLog("############# DANGER ################"); PrintAndLog("# changing the DCF is irreversible #"); PrintAndLog("#####################################"); - PrintAndLog("do you really want to continue? y(es) n(o)"); - char answer; - sscanf("%c", &answer); - bool exit = !(answer == 'n' || answer == 'N'); - if (exit) + char *answer = NULL; + answer = readline("do you really want to continue? y(es) n(o) : "); + bool overwrite = (answer[0] == 'y' || answer[0] == 'Y'); + if (!overwrite){ + PrintAndLog("command cancelled"); return 0; - printf("ICE DCF: %c answer, %d\n", answer, exit); - return 0; + } } legic_chk_iv(&IV); @@ -916,7 +924,8 @@ int CmdLegicDump(const char *Cmd){ else sprintf(fnameptr + fileNlen,".bin"); - if ((f = fopen(filename,"wb")) == NULL) { + f = fopen(filename,"wb"); + if (!f) { PrintAndLog("Could not create file name %s", filename); if (data) free(data); @@ -992,7 +1001,8 @@ int CmdLegicRestore(const char *Cmd){ fnameptr += fileNlen; sprintf(fnameptr, ".bin"); - if ((f = fopen(filename,"rb")) == NULL) { + f = fopen(filename,"rb"); + if (!f) { PrintAndLog("File %s not found or locked", filename); return 3; } @@ -1011,15 +1021,15 @@ int CmdLegicRestore(const char *Cmd){ // load file size_t bytes_read = fread(data, 1, numofbytes, f); + fclose(f); + if ( bytes_read == 0){ PrintAndLog("File reading error"); free(data); - fclose(f); return 2; } - fclose(f); - - PrintAndLog("Restoring %s to card", filename); + + PrintAndLog("Restoring to card"); // transfer to device size_t len = 0; @@ -1031,11 +1041,10 @@ int CmdLegicRestore(const char *Cmd){ c.arg[0] = i; // offset c.arg[1] = len; // number of bytes memcpy(c.d.asBytes, data+i, len); - PrintAndLog("offset %d | chunk %d | numofbytes %d", i, len, numofbytes); clearCommandBuffer(); SendCommand(&c); - if (!WaitForResponseTimeout(CMD_ACK, &resp, 3000)) { + if (!WaitForResponseTimeout(CMD_ACK, &resp, 4000)) { PrintAndLog("command execution time out"); free(data); return 1; @@ -1046,11 +1055,11 @@ int CmdLegicRestore(const char *Cmd){ free(data); return 1; } - PrintAndLog("Wrote chunk %d - %d", i, len); + PrintAndLog("Wrote chunk [offset %d | len %d | total %d", i, len, i+len); } free(data); - PrintAndLog("\nWrote %d bytes from file: %s to card", numofbytes, filename); + PrintAndLog("\nWrote %d bytes to card from file %s", numofbytes, filename); return 0; } @@ -1089,7 +1098,8 @@ int CmdLegicELoad(const char *Cmd) { sprintf(fnameptr, ".bin"); // open file - if ((f = fopen(filename,"rb")) == NULL) { + f = fopen(filename,"rb"); + if (!f) { PrintAndLog("File %s not found or locked", filename); free(data); return 1; @@ -1101,9 +1111,11 @@ int CmdLegicELoad(const char *Cmd) { PrintAndLog("File reading error"); free(data); fclose(f); + f = NULL; return 2; } fclose(f); + f = NULL; // transfer to device legic_seteml(data, 0, numofbytes); @@ -1163,7 +1175,8 @@ int CmdLegicESave(const char *Cmd) { sprintf(fnameptr + fileNlen,".bin"); // open file - if ((f = fopen(filename,"wb")) == NULL) { + f = fopen(filename,"wb"); + if (!f) { PrintAndLog("Could not create file name %s", filename); free(data); return 1; @@ -1175,6 +1188,61 @@ int CmdLegicESave(const char *Cmd) { return 0; } +int CmdLegicWipe(const char *Cmd){ + + char cmdp = param_getchar(Cmd, 0); + + if ( cmdp == 'h' || cmdp == 'H') return usage_legic_wipe(); + + // tagtype + legic_card_select_t card; + if (legic_get_type(&card)) { + PrintAndLog("Failed to identify tagtype"); + return 1; + } + + // set up buffer + uint8_t *data = malloc(card.cardsize); + if (!data) { + PrintAndLog("Fail, cannot allocate memory"); + return 2; + } + memset(data, 0, card.cardsize); + + legic_print_type(card.cardsize, 0); + + printf("Erasing"); + + // transfer to device + size_t len = 0; + UsbCommand c = {CMD_WRITER_LEGIC_RF, {0, 0, 0x55}}; + UsbCommand resp; + for(size_t i = 7; i < card.cardsize; i += USB_CMD_DATA_SIZE) { + + printf("."); + len = MIN((card.cardsize - i), USB_CMD_DATA_SIZE); + c.arg[0] = i; // offset + c.arg[1] = len; // number of bytes + memcpy(c.d.asBytes, data+i, len); + clearCommandBuffer(); + SendCommand(&c); + + if (!WaitForResponseTimeout(CMD_ACK, &resp, 4000)) { + PrintAndLog("command execution time out"); + free(data); + return 3; + } + uint8_t isOK = resp.arg[0] & 0xFF; + if ( !isOK ) { + PrintAndLog("failed writing tag [msg = %u]", resp.arg[1] & 0xFF); + free(data); + return 4; + } + } + printf("ok\n"); + return 0; +} + int CmdLegicList(const char *Cmd) { CmdHFList("legic"); return 0; @@ -1193,6 +1261,7 @@ static command_t CommandTable[] = { {"eload", CmdLegicELoad, 1, "Load binary dump to emulator memory"}, {"esave", CmdLegicESave, 1, "Save emulator memory to binary file"}, {"list", CmdLegicList, 1, "[Deprecated] List LEGIC history"}, + {"wipe", CmdLegicWipe, 1, "Wipe a LEGIC Prime tag"}, {NULL, NULL, 0, NULL} };