X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/934dfd728dacd497ac299b41f039b3dad41d9c64..c48211f7ed175c91d92044e7e08b921e06f8ff3f:/client/cmdlfawid.c diff --git a/client/cmdlfawid.c b/client/cmdlfawid.c index 7a8aff9b..8e6e4073 100644 --- a/client/cmdlfawid.c +++ b/client/cmdlfawid.c @@ -7,19 +7,9 @@ // at your option, any later version. See the LICENSE.txt file for the text of // the license. //----------------------------------------------------------------------------- -// Low frequency AWID26 commands +// Low frequency AWID26/50 commands //----------------------------------------------------------------------------- - -#include // sscanf -#include "proxmark3.h" // Definitions, USB controls, etc -#include "ui.h" // PrintAndLog -#include "cmdparser.h" // CmdsParse, CmdsHelp #include "cmdlfawid.h" // AWID function declarations -#include "lfdemod.h" // parityTest -#include "util.h" // weigandparity -#include "protocols.h" // for T55xx config register definitions -#include "cmdmain.h" -#include "sleep.h" static int CmdHelp(const char *Cmd); @@ -29,13 +19,13 @@ int usage_lf_awid_fskdemod(void) { PrintAndLog("If the [1] option is provided, reader mode is exited after reading a single AWID card."); PrintAndLog(""); PrintAndLog("Usage: lf awid fskdemod [h] [1]"); - PrintAndLog("Options :"); + PrintAndLog("Options:"); PrintAndLog(" h : This help"); PrintAndLog(" 1 : (optional) stop after reading a single card"); PrintAndLog(""); - PrintAndLog("Samples"); - PrintAndLog(" lf awid fskdemod"); - PrintAndLog(" lf awid fskdemod 1"); + PrintAndLog("Samples:"); + PrintAndLog(" lf awid fskdemod"); + PrintAndLog(" lf awid fskdemod 1"); return 0; } @@ -44,13 +34,13 @@ int usage_lf_awid_sim(void) { PrintAndLog("Simulation runs until the button is pressed or another USB command is issued."); PrintAndLog(""); PrintAndLog("Usage: lf awid sim [h] "); - PrintAndLog("Options :"); + PrintAndLog("Options:"); PrintAndLog(" h : This help"); PrintAndLog(" : format length 26|50"); PrintAndLog(" : 8|16bit value facility code"); PrintAndLog(" : 16|32-bit value card number"); PrintAndLog(""); - PrintAndLog("Samples"); + PrintAndLog("Samples:"); PrintAndLog(" lf awid sim 26 224 1337"); PrintAndLog(" lf awid sim 50 2001 13371337"); return 0; @@ -61,14 +51,14 @@ int usage_lf_awid_clone(void) { PrintAndLog("The T55x7 must be on the antenna when issuing this command. T55x7 blocks are calculated and printed in the process."); PrintAndLog(""); PrintAndLog("Usage: lf awid clone [h] [Q5]"); - PrintAndLog("Options :"); + PrintAndLog("Options:"); PrintAndLog(" h : This help"); PrintAndLog(" : format length 26|50"); PrintAndLog(" : 8|16bit value facility code"); PrintAndLog(" : 16|32-bit value card number"); PrintAndLog(" Q5 : optional - clone to Q5 (T5555) instead of T55x7 chip"); PrintAndLog(""); - PrintAndLog("Samples"); + PrintAndLog("Samples:"); PrintAndLog(" lf awid clone 26 224 1337"); PrintAndLog(" lf awid clone 50 2001 13371337"); return 0; @@ -76,21 +66,55 @@ int usage_lf_awid_clone(void) { int usage_lf_awid_brute(void){ PrintAndLog("Enables bruteforce of AWID reader with specified facility-code."); - PrintAndLog("This is a incremental attack against reader."); + PrintAndLog("This is a attack against reader. if cardnumber is given, it starts with it and goes up / down one step"); + PrintAndLog("if cardnumber is not given, it starts with 1 and goes up to 65535"); PrintAndLog(""); - PrintAndLog("Usage: lf awid brute [h] "); - PrintAndLog("Options :"); - PrintAndLog(" h : This help"); - PrintAndLog(" : format length 26|50"); - PrintAndLog(" : 8|16bit value facility code"); - PrintAndLog(" : delay betweens attempts in ms. Default 1000ms"); + PrintAndLog("Usage: lf awid brute [h] a f c d "); + PrintAndLog("Options:"); + PrintAndLog(" h : This help"); + PrintAndLog(" a : format length 26|50"); + PrintAndLog(" f : 8|16bit value facility code"); + PrintAndLog(" c : (optional) cardnumber to start with, max 65535"); + PrintAndLog(" d : delay betweens attempts in ms. Default 1000ms"); PrintAndLog(""); - PrintAndLog("Samples"); - PrintAndLog(" lf awid brute 26 224"); - PrintAndLog(" lf awid brute 50 2001 2000"); + PrintAndLog("Samples:"); + PrintAndLog(" lf awid brute a 26 f 224"); + PrintAndLog(" lf awid brute a 50 f 2001 d 2000"); + PrintAndLog(" lf awid brute a 50 f 2001 c 200 d 2000"); return 0; } +static int sendPing(void){ + UsbCommand ping = {CMD_PING, {1, 2, 3}}; + SendCommand(&ping); + SendCommand(&ping); + SendCommand(&ping); + clearCommandBuffer(); + UsbCommand resp; + if (WaitForResponseTimeout(CMD_ACK, &resp, 1000)) + return 0; + return 1; +} + +static bool sendTry(uint8_t fmtlen, uint32_t fc, uint32_t cn, uint32_t delay, uint8_t *bs, size_t bs_len){ + + PrintAndLog("Trying FC: %u; CN: %u", fc, cn); + if ( !getAWIDBits(fmtlen, fc, cn, bs)) { + PrintAndLog("Error with tag bitstream generation."); + return FALSE; + } + + uint64_t arg1 = (10<<8) + 8; // fcHigh = 10, fcLow = 8 + uint64_t arg2 = 50; // clk RF/50 invert=0 + UsbCommand c = {CMD_FSK_SIM_TAG, {arg1, arg2, bs_len}}; + memcpy(c.d.asBytes, bs, bs_len); + clearCommandBuffer(); + SendCommand(&c); + msleep(delay); + sendPing(); + return TRUE; +} + int CmdAWIDDemodFSK(const char *Cmd) { int findone = 0; if (Cmd[0] == 'h' || Cmd[0] == 'H') return usage_lf_awid_fskdemod(); @@ -269,37 +293,66 @@ int CmdAWIDClone(const char *Cmd) { int CmdAWIDBrute(const char *Cmd){ - uint32_t fc = 0; + bool errors = false; + uint32_t fc = 0, cn = 0, delay = 1000; uint8_t fmtlen = 0; - uint16_t delay = 1000; uint8_t bits[96]; uint8_t *bs = bits; size_t size = sizeof(bits); memset(bs, 0x00, size); - - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') return usage_lf_awid_brute(); - - fmtlen = param_get8(Cmd, 0); - fc = param_get32ex(Cmd, 1, 0, 10); - if ( !fc ) return usage_lf_awid_brute(); - - // delay between attemps, defaults to 1000ms. - delay = param_get8(Cmd, 2); - if (delay < 400) - delay = 1000; + uint8_t cmdp = 0; + while(param_getchar(Cmd, cmdp) != 0x00 && !errors) { + switch(param_getchar(Cmd, cmdp)) { + case 'h': + case 'H': + return usage_lf_awid_brute(); + case 'f': + case 'F': + fc = param_get32ex(Cmd ,cmdp+1, 0, 10); + if ( !fc ) + errors = true; + cmdp += 2; + break; + case 'd': + case 'D': + // delay between attemps, defaults to 1000ms. + delay = param_get32ex(Cmd, cmdp+1, 1000, 10); + cmdp += 2; + break; + case 'c': + case 'C': + cn = param_get32ex(Cmd, cmdp+1, 0, 10); + // truncate cardnumber. + cn &= 0xFFFF; + cmdp += 2; + break; + case 'a': + case 'A': + fmtlen = param_get8(Cmd, cmdp+1); + cmdp += 2; + break; + default: + PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + errors = true; + break; + } + } + if ( fc == 0 )errors = true; + if ( errors ) return usage_lf_awid_brute(); + + // limit fc according to selected format switch(fmtlen) { case 50: if ((fc & 0xFFFF) != fc) { fc &= 0xFFFF; - PrintAndLog("Facility-Code Truncated to 16-bits (AWID50): %u", fc); + PrintAndLog("Facility-code truncated to 16-bits (AWID50): %u", fc); } break; default: if ((fc & 0xFF) != fc) { fc &= 0xFF; - PrintAndLog("Facility-Code Truncated to 8-bits (AWID26): %u", fc); + PrintAndLog("Facility-code truncated to 8-bits (AWID26): %u", fc); } break; } @@ -307,37 +360,38 @@ int CmdAWIDBrute(const char *Cmd){ PrintAndLog("Bruteforceing AWID %d Reader", fmtlen); PrintAndLog("Press pm3-button to abort simulation or press key"); - uint64_t arg1 = (10<<8) + 8; // fcHigh = 10, fcLow = 8 - uint64_t arg2 = 50; // clk RF/50 invert=0 - UsbCommand c = {CMD_FSK_SIM_TAG, {arg1, arg2, size}}; - - for ( uint16_t cn = 1; cn < 0xFFFF; ++cn){ - + uint16_t up = cn; + uint16_t down = cn; + + for (;;){ + + if ( offline ) { + printf("Device offline\n"); + return 2; + } if (ukbhit()) { PrintAndLog("aborted via keyboard!"); - UsbCommand ping = {CMD_PING}; - clearCommandBuffer(); - SendCommand(&ping); - return 1; + return sendPing(); } - - PrintAndLog("Trying FC: %u; CN: %u", fc, cn); - (void)getAWIDBits(fmtlen, fc, cn, bs); - memcpy(c.d.asBytes, bs, size); - clearCommandBuffer(); - SendCommand(&c); - msleep(delay); + // Do one up + if ( up < 0xFFFF ) + if ( !sendTry(fmtlen, fc, up++, delay, bs, size)) return 1; + + // Do one down (if cardnumber is given) + if ( cn > 1 ) + if ( down > 1 ) + if ( !sendTry(fmtlen, fc, --down, delay, bs, size)) return 1; } return 0; } static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, - {"fskdemod", CmdAWIDDemodFSK, 0, "['1'] Realtime AWID FSK demodulator (option '1' for one tag only)"}, - {"sim", CmdAWIDSim, 0, " -- AWID tag simulator"}, - {"clone", CmdAWIDClone, 0, " -- Clone AWID to T55x7"}, - {"brute", CmdAWIDBrute, 0, " -- bruteforce card number"}, + {"fskdemod", CmdAWIDDemodFSK, 0, "Realtime AWID FSK demodulator"}, + {"sim", CmdAWIDSim, 0, "AWID tag simulator"}, + {"clone", CmdAWIDClone, 0, "Clone AWID to T55x7"}, + {"brute", CmdAWIDBrute, 0, "Bruteforce card number against reader"}, {NULL, NULL, 0, NULL} };