]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/mifarehost.c
Merge remote-tracking branch 'upstream/master'
[proxmark3-svn] / client / mifarehost.c
index e62d6260dcc758881cd1ae43b1bdb88c117fc281..35499b83677e18129e2278221ed865edbc52f32a 100644 (file)
@@ -231,28 +231,31 @@ int mfEmlSetMem(uint8_t *data, int blockNum, int blocksCount) {
 \r
 // "MAGIC" CARD\r
 \r
-int mfCSetUID(uint8_t *uid, uint8_t *oldUID, bool wantWipe) {\r
-       \r
+int mfCSetUID(uint8_t *uid, uint8_t *atqa, uint8_t *sak, uint8_t *oldUID, bool wantWipe) {\r
        uint8_t oldblock0[16] = {0x00};\r
        uint8_t block0[16] = {0x00};\r
-       memcpy(block0, uid, 4); \r
-       block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // Mifare UID BCC\r
-       // mifare classic SAK(byte 5) and ATQA(byte 6 and 7)\r
-       //block0[5] = 0x08;\r
-       //block0[6] = 0x04;\r
-       //block0[7] = 0x00;\r
-       \r
-       block0[5] = 0x01;  //sak\r
-       block0[6] = 0x01;\r
-       block0[7] = 0x0f;\r
-       \r
+\r
        int old = mfCGetBlock(0, oldblock0, CSETBLOCK_SINGLE_OPER);\r
-       if ( old == 0) {\r
-               memcpy(block0+8, oldblock0+8, 8);\r
-               PrintAndLog("block 0:  %s", sprint_hex(block0,16));\r
+       if (old == 0) {\r
+               memcpy(block0, oldblock0, 16);\r
+               PrintAndLog("old block 0:  %s", sprint_hex(block0,16));\r
        } else {\r
-               PrintAndLog("Couldn't get olddata. Will write over the last bytes of Block 0.");\r
+               PrintAndLog("Couldn't get old data. Will write over the last bytes of Block 0.");\r
+       }\r
+\r
+       // fill in the new values\r
+       // UID\r
+       memcpy(block0, uid, 4); \r
+       // Mifare UID BCC\r
+       block0[4] = block0[0]^block0[1]^block0[2]^block0[3];\r
+       // mifare classic SAK(byte 5) and ATQA(byte 6 and 7, reversed)\r
+       if (sak!=NULL)\r
+               block0[5]=sak[0];\r
+       if (atqa!=NULL) {\r
+               block0[6]=atqa[1];\r
+               block0[7]=atqa[0];\r
        }\r
+       PrintAndLog("new block 0:  %s", sprint_hex(block0,16));\r
        return mfCSetBlock(0, block0, oldUID, wantWipe, CSETBLOCK_SINGLE_OPER);\r
 }\r
 \r
@@ -301,9 +304,9 @@ int mfCGetBlock(uint8_t blockNo, uint8_t *data, uint8_t params) {
 static uint8_t trailerAccessBytes[4] = {0x08, 0x77, 0x8F, 0x00};\r
 \r
 // variables\r
-char logHexFileName[200] = {0x00};\r
+char logHexFileName[FILE_PATH_SIZE] = {0x00};\r
 static uint8_t traceCard[4096] = {0x00};\r
-static char traceFileName[200] = {0x00};\r
+static char traceFileName[FILE_PATH_SIZE] = {0x00};\r
 static int traceState = TRACE_IDLE;\r
 static uint8_t traceCurBlock = 0;\r
 static uint8_t traceCurKey = 0;\r
@@ -351,10 +354,15 @@ int loadTraceCard(uint8_t *tuid) {
        FillFileNameByUID(traceFileName, tuid, ".eml", 7);\r
 \r
        f = fopen(traceFileName, "r");\r
-       if (!f) return 1;\r
+       if (!f) {\r
+               fclose(f);\r
+               return 1;\r
+       }\r
        \r
        blockNum = 0;\r
+               \r
        while(!feof(f)){\r
+       \r
                memset(buf, 0, sizeof(buf));\r
                if (fgets(buf, sizeof(buf), f) == NULL) {\r
                        PrintAndLog("File reading error.");\r
@@ -386,13 +394,17 @@ int saveTraceCard(void) {
        if ((!strlen(traceFileName)) || (isTraceCardEmpty())) return 0;\r
        \r
        f = fopen(traceFileName, "w+");\r
+       if ( !f ) {\r
+               fclose(f);\r
+               return 1;\r
+       }\r
+       \r
        for (int i = 0; i < 64; i++) {  // blocks\r
                for (int j = 0; j < 16; j++)  // bytes\r
                        fprintf(f, "%02x", *(traceCard + i * 16 + j)); \r
                fprintf(f,"\n");\r
        }\r
        fclose(f);\r
-\r
        return 0;\r
 }\r
 \r
Impressum, Datenschutz