]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhfmf.c
CHG: The input handling for "hf 14b write" is now correct. Thanks Asper for spotting...
[proxmark3-svn] / client / cmdhfmf.c
index 901ccd4921a3b7d0231c19751de6edbec5b52914..703e4c8becefc785ddace74167ac945d94d2613a 100644 (file)
@@ -34,7 +34,7 @@ start:
     SendCommand(&c);\r
        \r
        //flush queue\r
-       while (ukbhit())        getchar();\r
+       while (ukbhit()) getchar();\r
 \r
        // wait cycle\r
        while (true) {\r
@@ -66,19 +66,19 @@ start:
        if (isOK != 1) return 1;\r
        \r
        // execute original function from util nonce2key\r
-       if (nonce2key(uid, nt, nr, par_list, ks_list, &r_key))\r
-       {\r
+       if (nonce2key(uid, nt, nr, par_list, ks_list, &r_key)) {\r
                isOK = 2;\r
                PrintAndLog("Key not found (lfsr_common_prefix list is null). Nt=%08x", nt);    \r
        } else {\r
                printf("------------------------------------------------------------------\n");\r
-               PrintAndLog("Key found:%012"llx" \n", r_key);\r
+               PrintAndLog("Key found :%012"llx" \n", r_key);\r
 \r
                num_to_bytes(r_key, 6, keyBlock);\r
                isOK = mfCheckKeys(0, 0, 1, keyBlock, &r_key);\r
        }\r
+       \r
        if (!isOK) \r
-               PrintAndLog("Found valid key:%012"llx, r_key);\r
+               PrintAndLog("Found valid key :%012"llx, r_key);\r
        else\r
        {\r
                if (isOK != 2) PrintAndLog("Found invalid key. ");      \r
@@ -87,6 +87,7 @@ start:
                goto start;\r
        }\r
        \r
+       PrintAndLog("");\r
        return 0;\r
 }\r
 \r
@@ -123,10 +124,10 @@ int CmdHF14AMfWrBl(const char *Cmd)
        PrintAndLog("--block no:%d, key type:%c, key:%s", blockNo, keyType?'B':'A', sprint_hex(key, 6));\r
        PrintAndLog("--data: %s", sprint_hex(bldata, 16));\r
        \r
-  UsbCommand c = {CMD_MIFARE_WRITEBL, {blockNo, keyType, 0}};\r
+       UsbCommand c = {CMD_MIFARE_WRITEBL, {blockNo, keyType, 0}};\r
        memcpy(c.d.asBytes, key, 6);\r
        memcpy(c.d.asBytes + 10, bldata, 16);\r
-  SendCommand(&c);\r
+       SendCommand(&c);\r
 \r
        UsbCommand resp;\r
        if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
@@ -139,117 +140,6 @@ int CmdHF14AMfWrBl(const char *Cmd)
        return 0;\r
 }\r
 \r
