From d48175d4f477d7c0d4b932b4212898b236a82356 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Thu, 15 Dec 2016 00:01:31 +0100 Subject: [PATCH] FIX: 'lf presco' demod fixes. ADD: 'lf search' now also looks for Presco. I know that the helptext is wrong (d should be p) --- client/cmdlf.c | 5 +++++ client/cmdlfpresco.c | 42 ++++++++++++++++++++++++++---------------- client/cmdlfpresco.h | 2 ++ common/lfdemod.c | 9 ++++----- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/client/cmdlf.c b/client/cmdlf.c index 63e8a2b5..e157baff 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -1104,6 +1104,11 @@ int CmdLFfind(const char *Cmd) { PrintAndLog("\nValid Visa2000 ID Found!"); return 1; } + ans=CmdPrescoDemod(""); + if (ans>0) { + PrintAndLog("\nValid Presco ID Found!"); + return 1; + } // TIdemod? diff --git a/client/cmdlfpresco.c b/client/cmdlfpresco.c index 3bf5e1be..8a9f8c5d 100644 --- a/client/cmdlfpresco.c +++ b/client/cmdlfpresco.c @@ -54,7 +54,7 @@ int GetWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode case 'H': hex = true; //get hex - *fullcode = param_get32ex(Cmd, cmdp+1, 0, 10); + *fullcode = param_get32ex(Cmd, cmdp+1, 0, 16); cmdp+=2; break; case 'P': @@ -115,34 +115,44 @@ int GetPrescoBits(uint32_t fullcode, uint8_t *prescoBits) { //see ASKDemod for what args are accepted int CmdPrescoDemod(const char *Cmd) { - if (!ASKDemod(Cmd, false, false, 1)) { - if (g_debugMode) PrintAndLog("ASKDemod failed"); + bool st = true; + //if (!ASKDemod(Cmd, false, false, 1)) { + if (!ASKDemod_ext("32 0 0", FALSE, FALSE, 1, &st)) { + if (g_debugMode) PrintAndLog("DEBUG: Error Presco ASKDemod failed"); return 0; } size_t size = DemodBufferLen; //call lfdemod.c demod for Viking int ans = PrescoDemod(DemodBuffer, &size); if (ans < 0) { - if (g_debugMode) PrintAndLog("Error Presco_Demod %d", ans); + if (g_debugMode){ + if (ans == -1) + PrintAndLog("DEBUG: Error - Presco: too few bits found"); + else if (ans == -2) + PrintAndLog("DEBUG: Error - Presco: preamble not found"); + else if (ans == -3) + PrintAndLog("DEBUG: Error - Presco: Size not correct: %d", size); + else + PrintAndLog("DEBUG: Error - Presco: ans: %d", ans); + } return 0; } + setDemodBuf(DemodBuffer, 128, ans); + //got a good demod - uint32_t raw1 = bytebits_to_byte(DemodBuffer+ans, 32); - uint32_t raw2 = bytebits_to_byte(DemodBuffer+ans+32, 32); - uint32_t raw3 = bytebits_to_byte(DemodBuffer+ans+64, 32); - uint32_t raw4 = bytebits_to_byte(DemodBuffer+ans+96, 32); + uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); + uint32_t raw2 = bytebits_to_byte(DemodBuffer+32, 32); + uint32_t raw3 = bytebits_to_byte(DemodBuffer+64, 32); + uint32_t raw4 = bytebits_to_byte(DemodBuffer+96, 32); uint32_t cardid = raw4; - PrintAndLog("Presco Tag Found: Card ID %08X", cardid); - PrintAndLog("Raw: %08X%08X%08X%08X", raw1,raw2,raw3,raw4); - setDemodBuf(DemodBuffer+ans, 128, 0); - + PrintAndLog("Presco Tag Found: Card ID %08X, Raw: %08X%08X%08X%08X", cardid, raw1, raw2, raw3, raw4); + uint32_t sitecode = 0, usercode = 0, fullcode = 0; - bool Q5=false; + bool Q5 = false; char cmd[12] = {0}; sprintf(cmd, "H %08X", cardid); GetWiegandFromPresco(cmd, &sitecode, &usercode, &fullcode, &Q5); PrintAndLog("SiteCode %u, UserCode %u, FullCode, %08X", sitecode, usercode, fullcode); - return 1; } @@ -239,8 +249,8 @@ int CmdPrescoSim(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, {"read", CmdPrescoRead, 0, "Attempt to read and Extract tag data"}, - {"clone", CmdPrescoClone, 0, "d <9 digit ID> or h [Q5] clone presco tag"}, - {"sim", CmdPrescoSim, 0, "d <9 digit ID> or h simulate presco tag"}, + {"clone", CmdPrescoClone, 0, "d <9 digit ID> or h [Q5] clone presco tag"}, + {"sim", CmdPrescoSim, 0, "d <9 digit ID> or h simulate presco tag"}, {NULL, NULL, 0, NULL} }; diff --git a/client/cmdlfpresco.h b/client/cmdlfpresco.h index 69f68fd6..1157dbbb 100644 --- a/client/cmdlfpresco.h +++ b/client/cmdlfpresco.h @@ -21,6 +21,8 @@ int CmdLFPresco(const char *Cmd); int CmdPrescoClone(const char *Cmd); int CmdPrescoSim(const char *Cmd); +int CmdPrescoRead(const char *Cmd); +int CmdPrescoDemod(const char *Cmd); int GetWiegandFromPresco(const char *id, uint32_t *sitecode, uint32_t *usercode, uint32_t *fullcode, bool *Q5); diff --git a/common/lfdemod.c b/common/lfdemod.c index 11340ef0..73149602 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -711,13 +711,12 @@ int Visa2kDemod_AM(uint8_t *dest, size_t *size) { // find presco preamble 0x10D in already demoded data int PrescoDemod(uint8_t *dest, size_t *size) { - //make sure buffer has data - if (*size < 64*2) return -2; - + if (*size < 128*2) return -1; //make sure buffer has data size_t startIdx = 0; - uint8_t preamble[] = {1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0}; + uint8_t preamble[] = {0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0}; uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx); - if (errChk == 0) return -4; //preamble not found + if (errChk == 0) return -2; //preamble not found + if (*size != 128) return -3; //wrong demoded size //return start position return (int) startIdx; } -- 2.39.2