X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/bca71079315869b50f3bd0192ce984e2dfed0378..c528cf39896943c2c3738c7b8a54e9be153eb2ca:/client/cmdlfem4x.c diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c index 61b7047d..d139724c 100644 --- a/client/cmdlfem4x.c +++ b/client/cmdlfem4x.c @@ -11,19 +11,9 @@ #include #include #include -#include "proxmark3.h" -#include "ui.h" -#include "util.h" -#include "graph.h" -#include "cmdparser.h" -#include "cmddata.h" -#include "cmdlf.h" #include "cmdlfem4x.h" -#include "lfdemod.h" -#define llx PRIx64 - -char *global_em410xId; +uint64_t g_em410xid = 0; static int CmdHelp(const char *Cmd); @@ -57,10 +47,7 @@ int CmdEM410xRead(const char *Cmd) PrintAndLog ("EM410x XL pattern found"); return 0; } - char id[12] = {0x00}; - sprintf(id, "%010llx",lo); - - global_em410xId = id; + g_em410xid = lo; return 1; } @@ -68,10 +55,9 @@ int CmdEM410xRead(const char *Cmd) int CmdEM410xSim(const char *Cmd) { int i, n, j, binary[4], parity[4]; - - char cmdp = param_getchar(Cmd, 0); uint8_t uid[5] = {0x00}; + char cmdp = param_getchar(Cmd, 0); if (cmdp == 'h' || cmdp == 'H') { PrintAndLog("Usage: lf em4x em410xsim "); PrintAndLog(""); @@ -90,46 +76,45 @@ int CmdEM410xSim(const char *Cmd) PrintAndLog("Starting simulating UID %02X%02X%02X%02X%02X clock: %d", uid[0],uid[1],uid[2],uid[3],uid[4],clock); PrintAndLog("Press pm3-button to about simulation"); - /* clear our graph */ ClearGraph(0); - /* write 9 start bits */ - for (i = 0; i < 9; i++) - AppendGraph(0, clock, 1); - - /* for each hex char */ - parity[0] = parity[1] = parity[2] = parity[3] = 0; - for (i = 0; i < 10; i++) - { - /* read each hex char */ - sscanf(&Cmd[i], "%1x", &n); - for (j = 3; j >= 0; j--, n/= 2) - binary[j] = n % 2; - - /* append each bit */ - AppendGraph(0, clock, binary[0]); - AppendGraph(0, clock, binary[1]); - AppendGraph(0, clock, binary[2]); - AppendGraph(0, clock, binary[3]); - - /* append parity bit */ - AppendGraph(0, clock, binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); - - /* keep track of column parity */ - parity[0] ^= binary[0]; - parity[1] ^= binary[1]; - parity[2] ^= binary[2]; - parity[3] ^= binary[3]; - } + /* write 9 start bits */ + for (i = 0; i < 9; i++) + AppendGraph(0, clock, 1); + + /* for each hex char */ + parity[0] = parity[1] = parity[2] = parity[3] = 0; + for (i = 0; i < 10; i++) + { + /* read each hex char */ + sscanf(&Cmd[i], "%1x", &n); + for (j = 3; j >= 0; j--, n/= 2) + binary[j] = n % 2; + + /* append each bit */ + AppendGraph(0, clock, binary[0]); + AppendGraph(0, clock, binary[1]); + AppendGraph(0, clock, binary[2]); + AppendGraph(0, clock, binary[3]); + + /* append parity bit */ + AppendGraph(0, clock, binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); + + /* keep track of column parity */ + parity[0] ^= binary[0]; + parity[1] ^= binary[1]; + parity[2] ^= binary[2]; + parity[3] ^= binary[3]; + } - /* parity columns */ - AppendGraph(0, clock, parity[0]); - AppendGraph(0, clock, parity[1]); - AppendGraph(0, clock, parity[2]); - AppendGraph(0, clock, parity[3]); + /* parity columns */ + AppendGraph(0, clock, parity[0]); + AppendGraph(0, clock, parity[1]); + AppendGraph(0, clock, parity[2]); + AppendGraph(0, clock, parity[3]); - /* stop bit */ + /* stop bit */ AppendGraph(1, clock, 0); CmdLFSim("0"); //240 start_gap. @@ -161,11 +146,18 @@ int CmdEM410xWatch(const char *Cmd) } //currently only supports manchester modulations +// todo: helptext int CmdEM410xWatchnSpoof(const char *Cmd) { - CmdEM410xWatch(Cmd); - PrintAndLog("# Replaying captured ID: %s",global_em410xId); - CmdLFaskSim(""); + // loops if the captured ID was in XL-format. + uint8_t ans = 0; + do { + ans = CmdEM410xWatch(Cmd); + if ( ans ) { + PrintAndLog("# Replaying captured ID: %llu", g_em410xid); + CmdLFaskSim(""); + } + } while ( !ans ); return 0; } @@ -173,7 +165,7 @@ int CmdEM410xWrite(const char *Cmd) { uint64_t id = 0xFFFFFFFFFFFFFFFF; // invalid id value int card = 0xFF; // invalid card value - unsigned int clock = 0; // invalid clock value + uint32_t clock = 0; // invalid clock value sscanf(Cmd, "%" PRIx64 " %d %d", &id, &card, &clock); @@ -199,8 +191,8 @@ int CmdEM410xWrite(const char *Cmd) // Check Clock // Default: 64 - if (clock == 0) - clock = 64; + if (clock == 0) + clock = 64; // Allowed clock rates: 16, 32, 40 and 64 if ((clock != 16) && (clock != 32) && (clock != 64) && (clock != 40)) { @@ -225,7 +217,6 @@ int CmdEM410xWrite(const char *Cmd) UsbCommand c = {CMD_EM410X_WRITE_TAG, {card, (uint32_t)(id >> 32), (uint32_t)id}}; SendCommand(&c); - return 0; } @@ -613,14 +604,13 @@ static command_t CommandTable[] = {NULL, NULL, 0, NULL} }; -int CmdLFEM4X(const char *Cmd) -{ +int CmdLFEM4X(const char *Cmd) { + clearCommandBuffer(); CmdsParse(CommandTable, Cmd); return 0; } -int CmdHelp(const char *Cmd) -{ +int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; }