-/*  dublett finns i CMDHFMFU.C \r
-int CmdHF14AMfUWrBl(const char *Cmd)\r
-{\r
-       uint8_t blockNo = 0;\r
-       bool chinese_card=0;\r
-       uint8_t bldata[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\r
-       UsbCommand resp;\r
-       \r
-       if (strlen(Cmd)<3) {\r
-               PrintAndLog("Usage:  hf mf uwrbl    <block number> <block data (8 hex symbols)> <w>");\r
-               PrintAndLog("        sample: hf mf uwrbl 0 01020304");\r
-               return 0;\r
-       }      \r
-\r
-       blockNo = param_get8(Cmd, 0);\r
-       if (param_gethex(Cmd, 1, bldata, 8)) {\r
-               PrintAndLog("Block data must include 8 HEX symbols");\r
-               return 1;\r
-       }\r
-       \r
-       if (strchr(Cmd,'w') != 0) {\r
-         chinese_card=1;\r
-       }\r
-       \r
-       switch(blockNo){\r
-               case 0:\r
-                       if (!chinese_card){\r
-                               PrintAndLog("Access Denied");\r
-                       }else{\r
-                               PrintAndLog("--specialblock no:%d", blockNo);\r
-                               PrintAndLog("--data: %s", sprint_hex(bldata, 4));\r
-                               UsbCommand d = {CMD_MIFAREU_WRITEBL, {blockNo}};\r
-                               memcpy(d.d.asBytes,bldata, 4);\r
-                               SendCommand(&d);\r
-\r
-                               if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-                                       uint8_t isOK  = resp.arg[0] & 0xff;\r
-                                       PrintAndLog("isOk:%02x", isOK);\r
-                               } else {\r
-                                       PrintAndLog("Command execute timeout");\r
-                             }\r
-                       }\r
-                       break;\r
-               case 1:\r
-                         if (!chinese_card){\r
-                               PrintAndLog("Access Denied");\r
-                         }else{\r
-                               PrintAndLog("--specialblock no:%d", blockNo);\r
-                               PrintAndLog("--data: %s", sprint_hex(bldata, 4));\r
-                               UsbCommand d = {CMD_MIFAREU_WRITEBL, {blockNo}};\r
-                               memcpy(d.d.asBytes,bldata, 4);\r
-                               SendCommand(&d);\r
-\r
-                               if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-                               uint8_t isOK  = resp.arg[0] & 0xff;\r
-                               PrintAndLog("isOk:%02x", isOK);\r
-                               } else {\r
-                                       PrintAndLog("Command execute timeout");\r
-                               }\r
-                       }\r
-                       break;\r
-               case 2:\r
-                       if (!chinese_card){\r
-                               PrintAndLog("Access Denied");\r
-                       }else{\r
-                               PrintAndLog("--specialblock no:%d", blockNo);\r
-                               PrintAndLog("--data: %s", sprint_hex(bldata, 4));\r
-                               UsbCommand c = {CMD_MIFAREU_WRITEBL, {blockNo}};\r
-                               memcpy(c.d.asBytes, bldata, 4);\r
-                               SendCommand(&c);\r
-\r
-                               if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-                                       uint8_t isOK  = resp.arg[0] & 0xff;\r
-                                       PrintAndLog("isOk:%02x", isOK);\r
-                               } else {\r
-                                       PrintAndLog("Command execute timeout");\r
-                               }\r
-                       }\r
-                       break;\r
-               case 3:\r
-                       PrintAndLog("--specialblock no:%d", blockNo);\r
-                       PrintAndLog("--data: %s", sprint_hex(bldata, 4));\r
-                       UsbCommand d = {CMD_MIFAREU_WRITEBL, {blockNo}};\r
-                       memcpy(d.d.asBytes,bldata, 4);\r
-                       SendCommand(&d);\r
-\r
-                       if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-                               uint8_t isOK  = resp.arg[0] & 0xff;\r
-                               PrintAndLog("isOk:%02x", isOK);\r
-                       } else {\r
-                               PrintAndLog("Command execute timeout");\r
-                       }\r
-                       break;\r
-               default: \r
-                       PrintAndLog("--block no:%d", blockNo);\r
-                       PrintAndLog("--data: %s", sprint_hex(bldata, 4));               \r
-                       UsbCommand e = {CMD_MIFAREU_WRITEBL, {blockNo}};\r
-                       memcpy(e.d.asBytes,bldata, 4);\r
-                       SendCommand(&e);\r
-\r
-                       if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-                               uint8_t isOK  = resp.arg[0] & 0xff;\r
-                               PrintAndLog("isOk:%02x", isOK);\r
-                       } else {\r
-                               PrintAndLog("Command execute timeout");\r
-                     }\r
-                     break;\r
-       }\r
-       return 0;\r
-}\r
-*/\r
 int CmdHF14AMfRdBl(const char *Cmd)\r
 {\r
        uint8_t blockNo = 0;\r
@@ -278,9 +168,9 @@ int CmdHF14AMfRdBl(const char *Cmd)
        }\r
        PrintAndLog("--block no:%d, key type:%c, key:%s ", blockNo, keyType?'B':'A', sprint_hex(key, 6));\r
        \r
-  UsbCommand c = {CMD_MIFARE_READBL, {blockNo, keyType, 0}};\r
+       UsbCommand c = {CMD_MIFARE_READBL, {blockNo, keyType, 0}};\r
        memcpy(c.d.asBytes, key, 6);\r
-  SendCommand(&c);\r
+       SendCommand(&c);\r
 \r
        UsbCommand resp;\r
        if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
@@ -298,133 +188,6 @@ int CmdHF14AMfRdBl(const char *Cmd)
   return 0;\r
 }\r
 \r
