]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhfmf.c
magic Chinese card fully supported. Added commands:csetuid-set card uid and wipe...
[proxmark3-svn] / client / cmdhfmf.c
index ac4f1087d131bcba3cd8d21dceadbe54dbbe1876..eafb29197592bc7801e6d0433b8eeb3e0ef17964 100644 (file)
@@ -712,6 +712,7 @@ int CmdHF14AMfChk(const char *Cmd)
 {\r
        FILE * f;\r
        char filename[256]={0};\r
+       char buf[13];\r
        uint8_t *keyBlock = NULL, *p;\r
        uint8_t stKeyBlock = 20;\r
        \r
@@ -810,20 +811,24 @@ int CmdHF14AMfChk(const char *Cmd)
                                return 2;\r
                        }\r
                        \r
-            char * line = NULL;\r
-            size_t len = 0;\r
-            ssize_t read;\r
                        if ( (f = fopen( filename , "r")) ) {\r
-                               while((read = getline(&line, &len, f)) != -1){\r
+                               while( !feof(f) ){\r
+                                       memset(buf, 0, sizeof(buf));\r
+                                       fgets(buf, sizeof(buf), f);\r
+                                       \r
+                                       if (strlen(buf) < 12 || buf[11] == '\n')\r
+                                               continue;\r
                                \r
-                                       if( line[0]=='#' || line[0]=='\n' ) continue;   //The line start with # is remcommnet,skip\r
+                                       while (fgetc(f) != '\n' && !feof(f)) ;  //goto next line\r
+                                       \r
+                                       if( buf[0]=='#' ) continue;     //The line start with # is remcommnet,skip\r
 \r
-                                       if (read < 12 || !isxdigit(line[0])){\r
-                                               PrintAndLog("File content error. '%s' must include 12 HEX symbols",line);\r
+                                       if (!isxdigit(buf[0])){\r
+                                               PrintAndLog("File content error. '%s' must include 12 HEX symbols",buf);\r
                                                continue;\r
                                        }\r
                                        \r
-                                       line[12] = 0;\r
+                                       buf[12] = 0;\r
 \r
                                        if ( stKeyBlock - keycnt < 2) {\r
                                                p = realloc(keyBlock, 6*(stKeyBlock+=10));\r
@@ -835,11 +840,10 @@ int CmdHF14AMfChk(const char *Cmd)
                                                keyBlock = p;\r
                                        }\r
                                        memset(keyBlock + 6 * keycnt, 0, 6);\r
-                                       num_to_bytes(strtoll(line, NULL, 16), 6, keyBlock + 6*keycnt);\r
+                                       num_to_bytes(strtoll(buf, NULL, 16), 6, keyBlock + 6*keycnt);\r
                                        PrintAndLog("chk custom key[%d] %012llx", keycnt, bytes_to_num(keyBlock + 6*keycnt, 6));\r
                                        keycnt++;\r
                                }\r
-                               free(line);\r
                        } else {\r
                                PrintAndLog("File: %s: not found or locked.", filename);\r
                                free(keyBlock);\r
@@ -1214,6 +1218,175 @@ int CmdHF14AMfEKeyPrn(const char *Cmd)
        return 0;\r
 }\r
 \r
+int CmdHF14AMfCSetUID(const char *Cmd)\r
+{\r
+       uint8_t wipeCard = 0;\r
+       uint8_t uid[8];\r
+       uint8_t oldUid[8];\r
+       int res;\r
+\r
+       if (strlen(Cmd) < 1 || param_getchar(Cmd, 0) == 'h') {\r
+               PrintAndLog("Usage:  hf mf csetuid <UID 8 hex symbols> <w>");\r
+               PrintAndLog("sample:  hf mf csetuid 01020304 w");\r
+               PrintAndLog("Set UID for magic Chinese card (only works with!!!)");\r
+               PrintAndLog("If you want wipe card then add 'w' into command line. \n");\r
+               return 0;\r
+       }       \r
+\r
+       if (param_getchar(Cmd, 0) && param_gethex(Cmd, 0, uid, 8)) {\r
+               PrintAndLog("UID must include 8 HEX symbols");\r
+               return 1;\r
+       }\r
+\r
+       char ctmp = param_getchar(Cmd, 1);\r
+       if (ctmp == 'w' || ctmp == 'W') wipeCard = 1;\r
+       \r
+       PrintAndLog("--wipe card:%02x uid:%s", wipeCard, sprint_hex(uid, 4));\r
+\r
+       res = mfCSetUID(uid, oldUid, wipeCard);\r
+       if (res) {\r
+                       PrintAndLog("Can't set UID. error=%d", res);\r
+                       return 1;\r
+               }\r
+       \r
+       PrintAndLog("old UID:%s", sprint_hex(oldUid, 4));\r
+       return 0;\r
+}\r
+\r
+int CmdHF14AMfCSetBlk(const char *Cmd)\r
+{\r
+       uint8_t uid[8];\r
+       uint8_t memBlock[16];\r
+       uint8_t blockNo = 0;\r
+       int res;\r
+       memset(memBlock, 0x00, sizeof(memBlock));\r
+\r
+       if (strlen(Cmd) < 1 || param_getchar(Cmd, 0) == 'h') {\r
+               PrintAndLog("Usage:  hf mf csetblk <block number> <block data (32 hex symbols)>");\r
+               PrintAndLog("sample:  hf mf csetblk 1 01020304050607080910111213141516");\r
+               PrintAndLog("Set block data for magic Chinese card (only works with!!!)");\r
+               PrintAndLog("If you want wipe card then add 'w' into command line. \n");\r
+               return 0;\r
+       }       \r
+\r
+       blockNo = param_get8(Cmd, 0);\r
+       if (blockNo >= 32 * 4 + 8 * 16) {\r
+               PrintAndLog("Block number must be in [0..255] as in MIFARE classic.");\r
+               return 1;\r
+       }\r
+\r
+       if (param_gethex(Cmd, 1, memBlock, 32)) {\r
+               PrintAndLog("block data must include 32 HEX symbols");\r
+               return 1;\r
+       }\r
+\r
+       PrintAndLog("--block number:%02x data:%s", blockNo, sprint_hex(memBlock, 16));\r
+\r
+       res = mfCSetBlock(blockNo, memBlock, uid, 0, CSETBLOCK_SINGLE_OPER);\r
+       if (res) {\r
+                       PrintAndLog("Can't write block. error=%d", res);\r
+                       return 1;\r
+               }\r
+       \r
+       PrintAndLog("UID:%s", sprint_hex(uid, 4));\r
+       return 0;\r
+}\r
+\r
+int CmdHF14AMfCLoad(const char *Cmd)\r
+{\r
+       FILE * f;\r
+       char filename[20];\r
+       char * fnameptr = filename;\r
+       char buf[64];\r
+       uint8_t buf8[64];\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
+\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
+               PrintAndLog("or from emulator memory (option `e`)");\r
+               PrintAndLog("Usage:  hf mf cload <file name w/o `.eml`>");\r
+               PrintAndLog("   or:  hf mf cload e ");\r
+               PrintAndLog(" sample: hf mf cload filename");\r
+               return 0;\r
+       }       \r
+\r
+       char ctmp = param_getchar(Cmd, 0);\r
+       if (ctmp == 'e' || ctmp == 'E') fillFromEmulator = 1;\r
+       \r
+       if (fillFromEmulator) {\r
+               flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
+               for (blockNum = 0; blockNum < 16 * 4; blockNum += 1) {\r
+                       if (mfEmlGetMem(buf8, blockNum, 1)) {\r
+                               PrintAndLog("Cant get block: %d", blockNum);\r
+                               return 2;\r
+                       }\r
+                       \r
+                       if (blockNum == 2) flags = 0;\r
+                       if (blockNum == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;\r
+\r
+                       if (mfCSetBlock(blockNum, buf8, NULL, 0, flags)) {\r
+                               PrintAndLog("Cant set magic card block: %d", blockNum);\r
+                               return 3;\r
+                       }\r
+               }\r
+               return 0;\r
+       } else {\r
+               len = strlen(Cmd);\r
+               if (len > 14) len = 14;\r
+\r
+               memcpy(filename, Cmd, len);\r
+               fnameptr += len;\r
+\r
+               sprintf(fnameptr, ".eml"); \r
+       \r
+               // open file\r
+               f = fopen(filename, "r");\r
+               if (f == NULL) {\r
+                       PrintAndLog("File not found or locked.");\r
+                       return 1;\r
+               }\r
+       \r
+               blockNum = 0;\r
+               flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
+               while(!feof(f)){\r
+                       memset(buf, 0, sizeof(buf));\r
+                       fgets(buf, sizeof(buf), f);\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
+                               return 2;\r
+                       }\r
+                       for (i = 0; i < 32; i += 2)\r
+                               sscanf(&buf[i], "%02x", (unsigned int *)&buf8[i / 2]);\r
+\r
+                       if (blockNum == 2) flags = 0;\r
+                       if (blockNum == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;\r
+\r
+                       if (mfCSetBlock(blockNum, buf8, NULL, 0, flags)) {\r
+                               PrintAndLog("Cant set magic card block: %d", blockNum);\r
+                               return 3;\r
+                       }\r
+                       blockNum++;\r
+               \r
+                       if (blockNum >= 16 * 4) break;  // magic card type - mifare 1K\r
+               }\r
+               fclose(f);\r
+       \r
+               if (blockNum != 16 * 4 && blockNum != 32 * 4 + 8 * 16){\r
+                       PrintAndLog("File content error. There must be 64 blocks");\r
+                       return 4;\r
+               }\r
+               PrintAndLog("Loaded from file: %s", filename);\r
+               return 0;\r
+       }\r
+}\r
+\r
 static command_t CommandTable[] =\r
 {\r
   {"help",             CmdHelp,                                1, "This help"},\r
@@ -1234,6 +1407,9 @@ static command_t CommandTable[] =
   {"esave",            CmdHF14AMfESave,                0, "Save to file emul dump"},\r
   {"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
+  {"cload",            CmdHF14AMfCLoad,                0, "Load dump into magic Chinese card"},\r
   {NULL, NULL, 0, NULL}\r
 };\r
 \r
Impressum, Datenschutz