]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlft55xx.c
FIX: 'hw tune' - peakf shouldn't be compare with voltages limits :)
[proxmark3-svn] / client / cmdlft55xx.c
index f0a6fe94644d1daced9b06ccb10c302e4126e6a4..f30bc5ce2146a676f54154d1677f7efba7ffdf98 100644 (file)
@@ -42,13 +42,13 @@ void Set_t55xx_Config(t55xx_conf_block_t conf){
 int usage_t55xx_config(){\r
        PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1] [o <offset>] [Q5]");\r
        PrintAndLog("Options:");\r
 int usage_t55xx_config(){\r
        PrintAndLog("Usage: lf t55xx config [d <demodulation>] [i 1] [o <offset>] [Q5]");\r
        PrintAndLog("Options:");\r
-       PrintAndLog("       h                        This help");\r
-       PrintAndLog("       b <8|16|32|40|50|64|100|128>     Set bitrate");\r
-       PrintAndLog("       d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NRZ|BI|BIa>  Set demodulation FSK / ASK / PSK / NRZ / Biphase / Biphase A");\r
-       PrintAndLog("       i [1]                            Invert data signal, defaults to normal");\r
-       PrintAndLog("       o [offset]                       Set offset, where data should start decode in bitstream");\r
-       PrintAndLog("       Q5                            Set as Q5(T5555) chip instead of T55x7");\r
-       PrintAndLog("       ST                            Set Sequence Terminator on");\r
+       PrintAndLog("       h                                - This help");\r
+       PrintAndLog("       b <8|16|32|40|50|64|100|128>     Set bitrate");\r
+       PrintAndLog("       d <FSK|FSK1|FSK1a|FSK2|FSK2a|ASK|PSK1|PSK2|NRZ|BI|BIa>  Set demodulation FSK / ASK / PSK / NRZ / Biphase / Biphase A");\r
+       PrintAndLog("       i [1]                            Invert data signal, defaults to normal");\r
+       PrintAndLog("       o [offset]                       Set offset, where data should start decode in bitstream");\r
+       PrintAndLog("       Q5                               - Set as Q5(T5555) chip instead of T55x7");\r
+       PrintAndLog("       ST                               - Set Sequence Terminator on");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx config d FSK          - FSK demodulation");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx config d FSK          - FSK demodulation");\r
@@ -92,7 +92,7 @@ int usage_t55xx_write(){
 int usage_t55xx_trace() {\r
        PrintAndLog("Usage:  lf t55xx trace [1]");\r
        PrintAndLog("Options:");\r
 int usage_t55xx_trace() {\r
        PrintAndLog("Usage:  lf t55xx trace [1]");\r
        PrintAndLog("Options:");\r
-       PrintAndLog("     [graph buffer data]  - if set, use Graphbuffer otherwise read data from tag.");\r
+       PrintAndLog("     1             - if set, use Graphbuffer otherwise read data from tag.");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx trace");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx trace");\r
@@ -103,7 +103,7 @@ int usage_t55xx_trace() {
 int usage_t55xx_info() {\r
        PrintAndLog("Usage:  lf t55xx info [1]");\r
        PrintAndLog("Options:");\r
 int usage_t55xx_info() {\r
        PrintAndLog("Usage:  lf t55xx info [1]");\r
        PrintAndLog("Options:");\r
-       PrintAndLog("     [graph buffer data]  - if set, use Graphbuffer otherwise read data from tag.");\r
+       PrintAndLog("     1             - if set, use Graphbuffer otherwise read data from tag.");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx info");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("      lf t55xx info");\r
@@ -150,7 +150,8 @@ int usage_t55xx_wakup(){
 int usage_t55xx_bruteforce(){\r
        PrintAndLog("This command uses A) bruteforce to scan a number range");\r
        PrintAndLog("                  B) a dictionary attack");\r
 int usage_t55xx_bruteforce(){\r
        PrintAndLog("This command uses A) bruteforce to scan a number range");\r
        PrintAndLog("                  B) a dictionary attack");\r
-    PrintAndLog("Usage: lf t55xx bruteforce <start password> <end password> [i <*.dic>]");\r
+       PrintAndLog("press 'enter' to cancel the command");\r
+    PrintAndLog("Usage: lf t55xx bruteforce [h] <start password> <end password> [i <*.dic>]");\r
     PrintAndLog("       password must be 4 bytes (8 hex symbols)");\r
        PrintAndLog("Options:");\r
        PrintAndLog("     h                     - this help");\r
     PrintAndLog("       password must be 4 bytes (8 hex symbols)");\r
        PrintAndLog("Options:");\r
        PrintAndLog("     h                     - this help");\r
@@ -166,13 +167,14 @@ int usage_t55xx_bruteforce(){
 }\r
 int usage_t55xx_recoverpw(){\r
        PrintAndLog("This command uses a few tricks to try to recover mangled password");\r
 }\r
 int usage_t55xx_recoverpw(){\r
        PrintAndLog("This command uses a few tricks to try to recover mangled password");\r
+       PrintAndLog("press 'enter' to cancel the command");\r
        PrintAndLog("WARNING: this may brick non-password protected chips!");\r
        PrintAndLog("Usage: lf t55xx recoverpw [password]");\r
        PrintAndLog("       password must be 4 bytes (8 hex symbols)");\r
        PrintAndLog("       default password is 51243648, used by many cloners");\r
        PrintAndLog("Options:");\r
        PrintAndLog("     h           - this help");\r
        PrintAndLog("WARNING: this may brick non-password protected chips!");\r
        PrintAndLog("Usage: lf t55xx recoverpw [password]");\r
        PrintAndLog("       password must be 4 bytes (8 hex symbols)");\r
        PrintAndLog("       default password is 51243648, used by many cloners");\r
        PrintAndLog("Options:");\r
        PrintAndLog("     h           - this help");\r
-       PrintAndLog("     [password] - 4 byte hex value of password written by cloner");\r
+       PrintAndLog("     [password]  - 4 byte hex value of password written by cloner");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("       lf t55xx recoverpw");\r
        PrintAndLog("");\r
        PrintAndLog("Examples:");\r
        PrintAndLog("       lf t55xx recoverpw");\r
@@ -195,8 +197,8 @@ static int CmdHelp(const char *Cmd);
 \r
 void printT5xxHeader(uint8_t page){\r
        PrintAndLog("Reading Page %d:", page);  \r
 \r
 void printT5xxHeader(uint8_t page){\r
        PrintAndLog("Reading Page %d:", page);  \r
-       PrintAndLog("blk | hex data | binary");\r
-       PrintAndLog("----+----------+---------------------------------");       \r
+       PrintAndLog("blk | hex data | binary                           | ascii");\r
+       PrintAndLog("----+----------+----------------------------------+-------");      \r
 }\r
 \r
 int CmdT55xxSetConfig(const char *Cmd) {\r
 }\r
 \r
 int CmdT55xxSetConfig(const char *Cmd) {\r
@@ -547,6 +549,11 @@ bool tryDetectModulation(){
                clk = GetAskClock("", FALSE, FALSE);\r
                if (clk>0) {\r
                        tests[hits].ST = TRUE;\r
                clk = GetAskClock("", FALSE, FALSE);\r
                if (clk>0) {\r
                        tests[hits].ST = TRUE;\r
+                       // "0 0 1 " == clock auto, invert false, maxError 1.\r
+                       // false = no verbose\r
+                       // false = no emSearch\r
+                       // 1 = Ask/Man\r
+                       // st = true\r
                        if ( ASKDemod_ext("0 0 1", FALSE, FALSE, 1, &tests[hits].ST) && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
                                tests[hits].modulation = DEMOD_ASK;\r
                                tests[hits].bitrate = bitRate;\r
                        if ( ASKDemod_ext("0 0 1", FALSE, FALSE, 1, &tests[hits].ST) && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
                                tests[hits].modulation = DEMOD_ASK;\r
                                tests[hits].bitrate = bitRate;\r
@@ -555,6 +562,11 @@ bool tryDetectModulation(){
                                ++hits;\r
                        }\r
                        tests[hits].ST = TRUE;\r
                                ++hits;\r
                        }\r
                        tests[hits].ST = TRUE;\r
+                       // "0 0 1 " == clock auto, invert true, maxError 1.\r
+                       // false = no verbose\r
+                       // false = no emSearch\r
+                       // 1 = Ask/Man\r
+                       // st = true\r
                        if ( ASKDemod_ext("0 1 1", FALSE, FALSE, 1, &tests[hits].ST)  && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
                                tests[hits].modulation = DEMOD_ASK;\r
                                tests[hits].bitrate = bitRate;\r
                        if ( ASKDemod_ext("0 1 1", FALSE, FALSE, 1, &tests[hits].ST)  && test(DEMOD_ASK, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
                                tests[hits].modulation = DEMOD_ASK;\r
                                tests[hits].bitrate = bitRate;\r
@@ -664,13 +676,46 @@ bool tryDetectModulation(){
                return TRUE;\r
        }\r
        \r
                return TRUE;\r
        }\r
        \r
+       bool retval = FALSE;\r
        if ( hits > 1) {\r
                PrintAndLog("Found [%d] possible matches for modulation.",hits);\r
                for(int i=0; i<hits; ++i){\r
        if ( hits > 1) {\r
                PrintAndLog("Found [%d] possible matches for modulation.",hits);\r
                for(int i=0; i<hits; ++i){\r
-                       PrintAndLog("--[%d]---------------", i+1);\r
+                       retval = testKnownConfigBlock(tests[i].block0);\r
+                       if ( retval ) {                         \r
+                               PrintAndLog("--[%d]--------------- << selected this", i+1);\r
+                               config.modulation = tests[i].modulation;\r
+                               config.bitrate = tests[i].bitrate;\r
+                               config.inverted = tests[i].inverted;\r
+                               config.offset = tests[i].offset;\r
+                               config.block0 = tests[i].block0;\r
+                               config.Q5 = tests[i].Q5;\r
+                               config.ST = tests[i].ST;\r
+                       } else {\r
+                               PrintAndLog("--[%d]---------------", i+1);\r
+                       }\r
                        printConfiguration( tests[i] );\r
                }\r
        }\r
                        printConfiguration( tests[i] );\r
                }\r
        }\r
+       return retval;\r
+}\r
+\r
+bool testKnownConfigBlock(uint32_t block0) {\r
+       switch(block0){\r
+               case T55X7_DEFAULT_CONFIG_BLOCK:\r
+               case T55X7_RAW_CONFIG_BLOCK:\r
+               case T55X7_EM_UNIQUE_CONFIG_BLOCK:\r
+               case T55X7_FDXB_CONFIG_BLOCK:\r
+               case T55X7_HID_26_CONFIG_BLOCK:\r
+               case T55X7_PYRAMID_CONFIG_BLOCK:\r
+               case T55X7_INDALA_64_CONFIG_BLOCK:\r
+               case T55X7_INDALA_224_CONFIG_BLOCK:\r
+               case T55X7_GUARDPROXII_CONFIG_BLOCK:\r
+               case T55X7_VIKING_CONFIG_BLOCK:\r
+               case T55X7_NORALYS_CONFIG_BLOCK:\r
+               case T55X7_IOPROX_CONFIG_BLOCK:\r
+               case T55X7_PRESCO_CONFIG_BLOCK:\r
+                       return TRUE;\r
+       }\r
        return FALSE;\r
 }\r
 \r
        return FALSE;\r
 }\r
 \r
@@ -854,16 +899,18 @@ void printT55xxBlock(const char *blockNum){
                bits[i - config.offset] = DemodBuffer[i];\r
 \r
        blockData = PackBits(0, 32, bits);\r
                bits[i - config.offset] = DemodBuffer[i];\r
 \r
        blockData = PackBits(0, 32, bits);\r
+       uint8_t bytes[4] = {0};\r
+       num_to_bytes(blockData, 4, bytes);\r
 \r
 \r
-       PrintAndLog(" %s | %08X | %s", blockNum, blockData, sprint_bin(bits,32));\r
+       PrintAndLog(" %s | %08X | %s | %s", blockNum, blockData, sprint_bin(bits,32), sprint_ascii(bytes,4));\r
 }\r
 \r
 int special(const char *Cmd) {\r
        uint32_t blockData = 0;\r
        uint8_t bits[32] = {0x00};\r
 \r
 }\r
 \r
 int special(const char *Cmd) {\r
        uint32_t blockData = 0;\r
        uint8_t bits[32] = {0x00};\r
 \r
-       PrintAndLog("OFFSET | DATA  | BINARY");\r
-       PrintAndLog("----------------------------------------------------");\r
+       PrintAndLog("OFFSET | DATA  | BINARY                              | ASCII");\r
+       PrintAndLog("-------+-------+-------------------------------------+------");\r
        int i,j = 0;\r
        for (; j < 64; ++j){\r
                \r
        int i,j = 0;\r
        for (; j < 64; ++j){\r
                \r
@@ -983,7 +1030,7 @@ int CmdT55xxWriteBlock(const char *Cmd) {
        }\r
        clearCommandBuffer();\r
        SendCommand(&c);\r
        }\r
        clearCommandBuffer();\r
        SendCommand(&c);\r
-       if (!WaitForResponseTimeout(CMD_ACK, &resp, 1000)){\r
+       if (!WaitForResponseTimeout(CMD_ACK, &resp, 1500)){\r
                PrintAndLog("Error occurred, device did not ACK write operation. (May be due to old firmware)");\r
                return 0;\r
        }\r
                PrintAndLog("Error occurred, device did not ACK write operation. (May be due to old firmware)");\r
                return 0;\r
        }\r
@@ -1249,21 +1296,26 @@ int CmdT55xxDump(const char *Cmd){
 \r
 int AquireData( uint8_t page, uint8_t block, bool pwdmode, uint32_t password ){\r
        // arg0 bitmodes:\r
 \r
 int AquireData( uint8_t page, uint8_t block, bool pwdmode, uint32_t password ){\r
        // arg0 bitmodes:\r
-       // bit0 = pwdmode\r
-       // bit1 = page to read from\r
+       //      bit0 = pwdmode\r
+       //      bit1 = page to read from\r
+       // arg1: which block to read\r
+       // arg2: password\r
        uint8_t arg0 = (page<<1) | pwdmode;\r
        UsbCommand c = {CMD_T55XX_READ_BLOCK, {arg0, block, password}};\r
        uint8_t arg0 = (page<<1) | pwdmode;\r
        UsbCommand c = {CMD_T55XX_READ_BLOCK, {arg0, block, password}};\r
-       \r
        clearCommandBuffer();\r
        SendCommand(&c);\r
        clearCommandBuffer();\r
        SendCommand(&c);\r
-       if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {\r
+       if ( !WaitForResponseTimeout(CMD_ACK, NULL, 2500) ) {\r
                PrintAndLog("command execution time out");\r
                return 0;\r
        }\r
 \r
                PrintAndLog("command execution time out");\r
                return 0;\r
        }\r
 \r
-       uint8_t got[12000];\r
-       GetFromBigBuf(got,sizeof(got),0);\r
-       WaitForResponse(CMD_ACK,NULL);\r
+       //uint8_t got[12288];\r
+       uint8_t got[7679];\r
+       GetFromBigBuf(got, sizeof(got), 0);\r
+       if ( !WaitForResponseTimeout(CMD_ACK, NULL, 8000) ) {\r
+               PrintAndLog("command execution time out");\r
+               return 0;\r
+       }\r
        setGraphBuf(got, sizeof(got));\r
        return 1;\r
 }\r
        setGraphBuf(got, sizeof(got));\r
        return 1;\r
 }\r
@@ -1406,11 +1458,10 @@ int CmdT55xxWipe(const char *Cmd) {
        // With a pwd should work even if pwd bit not set\r
        PrintAndLog("\nBeginning Wipe of a T55xx tag (assuming the tag is not password protected)\n");\r
                \r
        // With a pwd should work even if pwd bit not set\r
        PrintAndLog("\nBeginning Wipe of a T55xx tag (assuming the tag is not password protected)\n");\r
                \r
-       if ( Q5 ){\r
+       if ( Q5 )\r
                snprintf(ptrData,sizeof(writeData),"b 0 d 6001F004 p 0");\r
                snprintf(ptrData,sizeof(writeData),"b 0 d 6001F004 p 0");\r
-       } else {\r
+       else\r
                snprintf(ptrData,sizeof(writeData),"b 0 d 000880E0 p 0");\r
                snprintf(ptrData,sizeof(writeData),"b 0 d 000880E0 p 0");\r
-       }\r
        \r
        if (!CmdT55xxWriteBlock(ptrData)) PrintAndLog("Error writing blk 0");\r
        \r
        \r
        if (!CmdT55xxWriteBlock(ptrData)) PrintAndLog("Error writing blk 0");\r
        \r
@@ -1425,13 +1476,22 @@ int CmdT55xxWipe(const char *Cmd) {
        return 0;\r
 }\r
 \r
        return 0;\r
 }\r
 \r
+bool IsCancelled(void) {\r
+       if (ukbhit()) {\r
+               int ch = getchar();\r
+               (void)ch;\r
+               printf("\naborted via keyboard!\n");\r
+               return TRUE;\r
+       }\r
+       return FALSE;\r
+}\r
+\r
 int CmdT55xxBruteForce(const char *Cmd) {\r
        \r
        // load a default pwd file.\r
        char buf[9];\r
        char filename[FILE_PATH_SIZE]={0};\r
        int     keycnt = 0;\r
 int CmdT55xxBruteForce(const char *Cmd) {\r
        \r
        // load a default pwd file.\r
        char buf[9];\r
        char filename[FILE_PATH_SIZE]={0};\r
        int     keycnt = 0;\r
-       int ch;\r
        uint8_t stKeyBlock = 20;\r
        uint8_t *keyBlock = NULL, *p = NULL;\r
     uint32_t start_password = 0x00000000; //start password\r
        uint8_t stKeyBlock = 20;\r
        uint8_t *keyBlock = NULL, *p = NULL;\r
     uint32_t start_password = 0x00000000; //start password\r
@@ -1450,8 +1510,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
                if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
                memcpy(filename, Cmd+2, len);\r
        \r
                if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
                memcpy(filename, Cmd+2, len);\r
        \r
-               FILE * f = fopen( filename , "r");\r
-               \r
+               FILE * f = fopen( filename , "r");              \r
                if ( !f ) {\r
                        PrintAndLog("File: %s: not found or locked.", filename);\r
                        free(keyBlock);\r
                if ( !f ) {\r
                        PrintAndLog("File: %s: not found or locked.", filename);\r
                        free(keyBlock);\r
@@ -1478,7 +1537,10 @@ int CmdT55xxBruteForce(const char *Cmd) {
                                if (!p) {\r
                                        PrintAndLog("Cannot allocate memory for defaultKeys");\r
                                        free(keyBlock);\r
                                if (!p) {\r
                                        PrintAndLog("Cannot allocate memory for defaultKeys");\r
                                        free(keyBlock);\r
-                                       fclose(f);\r
+                                       if (f) {\r
+                                               fclose(f);\r
+                                               f = NULL;\r
+                                       }\r
                                        return 2;\r
                                }\r
                                keyBlock = p;\r
                                        return 2;\r
                                }\r
                                keyBlock = p;\r
@@ -1489,8 +1551,10 @@ int CmdT55xxBruteForce(const char *Cmd) {
                        keycnt++;\r
                        memset(buf, 0, sizeof(buf));\r
                }               \r
                        keycnt++;\r
                        memset(buf, 0, sizeof(buf));\r
                }               \r
-               fclose(f);\r
-               \r
+               if (f) {\r
+                       fclose(f);\r
+                       f = NULL;\r
+               }\r
                if (keycnt == 0) {\r
                        PrintAndLog("No keys found in file");\r
                        free(keyBlock);\r
                if (keycnt == 0) {\r
                        PrintAndLog("No keys found in file");\r
                        free(keyBlock);\r
@@ -1501,11 +1565,14 @@ int CmdT55xxBruteForce(const char *Cmd) {
                // loop\r
                uint64_t testpwd = 0x00;\r
                for (uint16_t c = 0; c < keycnt; ++c ) {\r
                // loop\r
                uint64_t testpwd = 0x00;\r
                for (uint16_t c = 0; c < keycnt; ++c ) {\r
-       \r
-                       if (ukbhit()) {\r
-                               ch = getchar();\r
-                               (void)ch;\r
-                               printf("\naborted via keyboard!\n");\r
+\r
+                       if ( offline ) {\r
+                               printf("Device offline\n");\r
+                               free(keyBlock);\r
+                               return  2;\r
+                       }\r
+               \r
+                       if (IsCancelled()) {\r
                                free(keyBlock);\r
                                return 0;\r
                        }\r
                                free(keyBlock);\r
                                return 0;\r
                        }\r
@@ -1513,8 +1580,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
                        testpwd = bytes_to_num(keyBlock + 4*c, 4);\r
 \r
                        PrintAndLog("Testing %08X", testpwd);\r
                        testpwd = bytes_to_num(keyBlock + 4*c, 4);\r
 \r
                        PrintAndLog("Testing %08X", testpwd);\r
-                       \r
-                       \r
+                                               \r
                        if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, TRUE, testpwd)) {\r
                                PrintAndLog("Aquireing data from device failed. Quitting");\r
                                free(keyBlock);\r
                        if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, TRUE, testpwd)) {\r
                                PrintAndLog("Aquireing data from device failed. Quitting");\r
                                free(keyBlock);\r
@@ -1522,7 +1588,6 @@ int CmdT55xxBruteForce(const char *Cmd) {
                        }\r
                        \r
                        found = tryDetectModulation();\r
                        }\r
                        \r
                        found = tryDetectModulation();\r
-\r
                        if ( found ) {\r
                                PrintAndLog("Found valid password: [%08X]", testpwd);\r
                                free(keyBlock);\r
                        if ( found ) {\r
                                PrintAndLog("Found valid password: [%08X]", testpwd);\r
                                free(keyBlock);\r
@@ -1553,10 +1618,8 @@ int CmdT55xxBruteForce(const char *Cmd) {
 \r
                printf(".");\r
                fflush(stdout);\r
 \r
                printf(".");\r
                fflush(stdout);\r
-               if (ukbhit()) {\r
-                       ch = getchar();\r
-                       (void)ch;\r
-                       printf("\naborted via keyboard!\n");\r
+               \r
+               if (IsCancelled()) {\r
                        free(keyBlock);\r
                        return 0;\r
                }\r
                        free(keyBlock);\r
                        return 0;\r
                }\r
@@ -1583,8 +1646,7 @@ int CmdT55xxBruteForce(const char *Cmd) {
     return 0;\r
 }\r
 \r
     return 0;\r
 }\r
 \r
-int tryOnePassword(uint32_t password)\r
-{\r
+int tryOnePassword(uint32_t password) {\r
        PrintAndLog("Trying password %08x", password);\r
        if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, TRUE, password)) {\r
                PrintAndLog("Aquireing data from device failed. Quitting");\r
        PrintAndLog("Trying password %08x", password);\r
        if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, TRUE, password)) {\r
                PrintAndLog("Aquireing data from device failed. Quitting");\r
@@ -1593,7 +1655,8 @@ int tryOnePassword(uint32_t password)
 \r
        if (tryDetectModulation())\r
                return 1;\r
 \r
        if (tryDetectModulation())\r
                return 1;\r
-       else return 0;\r
+       else \r
+               return 0;\r
 }\r
 \r
 int CmdT55xxRecoverPW(const char *Cmd) {\r
 }\r
 \r
 int CmdT55xxRecoverPW(const char *Cmd) {\r
@@ -1618,6 +1681,8 @@ int CmdT55xxRecoverPW(const char *Cmd) {
                else if (found == -1)\r
                        return 0;\r
                bit++;\r
                else if (found == -1)\r
                        return 0;\r
                bit++;\r
+               \r
+               if (IsCancelled()) return 0;\r
        }\r
 \r
        // now try to use partial original password, since block 7 should have been completely\r
        }\r
 \r
        // now try to use partial original password, since block 7 should have been completely\r
@@ -1640,7 +1705,9 @@ int CmdT55xxRecoverPW(const char *Cmd) {
                else if (found == -1)\r
                        return 0;\r
                bit++;\r
                else if (found == -1)\r
                        return 0;\r
                bit++;\r
-               prev_password=curr_password;\r
+               prev_password = curr_password;\r
+               \r
+               if (IsCancelled()) return 0;\r
        }\r
 \r
        // from high bit to low\r
        }\r
 \r
        // from high bit to low\r
@@ -1660,7 +1727,9 @@ int CmdT55xxRecoverPW(const char *Cmd) {
                else if (found == -1)\r
                        return 0;\r
                bit++;\r
                else if (found == -1)\r
                        return 0;\r
                bit++;\r
-               prev_password=curr_password;\r
+               prev_password = curr_password;\r
+               \r
+               if (IsCancelled()) return 0;\r
        }\r
 done:\r
        PrintAndLog("");\r
        }\r
 done:\r
        PrintAndLog("");\r
Impressum, Datenschutz