-/* dublett finns i CMDHFMFU.C \r
-int CmdHF14AMfURdBl(const char *Cmd)\r
-{\r
-       uint8_t blockNo = 0;\r
-\r
-    if (strlen(Cmd)<1) {\r
-               PrintAndLog("Usage:  hf mf urdbl    <block number>");\r
-               PrintAndLog("        sample: hf mf urdbl 0");\r
-        return 0;\r
-    }       \r
-        \r
-    blockNo = param_get8(Cmd, 0);\r
-    PrintAndLog("--block no:%d", blockNo);\r
-        \r
-       UsbCommand c = {CMD_MIFAREU_READBL, {blockNo}};\r
-       SendCommand(&c);\r
-\r
-    UsbCommand resp;\r
-    if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-               uint8_t isOK = resp.arg[0] & 0xff;\r
-        uint8_t *data = resp.d.asBytes;\r
-\r
-        if (isOK)\r
-            PrintAndLog("isOk:%02x data:%s", isOK, sprint_hex(data, 4));\r
-        else\r
-            PrintAndLog("isOk:%02x", isOK);\r
-    } else {\r
-        PrintAndLog("Command execute timeout");\r
-    }\r
-\r
-       return 0;\r
-}\r
-*/\r
-\r
-/* dublett finns i CMDHFMFU.C \r
-int CmdHF14AMfURdCard(const char *Cmd)\r
-{\r
-    int i;\r
-    uint8_t sectorNo = 0;\r
-       uint8_t *lockbytes_t=NULL;\r
-       uint8_t lockbytes[2]={0,0};\r
-       bool bit[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
-        \r
-    uint8_t isOK  = 0;\r
-    uint8_t * data  = NULL;\r
-\r
-    if (sectorNo > 15) {\r
-        PrintAndLog("Sector number must be less than 16");\r
-        return 1;\r
-    }\r
-    PrintAndLog("Attempting to Read Ultralight... ");\r
-        \r
-       UsbCommand c = {CMD_MIFAREU_READCARD, {sectorNo}};\r
-       SendCommand(&c);\r
-\r
-    UsbCommand resp;\r
-    if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
-        isOK = resp.arg[0] & 0xff;\r
-        data = resp.d.asBytes;\r
-\r
-        PrintAndLog("isOk:%02x", isOK);\r
-        if (isOK) \r
-            for (i = 0; i < 16; i++) {\r
-                       switch(i){\r
-                               case 2:\r
-                                       //process lock bytes\r
-                                       lockbytes_t=data+(i*4);\r
-                                       lockbytes[0]=lockbytes_t[2];\r
-                                       lockbytes[1]=lockbytes_t[3];\r
-                                       for(int j=0; j<16; j++){\r
-                                               bit[j]=lockbytes[j/8] & ( 1 <<(7-j%8));\r
-                                       }\r
-                                       //PrintAndLog("LB %02x %02x", lockbytes[0],lockbytes[1]);\r
-                                       //PrintAndLog("LB2b %02x %02x %02x %02x %02x %02x %02x %02x",bit[8],bit[9],bit[10],bit[11],bit[12],bit[13],bit[14],bit[15]);            \r
-                                       PrintAndLog("Block %3d:%s ", i,sprint_hex(data + i * 4, 4));\r
-                                       break;\r
-                               case 3: \r
-                                       PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[4]);\r
-                                       break;\r
-                               case 4:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[3]);\r
-                                       break;\r
-                               case 5:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[2]);\r
-                                       break;\r
-                               case 6:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[1]);\r
-                                       break;\r
-                               case 7:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[0]);\r
-                                       break;\r
-                               case 8:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[15]);\r
-                                       break;\r
-                               case 9:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[14]);\r
-                                       break;\r
-                               case 10:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[13]);\r
-                                       break;\r
-                               case 11:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[12]);\r
-                                       break;\r
-                               case 12:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[11]);\r
-                                       break;\r
-                               case 13:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[10]);\r
-                                       break;\r
-                               case 14:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[9]);\r
-                                       break;\r
-                               case 15:\r
-                    PrintAndLog("Block %3d:%s [%d]", i,sprint_hex(data + i * 4, 4),bit[8]);\r
-                                       break;\r
-                               default:\r
-                                       PrintAndLog("Block %3d:%s ", i,sprint_hex(data + i * 4, 4));\r
-                                       break;\r
-                               }\r
-                        }\r
-        } else {\r
-                PrintAndLog("Command execute timeout");\r
-        }\r
-  return 0;\r
-}\r
-*/\r
-\r
 int CmdHF14AMfRdSc(const char *Cmd)\r
 {\r
        int i;\r
@@ -482,7 +245,6 @@ int CmdHF14AMfRdSc(const char *Cmd)
   return 0;\r
 }\r
 \r
-\r
 uint8_t FirstBlockOfSector(uint8_t sectorNo)\r
 {\r
        if (sectorNo < 32) {\r
@@ -492,7 +254,6 @@ uint8_t FirstBlockOfSector(uint8_t sectorNo)
        }\r
 }\r
 \r
-\r
 uint8_t NumBlocksPerSector(uint8_t sectorNo)\r
 {\r
        if (sectorNo < 32) {\r
@@ -502,7 +263,6 @@ uint8_t NumBlocksPerSector(uint8_t sectorNo)
        }\r
 }\r
 \r
-\r
 int CmdHF14AMfDump(const char *Cmd)\r
 {\r
        uint8_t sectorNo, blockNo;\r
@@ -677,14 +437,12 @@ int CmdHF14AMfDump(const char *Cmd)
        return 0;\r
 }\r
 \r
