return 0;\r
}\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(" password must be 4 bytes (8 hex symbols)");\r
PrintAndLog("Options:");\r
PrintAndLog(" h - this help");\r
+ PrintAndLog(" <start_pwd> - 4 byte hex value to start pwd search at");\r
+ PrintAndLog(" <end_pwd> - 4 byte hex value to end pwd search at");\r
PrintAndLog(" i <*.dic> - loads a default keys dictionary file <*.dic>");\r
PrintAndLog("");\r
PrintAndLog("Examples:");\r
PrintAndLog(" lf t55xx bruteforce aaaaaaaa bbbbbbbb");\r
- PrintAndLog(" lf t55xx bruteforce i mykeys.dic");\r
+ PrintAndLog(" lf t55xx bruteforce i default_pwd.dic");\r
PrintAndLog("");\r
return 0;\r
}\r
uint8_t bitRate = 0;\r
uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};\r
uint8_t cmdp = 0;\r
- config.Q5 = FALSE;\r
bool errors = FALSE;\r
while(param_getchar(Cmd, cmdp) != 0x00 && !errors)\r
{\r
break;\r
case DEMOD_PSK1:\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
+ save_restoreGB(1);\r
CmdLtrim("160");\r
snprintf(cmdStr, sizeof(buf),"%d %d 6", bitRate[config.bitrate], config.inverted );\r
ans = PSKDemod(cmdStr, FALSE);\r
+ //undo trim samples\r
+ save_restoreGB(0);\r
break;\r
case DEMOD_PSK2: //inverted won't affect this\r
case DEMOD_PSK3: //not fully implemented\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
+ save_restoreGB(1);\r
CmdLtrim("160");\r
snprintf(cmdStr, sizeof(buf),"%d 0 6", bitRate[config.bitrate] );\r
ans = PSKDemod(cmdStr, FALSE);\r
psk1TOpsk2(DemodBuffer, DemodBufferLen);\r
+ //undo trim samples\r
+ save_restoreGB(0);\r
break;\r
case DEMOD_NRZ:\r
snprintf(cmdStr, sizeof(buf),"%d %d 1", bitRate[config.bitrate], config.inverted );\r
}\r
\r
int CmdT55xxDetect(const char *Cmd){\r
-\r
bool errors = FALSE;\r
bool useGB = FALSE;\r
bool usepwd = FALSE;\r
t55xx_conf_block_t tests[15];\r
int bitRate=0;\r
uint8_t fc1 = 0, fc2 = 0, clk=0;\r
- save_restoreGB(1);\r
\r
if (GetFskClock("", FALSE, FALSE)){ \r
fskClocks(&fc1, &fc2, &clk, FALSE);\r
tests[hits].modulation = DEMOD_FSK1;\r
else if (fc1 == 10 && fc2 == 8)\r
tests[hits].modulation = DEMOD_FSK2a;\r
-\r
tests[hits].bitrate = bitRate;\r
tests[hits].inverted = TRUE;\r
tests[hits].block0 = PackBits(tests[hits].offset, 32, DemodBuffer);\r
}\r
}\r
//undo trim from ask\r
- save_restoreGB(0);\r
+ //save_restoreGB(0);\r
clk = GetNrzClock("", FALSE, FALSE);\r
if (clk>0) {\r
if ( NRZrawDemod("0 0 1", FALSE) && test(DEMOD_NRZ, &tests[hits].offset, &bitRate, clk, &tests[hits].Q5)) {\r
}\r
}\r
\r
- //undo trim from nrz\r
- save_restoreGB(0);\r
+ // allow undo\r
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)\r
+ save_restoreGB(1);\r
CmdLtrim("160");\r
clk = GetPskClock("", FALSE, FALSE);\r
if (clk>0) {\r
}\r
} // inverse waves does not affect this demod\r
}\r
+ //undo trim samples\r
+ save_restoreGB(0);\r
} \r
- save_restoreGB(0); \r
if ( hits == 1) {\r
config.modulation = tests[0].modulation;\r
config.bitrate = tests[0].bitrate;\r
config.inverted = tests[0].inverted;\r
config.offset = tests[0].offset;\r
config.block0 = tests[0].block0;\r
+ config.Q5 = tests[0].Q5;\r
printConfiguration( config );\r
return TRUE;\r
}\r
return FALSE;\r
}\r
\r
+int convertQ5bitRate(uint8_t bitRateRead) {\r
+ uint8_t expected[] = {8, 16, 32, 40, 50, 64, 100, 128};\r
+ for (int i=0; i<8; i++)\r
+ if (expected[i] == bitRateRead)\r
+ return i;\r
+\r
+ return -1;\r
+}\r
+\r
bool testQ5(uint8_t mode, uint8_t *offset, int *fndBitRate, uint8_t clk){\r
\r
if ( DemodBufferLen < 64 ) return FALSE;\r
uint8_t safer = PackBits(si, 4, DemodBuffer); si += 4; //master key\r
uint8_t resv = PackBits(si, 8, DemodBuffer); si += 8;\r
// 2nibble must be zeroed.\r
- if (safer != 0x6) continue;\r
+ if (safer != 0x6 && safer != 0x9) continue;\r
if ( resv > 0x00) continue;\r
//uint8_t pageSel = PackBits(si, 1, DemodBuffer); si += 1;\r
//uint8_t fastWrite = PackBits(si, 1, DemodBuffer); si += 1;\r
si += 1+1;\r
- int bitRate = PackBits(si, 5, DemodBuffer)*2 + 2; si += 5; //bit rate\r
+ int bitRate = PackBits(si, 6, DemodBuffer)*2 + 2; si += 6; //bit rate\r
if (bitRate > 128 || bitRate < 8) continue;\r
\r
//uint8_t AOR = PackBits(si, 1, DemodBuffer); si += 1; \r
//test modulation\r
if (!testQ5Modulation(mode, modread)) continue;\r
if (bitRate != clk) continue;\r
- *fndBitRate = bitRate;\r
+ *fndBitRate = convertQ5bitRate(bitRate);\r
+ if (*fndBitRate < 0) continue;\r
*offset = idx;\r
\r
return TRUE;\r
\r
if (!DecodeT55xxBlock()) return 1;\r
\r
+ // too little space to start with\r
if ( DemodBufferLen < 32) return 1;\r
\r
+ // \r
+ PrintAndLog("Offset+32 ==%d\n DemodLen == %d", config.offset + 32,DemodBufferLen );\r
+ \r
+\r
+ \r
uint8_t si = config.offset;\r
uint32_t bl0 = PackBits(si, 32, DemodBuffer);\r
\r
\r
char *retStr = buf;\r
switch (id){\r
- case 0: \r
- snprintf(retStr,sizeof(buf),"%d - RF/8",id);\r
- break;\r
- case 1:\r
- snprintf(retStr,sizeof(buf),"%d - RF/16",id);\r
- break;\r
- case 2: \r
- snprintf(retStr,sizeof(buf),"%d - RF/32",id);\r
- break;\r
- case 3:\r
- snprintf(retStr,sizeof(buf),"%d - RF/40",id);\r
- break;\r
- case 4:\r
- snprintf(retStr,sizeof(buf),"%d - RF/50",id);\r
- break;\r
- case 5:\r
- snprintf(retStr,sizeof(buf),"%d - RF/64",id);\r
- break;\r
- case 6:\r
- snprintf(retStr,sizeof(buf),"%d - RF/100",id);\r
- break;\r
- case 7:\r
- snprintf(retStr,sizeof(buf),"%d - RF/128",id);\r
- break;\r
- default:\r
- snprintf(retStr,sizeof(buf),"%d - (Unknown)",id);\r
- break;\r
+ case 0: snprintf(retStr,sizeof(buf),"%d - RF/8",id); break;\r
+ case 1: snprintf(retStr,sizeof(buf),"%d - RF/16",id); break;\r
+ case 2: snprintf(retStr,sizeof(buf),"%d - RF/32",id); break;\r
+ case 3: snprintf(retStr,sizeof(buf),"%d - RF/40",id); break;\r
+ case 4: snprintf(retStr,sizeof(buf),"%d - RF/50",id); break;\r
+ case 5: snprintf(retStr,sizeof(buf),"%d - RF/64",id); break;\r
+ case 6: snprintf(retStr,sizeof(buf),"%d - RF/100",id); break;\r
+ case 7: snprintf(retStr,sizeof(buf),"%d - RF/128",id); break;\r
+ default: snprintf(retStr,sizeof(buf),"%d - (Unknown)",id); break;\r
}\r
-\r
return buf;\r
}\r
\r
if (!CmdT55xxWriteBlock(ptrData)) \r
PrintAndLog("Error writing blk %d", blk);\r
\r
- memset(writeData, sizeof(writeData), 0x00);\r
+ memset(writeData,0x00, sizeof(writeData));\r
}\r
return 0;\r
}\r
\r
static command_t CommandTable[] = {\r
{"help", CmdHelp, 1, "This help"},\r
- {"bruteforce", CmdT55xxBruteForce,0, "Simple bruteforce attack to find password"},\r
+ {"bruteforce",CmdT55xxBruteForce,0, "<start password> <end password> [i <*.dic>] Simple bruteforce attack to find password"},\r
{"config", CmdT55xxSetConfig, 1, "Set/Get T55XX configuration (modulation, inverted, offset, rate)"},\r
{"detect", CmdT55xxDetect, 1, "[1] Try detecting the tag modulation from reading the configuration block."},\r
{"dump", CmdT55xxDump, 0, "[password] [o] Dump T55xx card block 0-7. Optional [password], [override]"},\r