-\r
- if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, i,downlink_mode)) {\r
- PrintAndLog("Aquireing data from device failed. Quitting");\r
- free(keyBlock);\r
- return 0;\r
- }\r
- found = tryDetectModulation();\r
-\r
- if (found) break;\r
- i++;\r
- }\r
-\r
- PrintAndLog("");\r
-\r
- if (found)\r
- PrintAndLog("Found valid password: [%08x]", i);\r
- else\r
- PrintAndLog("Password NOT found. Last tried: [%08x]", --i);\r
-\r
- free(keyBlock);\r
- return 0;\r
-}\r
-\r
-int CmdT55xxBruteForce_downlink(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
- uint8_t downlink_mode = 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
- uint32_t end_password = 0xFFFFFFFF; //end password\r
- bool found = false;\r
- uint8_t cmdp = 0;\r
- int cmd_offset = 0;\r
- int errors = 0;\r
- int len;\r
- bool use_file = false;\r
- bool use_range = false;\r
- bool try_all_dl_modes = false;\r
- uint8_t dl_mode = 0;\r
- \r
- keyBlock = calloc(stKeyBlock, 6);\r
- if (keyBlock == NULL) return 1;\r
-\r
- while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {\r
- switch(param_getchar(Cmd, cmdp)) {\r
- case 'h':\r
- case 'H':\r
- return usage_t55xx_bruteforce_downlink();\r
- case 'e':\r
- case 'E':\r
- downlink_mode = param_getchar(Cmd, cmdp+1) - '0';\r
- if (downlink_mode == 4) try_all_dl_modes = true;\r
- if (downlink_mode > 3) downlink_mode = 0;\r
- cmdp +=2;\r
- cmd_offset += 4;\r
- break;\r
- case 'i':\r
- case 'I':\r
- if (use_range) {\r
- PrintAndLog ("use Range or File");\r
- return 0;\r
- }\r
- use_file = true;\r
- len = strlen(Cmd+2);\r
- if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;\r
- memcpy(filename, Cmd+cmd_offset+2, len);\r
- // Drop any characters after space\r
- char *p = strstr(filename," ");\r
- if (p) *p = 0;\r
- cmdp += 2;\r
- // PrintAndLog (" File : [%s]",filename);\r
- break;\r
- case 'r':\r
- case 'R':\r
- if (use_file) {\r
- PrintAndLog ("use Range or File");\r
- return 0;\r
- }\r
- use_range = true; \r
- start_password = param_get32ex(Cmd, cmdp+1, 0, 16);\r
- end_password = param_get32ex(Cmd, cmdp+2, 0, 16);\r
- cmdp += 3;\r
- cmd_offset += 20; \r
- break;\r
- default:\r
- PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));\r
- errors = true;\r
- break;\r
- }\r
- }\r
-\r
- if (use_file)\r
- {\r
- FILE * f = fopen( filename , "r");\r
-\r
- if ( !f ) {\r
- PrintAndLog("File: %s: not found or locked.", filename);\r
- free(keyBlock);\r
- return 1;\r
- }\r
-\r
- while( fgets(buf, sizeof(buf), f) ) {\r
- if (strlen(buf) < 8 || buf[7] == '\n') continue;\r
-\r
- while (fgetc(f) != '\n' && !feof(f)) ; //goto next line\r
-\r
- //The line start with # is comment, skip\r
- if( buf[0]=='#' ) continue;\r
-\r
- if (!isxdigit((unsigned char)buf[0])) {\r
- PrintAndLog("File content error. '%s' must include 8 HEX symbols", buf);\r
- continue;\r
- }\r
- \r
- buf[8] = 0;\r
-\r
- if ( stKeyBlock - keycnt < 2) {\r
- p = realloc(keyBlock, 6*(stKeyBlock+=10));\r
- if (!p) {\r
- PrintAndLog("Cannot allocate memory for defaultKeys");\r
- free(keyBlock);\r
- fclose(f);\r
- return 2;\r
- }\r
- keyBlock = p;\r
- }\r
- memset(keyBlock + 4 * keycnt, 0, 4);\r
- num_to_bytes(strtoll(buf, NULL, 16), 4, keyBlock + 4*keycnt);\r
- PrintAndLog("chk custom pwd[%2d] %08X", keycnt, bytes_to_num(keyBlock + 4*keycnt, 4));\r
- keycnt++;\r
- memset(buf, 0, sizeof(buf));\r
- }\r
- fclose(f);\r
- \r
- if (keycnt == 0) {\r
- PrintAndLog("No keys found in file");\r
- free(keyBlock);\r
- return 1;\r
- }\r
- PrintAndLog("Loaded %d keys", keycnt);\r
- \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
- free(keyBlock);\r
- return 0;\r
- }\r
-\r
- testpwd = bytes_to_num(keyBlock + 4*c, 4);\r
-\r
- PrintAndLog("Testing %08X", testpwd);\r
- \r
- // Try each downlink_mode if asked to \r
- // donwlink_mode will = 0 if > 3 or set to 0, so loop from 0 - 3\r
- for (dl_mode = downlink_mode; dl_mode <= 3; dl_mode++)\r
- {\r
- if ( !AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, testpwd,dl_mode)) {\r
- PrintAndLog("Aquireing data from device failed. Quitting");\r
- free(keyBlock);\r
- return 0;\r
- }\r
-\r
- found = tryDetectModulation();\r
-\r
- if ( found ) {\r
- PrintAndLog("Found valid password: [%08X]", testpwd);\r
- free(keyBlock);\r
- // Add downlink mode for reference.\r
- switch (dl_mode) {\r
- case 0 : PrintAndLog ("Downlink : e 0 - Default/Fixed Bit Length"); break;\r
- case 1 : PrintAndLog ("Downlink : e 1 - Long Leading Reference"); break;\r
- case 2 : PrintAndLog ("Downlink : e 2 - Leading Zero Reference"); break;\r
- case 3 : PrintAndLog ("Downlink : e 3 - 1 of 4 Coding"); break;\r
- }\r
- return 0;\r
- }\r
- if (!try_all_dl_modes) // Exit loop\r
- dl_mode = 4;\r
- }\r
- }\r
- PrintAndLog("Password NOT found.");\r
- free(keyBlock);\r
- return 0;\r
- }\r
-\r
- if (use_range)\r
- {\r
-\r
- if ( start_password >= end_password ) {\r
- free(keyBlock);\r
- return usage_t55xx_bruteforce_downlink();\r
- }\r
- PrintAndLog("Search password range [%08X -> %08X]", start_password, end_password);\r
-\r
- uint32_t i = start_password;\r
-\r
- while ((!found) && (i <= end_password)) {\r
-\r
- printf(".");\r
- fflush(stdout);\r
- if (ukbhit()) {\r
- ch = getchar();\r
- (void)ch;\r
- printf("\naborted via keyboard!\n");\r
- free(keyBlock);\r
- return 0;\r
- }\r
-\r
- if (!AquireData(T55x7_PAGE0, T55x7_CONFIGURATION_BLOCK, true, i,downlink_mode)) {\r
- PrintAndLog("Aquireing data from device failed. Quitting");\r