-\r
 int CmdHF14AMfRestore(const char *Cmd)\r
 {\r
-\r
        uint8_t sectorNo,blockNo;\r
        uint8_t keyType = 0;\r
-       uint8_t key[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};\r
-       uint8_t bldata[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\r
+       uint8_t key[6] = {0xFF};\r
+       uint8_t bldata[16] = {0x00};\r
        uint8_t keyA[40][6];\r
        uint8_t keyB[40][6];\r
        uint8_t numSectors;\r
@@ -710,11 +468,7 @@ int CmdHF14AMfRestore(const char *Cmd)
                PrintAndLog("         hf mf restore 4");\r
                return 0;\r
        }\r
-\r
-       if ((fdump = fopen("dumpdata.bin","rb")) == NULL) {\r
-               PrintAndLog("Could not find file dumpdata.bin");\r
-               return 1;\r
-       }\r
+       \r
        if ((fkeys = fopen("dumpkeys.bin","rb")) == NULL) {\r
                PrintAndLog("Could not find file dumpkeys.bin");\r
                return 1;\r
@@ -734,6 +488,12 @@ int CmdHF14AMfRestore(const char *Cmd)
                }\r
        }\r
 \r
+       fclose(fkeys);\r
+       \r
+       if ((fdump = fopen("dumpdata.bin","rb")) == NULL) {\r
+               PrintAndLog("Could not find file dumpdata.bin");\r
+               return 1;\r
+       }       \r
        PrintAndLog("Restoring dumpdata.bin to card");\r
 \r
        for (sectorNo = 0; sectorNo < numSectors; sectorNo++) {\r
@@ -743,6 +503,7 @@ int CmdHF14AMfRestore(const char *Cmd)
                        \r
                        if (fread(bldata, 1, 16, fdump) == 0) {\r
                                PrintAndLog("File reading error (dumpdata.bin).");\r
+                               fclose(fdump);\r
                                return 2;\r
                        }\r
                                        \r
@@ -777,11 +538,9 @@ int CmdHF14AMfRestore(const char *Cmd)
        }\r
        \r
        fclose(fdump);\r
-       fclose(fkeys);\r
        return 0;\r
 }\r
 \r
-\r
 int CmdHF14AMfNested(const char *Cmd)\r
 {\r
        int i, j, res, iterations;\r
@@ -1027,7 +786,6 @@ int CmdHF14AMfNested(const char *Cmd)
        return 0;\r
 }\r
 \r
-\r
 int CmdHF14AMfChk(const char *Cmd)\r
 {\r
        if (strlen(Cmd)<3) {\r
@@ -1043,7 +801,7 @@ int CmdHF14AMfChk(const char *Cmd)
        }\r
        \r
        FILE * f;\r
-       char filename[256]={0};\r
+       char filename[FILE_PATH_SIZE]={0};\r
        char buf[13];\r
        uint8_t *keyBlock = NULL, *p;\r
        uint8_t stKeyBlock = 20;\r
@@ -1135,7 +893,7 @@ int CmdHF14AMfChk(const char *Cmd)
                        keycnt++;\r
                } else {\r
                        // May be a dic file\r
-                       if ( param_getstr(Cmd, 2 + i,filename) > 255 ) {\r
+                       if ( param_getstr(Cmd, 2 + i,filename) >= FILE_PATH_SIZE ) {\r
                                PrintAndLog("File name too long");\r
                                free(keyBlock);\r
                                return 2;\r
@@ -1255,11 +1013,10 @@ int CmdHF14AMfChk(const char *Cmd)
        }\r
 \r
        free(keyBlock);\r
-\r
+       PrintAndLog("");\r
   return 0;\r
 }\r
 \r
-\r
 int CmdHF14AMf1kSim(const char *Cmd)\r
 {\r
        uint8_t uid[7] = {0, 0, 0, 0, 0, 0, 0};\r
@@ -1325,7 +1082,6 @@ int CmdHF14AMf1kSim(const char *Cmd)
        return 0;\r
 }\r
 \r
-\r
 int CmdHF14AMfDbg(const char *Cmd)\r
 {\r
        int dbgMode = param_get32ex(Cmd, 0, 0, 10);\r
@@ -1373,7 +1129,6 @@ int CmdHF14AMfEGet(const char *Cmd)
   return 0;\r
 }\r
 \r
-\r
 int CmdHF14AMfEClear(const char *Cmd)\r
 {\r
        if (param_getchar(Cmd, 0) == 'h') {\r
@@ -1419,26 +1174,44 @@ int CmdHF14AMfESet(const char *Cmd)
 int CmdHF14AMfELoad(const char *Cmd)\r
 {\r
        FILE * f;\r
-       char filename[255];\r
+       char filename[FILE_PATH_SIZE];\r
        char *fnameptr = filename;\r
        char buf[64];\r
        uint8_t buf8[64];\r
-       int i, len, blockNum;\r
+       int i, len, blockNum, numBlocks;\r
+       int nameParamNo = 1;\r
        \r
        memset(filename, 0, sizeof(filename));\r
        memset(buf, 0, sizeof(buf));\r
 \r
-       if (param_getchar(Cmd, 0) == 'h' || param_getchar(Cmd, 0)== 0x00) {\r
+       char ctmp = param_getchar(Cmd, 0);\r
+               \r
+       if ( ctmp == 'h' || ctmp == 0x00) {\r
                PrintAndLog("It loads emul dump from the file `filename.eml`");\r
-               PrintAndLog("Usage:  hf mf eload <file name w/o `.eml`>");\r
+               PrintAndLog("Usage:  hf mf eload [card memory] <file name w/o `.eml`>");\r
+               PrintAndLog("  [card memory]: 0 = 320 bytes (Mifare Mini), 1 = 1K (default), 2 = 2K, 4 = 4K");\r
+               PrintAndLog("");\r
                PrintAndLog(" sample: hf mf eload filename");\r
+               PrintAndLog("         hf mf eload 4 filename");\r
                return 0;\r
        }       \r
 \r
-       len = strlen(Cmd);\r
-       if (len > 250) len = 250;\r
+       switch (ctmp) {\r
+               case '0' : numBlocks = 5*4; break;\r
+               case '1' : \r
+               case '\0': numBlocks = 16*4; break;\r
+               case '2' : numBlocks = 32*4; break;\r
+               case '4' : numBlocks = 256; break;\r
+               default:  {\r
+                       numBlocks = 16*4;\r
+                       nameParamNo = 0;\r
+               }\r
+       }\r
+\r
+       len = param_getstr(Cmd,nameParamNo,filename);\r
+       \r
+       if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
 \r
-       memcpy(filename, Cmd, len);\r
        fnameptr += len;\r
 \r
        sprintf(fnameptr, ".eml"); \r
@@ -1446,44 +1219,48 @@ int CmdHF14AMfELoad(const char *Cmd)
        // open file\r
        f = fopen(filename, "r");\r
        if (f == NULL) {\r
-               PrintAndLog("File not found or locked.");\r
+               PrintAndLog("File %s not found or locked", filename);\r
                return 1;\r
        }\r
        \r
        blockNum = 0;\r
        while(!feof(f)){\r
                memset(buf, 0, sizeof(buf));\r
+               \r
                if (fgets(buf, sizeof(buf), f) == NULL) {\r
-                       if((blockNum == 16*4) || (blockNum == 32*4 + 8*16)) {   // supports both old (1K) and new (4K) .eml files)\r
-                               break;\r
-                       }\r
+                       \r
+                       if (blockNum >= numBlocks) break;\r
+                       \r
                        PrintAndLog("File reading error.");\r
                        fclose(f);\r
                        return 2;\r
                }\r
+               \r
                if (strlen(buf) < 32){\r
                        if(strlen(buf) && feof(f))\r
                                break;\r
                        PrintAndLog("File content error. Block data must include 32 HEX symbols");\r
+                       fclose(f);\r
                        return 2;\r
                }\r
+               \r
                for (i = 0; i < 32; i += 2) {\r
                        sscanf(&buf[i], "%02x", (unsigned int *)&buf8[i / 2]);\r
-//                     PrintAndLog("data[%02d]:%s", blockNum, sprint_hex(buf8, 16));\r
                }\r
+               \r
                if (mfEmlSetMem(buf8, blockNum, 1)) {\r
                        PrintAndLog("Cant set emul block: %3d", blockNum);\r
+                       fclose(f);\r
                        return 3;\r
                }\r
                blockNum++;\r
                \r
-               if (blockNum >= 32*4 + 8*16) break;\r
+               if (blockNum >= numBlocks) break;\r
        }\r
        fclose(f);\r
        \r
-       if ((blockNum != 16*4) && (blockNum != 32*4 + 8*16)) {\r
-               PrintAndLog("File content error. There must be 64 or 256 blocks.");\r
-               fclose(f);\r
+       if ((blockNum != numBlocks)) {\r
+               PrintAndLog("File content error. Got %d must be %d blocks.",blockNum, numBlocks);\r
                return 4;\r
        }\r
        PrintAndLog("Loaded %d blocks from file: %s", blockNum, filename);\r
@@ -1494,56 +1271,81 @@ int CmdHF14AMfELoad(const char *Cmd)
 int CmdHF14AMfESave(const char *Cmd)\r
 {\r
        FILE * f;\r
-       char filename[255];\r
+       char filename[FILE_PATH_SIZE];\r
        char * fnameptr = filename;\r
        uint8_t buf[64];\r
-       int i, j, len;\r
+       int i, j, len, numBlocks;\r
+       int nameParamNo = 1;\r
        \r
        memset(filename, 0, sizeof(filename));\r
        memset(buf, 0, sizeof(buf));\r
 \r
-       if (param_getchar(Cmd, 0) == 'h') {\r
-               PrintAndLog("It saves emul dump into the file `filename.eml` or `cardID.eml`");\r
-               PrintAndLog("Usage:  hf mf esave [file name w/o `.eml`]");\r
+       char ctmp = param_getchar(Cmd, 0);\r
+       \r
+       if ( ctmp == 'h' || ctmp == 'H') {\r
+               PrintAndLog("It saves emul dump into the file `filename.eml` or `cardID.eml`");         \r
+               PrintAndLog(" Usage:  hf mf esave [card memory] [file name w/o `.eml`]");\r
+               PrintAndLog("  [card memory]: 0 = 320 bytes (Mifare Mini), 1 = 1K (default), 2 = 2K, 4 = 4K");\r
+               PrintAndLog("");\r
                PrintAndLog(" sample: hf mf esave ");\r
-               PrintAndLog("         hf mf esave filename");\r
+               PrintAndLog("         hf mf esave 4");\r
+               PrintAndLog("         hf mf esave 4 filename");\r
                return 0;\r
        }       \r
+       \r
+       switch (ctmp) {\r
+               case '0' : numBlocks = 5*4; break;\r
+               case '1' : \r
+               case '\0': numBlocks = 16*4; break;\r
+               case '2' : numBlocks = 32*4; break;\r
+               case '4' : numBlocks = 256; break;\r
+               default:  {\r
+                       numBlocks = 16*4;\r
+                       nameParamNo = 0;\r
+               }\r
+       }\r
 \r
-       len = strlen(Cmd);\r
-       if (len > 250) len = 250;\r
+       len = param_getstr(Cmd,nameParamNo,filename);\r
        \r
+       if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
+       \r
+       // user supplied filename?\r
        if (len < 1) {\r
-               // get filename\r
+               // get filename (UID from memory)\r
                if (mfEmlGetMem(buf, 0, 1)) {\r
-                       PrintAndLog("Cant get block: %d", 0);\r
-                       return 1;\r
+                       PrintAndLog("Can\'t get UID from block: %d", 0);\r
+                       sprintf(filename, "dump.eml"); \r
                }\r
                for (j = 0; j < 7; j++, fnameptr += 2)\r
-                       sprintf(fnameptr, "%02x", buf[j]); \r
+                       sprintf(fnameptr, "%02X", buf[j]); \r
        } else {\r
-               memcpy(filename, Cmd, len);\r
                fnameptr += len;\r
        }\r
 \r
+       // add file extension\r
        sprintf(fnameptr, ".eml"); \r
        \r
        // open file\r
        f = fopen(filename, "w+");\r
-\r
+       \r
+       if ( !f ) {\r
+               PrintAndLog("Can't open file %s ", filename);\r
+               return 1;\r
+       }\r
+       \r
        // put hex\r
-       for (i = 0; i < 32*4 + 8*16; i++) {\r
+       for (i = 0; i < numBlocks; i++) {\r
                if (mfEmlGetMem(buf, i, 1)) {\r
                        PrintAndLog("Cant get block: %d", i);\r
                        break;\r
                }\r
                for (j = 0; j < 16; j++)\r
-                       fprintf(f, "%02x", buf[j]); \r
+                       fprintf(f, "%02X", buf[j]); \r
                fprintf(f,"\n");\r
        }\r
        fclose(f);\r
        \r
-       PrintAndLog("Saved to file: %s", filename);\r
+       PrintAndLog("Saved %d blocks to file: %s", numBlocks, filename);\r
        \r
   return 0;\r
 }\r
@@ -1661,11 +1463,12 @@ int CmdHF14AMfCSetUID(const char *Cmd)
 \r
        res = mfCSetUID(uid, oldUid, wipeCard);\r
        if (res) {\r
-                       PrintAndLog("Can't set UID. error=%d", res);\r
-                       return 1;\r
-               }\r
+               PrintAndLog("Can't set UID. error=%d", res);\r
+               return 1;\r
+       }\r
        \r
        PrintAndLog("old UID:%s", sprint_hex(oldUid, 4));\r
+       PrintAndLog("new UID:%s", sprint_hex(uid, 4));\r
        return 0;\r
 }\r
 \r
@@ -1708,15 +1511,15 @@ int CmdHF14AMfCSetBlk(const char *Cmd)
 int CmdHF14AMfCLoad(const char *Cmd)\r
 {\r
        FILE * f;\r
-       char filename[255];\r
+       char filename[FILE_PATH_SIZE] = {0x00};\r
        char * fnameptr = filename;\r
-       char buf[64];\r
-       uint8_t buf8[64];\r
+       char buf[64] = {0x00};\r
+       uint8_t buf8[64] = {0x00};\r
        uint8_t fillFromEmulator = 0;\r
        int i, len, blockNum, flags;\r
        \r
-       memset(filename, 0, sizeof(filename));\r
-       memset(buf, 0, sizeof(buf));\r
+       // memset(filename, 0, sizeof(filename));\r
+       // memset(buf, 0, sizeof(buf));\r
 \r
        if (param_getchar(Cmd, 0) == 'h' || param_getchar(Cmd, 0)== 0x00) {\r
                PrintAndLog("It loads magic Chinese card (only works with!!!) from the file `filename.eml`");\r
@@ -1749,7 +1552,7 @@ int CmdHF14AMfCLoad(const char *Cmd)
                return 0;\r
        } else {\r
                len = strlen(Cmd);\r
-               if (len > 250) len = 250;\r
+               if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
 \r
                memcpy(filename, Cmd, len);\r
                fnameptr += len;\r
@@ -1872,14 +1675,14 @@ int CmdHF14AMfCGetSc(const char *Cmd) {
 int CmdHF14AMfCSave(const char *Cmd) {\r
 \r
        FILE * f;\r
-       char filename[255];\r
+       char filename[FILE_PATH_SIZE] = {0x00};\r
        char * fnameptr = filename;\r
        uint8_t fillFromEmulator = 0;\r
-       uint8_t buf[64];\r
+       uint8_t buf[64] = {0x00};\r
        int i, j, len, flags;\r
        \r
-       memset(filename, 0, sizeof(filename));\r
-       memset(buf, 0, sizeof(buf));\r
+       // memset(filename, 0, sizeof(filename));\r
+       // memset(buf, 0, sizeof(buf));\r
 \r
        if (param_getchar(Cmd, 0) == 'h') {\r
                PrintAndLog("It saves `magic Chinese` card dump into the file `filename.eml` or `cardID.eml`");\r
@@ -1914,7 +1717,7 @@ int CmdHF14AMfCSave(const char *Cmd) {
                return 0;\r
        } else {\r
                len = strlen(Cmd);\r
-               if (len > 250) len = 250;\r
+               if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
        \r
                if (len < 1) {\r
                        // get filename\r
@@ -1933,6 +1736,11 @@ int CmdHF14AMfCSave(const char *Cmd) {
        \r
                // open file\r
                f = fopen(filename, "w+");\r
+               \r
+               if (f == NULL) {\r
+                       PrintAndLog("File not found or locked.");\r
+                       return 1;\r
+               }\r
 \r
                // put hex\r
                flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
@@ -1958,7 +1766,7 @@ int CmdHF14AMfCSave(const char *Cmd) {
 \r
 \r
 int CmdHF14AMfSniff(const char *Cmd){\r
-       // params\r
+\r
        bool wantLogToFile = 0;\r
        bool wantDecrypt = 0;\r
        //bool wantSaveToEml = 0; TODO\r
@@ -1975,7 +1783,6 @@ int CmdHF14AMfSniff(const char *Cmd){
        uint8_t atqa[2];\r
        uint8_t sak;\r
        bool isTag;\r
-       uint32_t parity;\r
        uint8_t buf[3000];\r
        uint8_t * bufPtr = buf;\r
        memset(buf, 0x00, 3000);\r
@@ -1986,8 +1793,8 @@ int CmdHF14AMfSniff(const char *Cmd){
                PrintAndLog("    l - save encrypted sequence to logfile `uid.log`");\r
                PrintAndLog("    d - decrypt sequence and put it to log file `uid.log`");\r
                PrintAndLog(" n/a   e - decrypt sequence, collect read and write commands and save the result of the sequence to emulator memory");\r
-               PrintAndLog("    r - decrypt sequence, collect read and write commands and save the result of the sequence to emulator dump file `uid.eml`");\r
-               PrintAndLog("Usage:  hf mf sniff [l][d][e][r]");\r
+               PrintAndLog("    f - decrypt sequence, collect read and write commands and save the result of the sequence to emulator dump file `uid.eml`");\r
+               PrintAndLog("Usage:  hf mf sniff [l][d][e][f]");\r
                PrintAndLog("  sample: hf mf sniff l d e");\r
                return 0;\r
        }       \r
@@ -2042,14 +1849,19 @@ int CmdHF14AMfSniff(const char *Cmd){
                                printf(">\n");\r
                                PrintAndLog("received trace len: %d packages: %d", blockLen, pckNum);\r
                                num = 0;\r
-                               while (bufPtr - buf + 9 < blockLen) {\r
-                                       isTag = bufPtr[3] & 0x80 ? true:false;\r
-                                       bufPtr += 4;\r
-                                       parity = *((uint32_t *)(bufPtr));\r
-                                       bufPtr += 4;\r
-                                       len = bufPtr[0];\r
-                                       bufPtr++;\r
-                                       if ((len == 14) && (bufPtr[0] == 0xff) && (bufPtr[1] == 0xff)) {\r
+                               while (bufPtr - buf < blockLen) {\r
+                                       bufPtr += 6;\r
+                                       len = *((uint16_t *)bufPtr);\r
+\r
+                                       if(len & 0x8000) {\r
+                                               isTag = true;\r
+                                               len &= 0x7fff;\r
+                                       } else {\r
+                                               isTag = false;\r
+                                       }\r
+                                       bufPtr += 2;\r
+                                       if ((len == 14) && (bufPtr[0] == 0xff) && (bufPtr[1] == 0xff) && (bufPtr[12] == 0xff) && (bufPtr[13] == 0xff)) {\r
+                                       \r
                                                memcpy(uid, bufPtr + 2, 7);\r
                                                memcpy(atqa, bufPtr + 2 + 7, 2);\r
                                                uid_len = (atqa[0] & 0xC0) == 0x40 ? 7 : 4;\r
@@ -2071,9 +1883,10 @@ int CmdHF14AMfSniff(const char *Cmd){
                                                if (wantLogToFile) \r
                                                        AddLogHex(logHexFileName, isTag ? "TAG: ":"RDR: ", bufPtr, len);\r
                                                if (wantDecrypt) \r
-                                                       mfTraceDecode(bufPtr, len, parity, wantSaveToEmlFile);\r
+                                                       mfTraceDecode(bufPtr, len, wantSaveToEmlFile);\r
                                        }\r
                                        bufPtr += len;\r
+                                       bufPtr += ((len-1)/8+1); // ignore parity\r
                                        num++;\r
                                }\r
                        }\r
@@ -2143,7 +1956,7 @@ int GetCardSize()
        if ( ((atqa & 0xffff) == 0x0008) && (sak == 0x38) ) return 4;\r
 \r
        \r
-       PrintAndLog("BEFOOO  1K %02X",  (atqa & 0xff0f));\r
+       //PrintAndLog("BEFOOO  1K %02X",  (atqa & 0xff0f));\r
        \r
        // MIFARE Plus (4 Byte UID or 4 Byte RID)\r
        // MIFARE Plus (7 Byte UID)\r
@@ -2175,17 +1988,11 @@ int GetCardSize()
        return -1;\r
 }\r
 \r
-\r
-\r
-\r
 static command_t CommandTable[] =\r
 {\r
   {"help",             CmdHelp,                                1, "This help"},\r
   {"dbg",              CmdHF14AMfDbg,                  0, "Set default debug mode"},\r
   {"rdbl",             CmdHF14AMfRdBl,                 0, "Read MIFARE classic block"},\r
-  //{"urdbl",              CmdHF14AMfURdBl,                 0, "Read MIFARE Ultralight block"},\r
-  //{"urdcard",           CmdHF14AMfURdCard,               0,"Read MIFARE Ultralight Card"},\r
-  //{"uwrbl",          CmdHF14AMfUWrBl,                0,"Write MIFARE Ultralight block"},\r
   {"rdsc",             CmdHF14AMfRdSc,                 0, "Read MIFARE classic sector"},\r
   {"dump",             CmdHF14AMfDump,                 0, "Dump MIFARE classic tag to binary file"},\r
   {"restore",  CmdHF14AMfRestore,              0, "Restore MIFARE classic binary file to BLANK tag"},\r
@@ -2203,9 +2010,9 @@ static command_t CommandTable[] =
   {"ecfill",   CmdHF14AMfECFill,               0, "Fill simulator memory with help of keys from simulator"},\r
   {"ekeyprn",  CmdHF14AMfEKeyPrn,              0, "Print keys from simulator memory"},\r
   {"csetuid",  CmdHF14AMfCSetUID,              0, "Set UID for magic Chinese card"},\r
-  {"csetblk",  CmdHF14AMfCSetBlk,              0, "Write block into magic Chinese card"},\r
-  {"cgetblk",  CmdHF14AMfCGetBlk,              0, "Read block from magic Chinese card"},\r
-  {"cgetsc",   CmdHF14AMfCGetSc,               0, "Read sector from magic Chinese card"},\r
+  {"csetblk",  CmdHF14AMfCSetBlk,              0, "Write block - Magic Chinese card"},\r
+  {"cgetblk",  CmdHF14AMfCGetBlk,              0, "Read block - Magic Chinese card"},\r
+  {"cgetsc",   CmdHF14AMfCGetSc,               0, "Read sector - Magic Chinese card"},\r
   {"cload",            CmdHF14AMfCLoad,                0, "Load dump into magic Chinese card"},\r
   {"csave",            CmdHF14AMfCSave,                0, "Save dump from magic Chinese card into file or emulator"},\r
   {NULL, NULL, 0, NULL}\r
Impressum, Datenschutz