From 371535d566ef790b75c6a8e1d412c97345eb3067 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 14 Dec 2016 23:26:14 +0100 Subject: [PATCH 1/1] ADD: forgot to add the files --- client/cmdlfvisa2000.c | 179 +++++++++++++++++++++++++++++++++++++++++ client/cmdlfvisa2000.h | 37 +++++++++ 2 files changed, 216 insertions(+) create mode 100644 client/cmdlfvisa2000.c create mode 100644 client/cmdlfvisa2000.h diff --git a/client/cmdlfvisa2000.c b/client/cmdlfvisa2000.c new file mode 100644 index 00000000..da1fd2d1 --- /dev/null +++ b/client/cmdlfvisa2000.c @@ -0,0 +1,179 @@ +//----------------------------------------------------------------------------- +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Low frequency Presco tag commands +//----------------------------------------------------------------------------- + +#include "cmdlfvisa2000.h" + +static int CmdHelp(const char *Cmd); + +int usage_lf_visa2k_clone(void){ + PrintAndLog("clone a Visa2000 tag to a T55x7 tag."); + PrintAndLog("Usage: lf visa2k clone [h] "); + PrintAndLog("Options:"); + PrintAndLog(" h : This help"); + PrintAndLog(" : Visa2k card ID"); + PrintAndLog(" : specify write to Q5 (t5555 instead of t55x7)"); + PrintAndLog(""); + PrintAndLog("Sample: lf visa2k clone 112233"); + return 0; +} + +int usage_lf_visa2k_sim(void) { + PrintAndLog("Enables simulation of visa2k card with specified card number."); + PrintAndLog("Simulation runs until the button is pressed or another USB command is issued."); + PrintAndLog(""); + PrintAndLog("Usage: lf visa2k sim [h] "); + PrintAndLog("Options:"); + PrintAndLog(" h : This help"); + PrintAndLog(" : Visa2k card ID"); + PrintAndLog(""); + PrintAndLog("Sample: lf visa2k sim 112233"); + return 0; +} + +//see ASKDemod for what args are accepted +int CmdVisa2kDemod(const char *Cmd) { + + //ASK / Manchester + bool st = true; + if (!ASKDemod_ext("64 0 0", FALSE, FALSE, 1, &st)) { + if (g_debugMode) PrintAndLog("DEBUG: Error - Visa2k: ASK/Manchester Demod failed"); + return 0; + } + size_t size = DemodBufferLen; + int ans = Visa2kDemod_AM(DemodBuffer, &size); + if (ans < 0){ + if (g_debugMode){ + if (ans == -1) + PrintAndLog("DEBUG: Error - Visa2k: too few bits found"); + else if (ans == -2) + PrintAndLog("DEBUG: Error - Visa2k: preamble not found"); + else if (ans == -3) + PrintAndLog("DEBUG: Error - Visa2k: Size not correct: %d", size); + else + PrintAndLog("DEBUG: Error - Visa2k: ans: %d", ans); + } + return 0; + } + setDemodBuf(DemodBuffer, 96, ans); + + //got a good demod + 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); + + PrintAndLog("Visa2000 Tag Found: Card ID %u, Raw: %08X%08X%08X", raw2, raw1 ,raw2, raw3); + return 1; +} + +int CmdVisa2kRead(const char *Cmd) { + CmdLFRead("s"); + getSamples("20000",TRUE); + return CmdVisa2kDemod(Cmd); +} + +int CmdVisa2kClone(const char *Cmd) { + + uint64_t id = 0; + uint32_t blocks[4] = {T55x7_MODULATION_MANCHESTER | T55x7_BITRATE_RF_64 | T55x7_ST_TERMINATOR |3<= 0; --i) { + c.arg[0] = blocks[i]; + c.arg[1] = i; + clearCommandBuffer(); + SendCommand(&c); + if (!WaitForResponseTimeout(CMD_ACK, &resp, 1000)){ + PrintAndLog("Error occurred, device did not respond during write operation."); + return -1; + } + } + return 0; +} + +int CmdVisa2kSim(const char *Cmd) { + + uint32_t id = 0; + char cmdp = param_getchar(Cmd, 0); + if (strlen(Cmd) == 0 || cmdp == 'h' || cmdp == 'H') return usage_lf_visa2k_sim(); + + id = param_get32ex(Cmd, 0, 0, 10); + + uint8_t clk = 64, encoding = 1, separator = 1, invert = 0; + uint16_t arg1, arg2; + size_t size = 96; + arg1 = clk << 8 | encoding; + arg2 = invert << 8 | separator; + + PrintAndLog("Simulating Visa2000 - CardId: %u", id); + + UsbCommand c = {CMD_ASK_SIM_TAG, {arg1, arg2, size}}; + + uint32_t blocks[3] = { 0x56495332, id, 0}; + + for(int i=0; i<3; ++i){ + num_to_bytebits(blocks[i], 32, c.d.asBytes + i*32); + } + clearCommandBuffer(); + SendCommand(&c); + return 0; +} + +static command_t CommandTable[] = { + {"help", CmdHelp, 1, "This help"}, + {"read", CmdVisa2kRead, 0, "Attempt to read and extract tag data"}, + {"clone", CmdVisa2kClone, 0, "clone Visa2000 tag"}, + {"sim", CmdVisa2kSim, 0, "simulate Visa2000 tag"}, + {NULL, NULL, 0, NULL} +}; + +int CmdLFVisa2k(const char *Cmd) { + clearCommandBuffer(); + CmdsParse(CommandTable, Cmd); + return 0; +} + +int CmdHelp(const char *Cmd) { + CmdsHelp(CommandTable); + return 0; +} diff --git a/client/cmdlfvisa2000.h b/client/cmdlfvisa2000.h new file mode 100644 index 00000000..e82e12ce --- /dev/null +++ b/client/cmdlfvisa2000.h @@ -0,0 +1,37 @@ +//----------------------------------------------------------------------------- +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Low frequency T55xx commands +//----------------------------------------------------------------------------- +#ifndef CMDLFVISA2000_H__ +#define CMDLFVISA2000_H__ +#include +#include +#include +#include "proxmark3.h" +#include "ui.h" +#include "util.h" +#include "graph.h" +#include "cmdparser.h" +#include "cmddata.h" +#include "cmdmain.h" +#include "cmdlf.h" +#include "protocols.h" // for T55xx config register definitions +#include "lfdemod.h" // parityTest +int CmdLFVisa2k(const char *Cmd); +int CmdVisa2kClone(const char *Cmd); +int CmdVisa2kSim(const char *Cmd); +int CmdVisa2kRead(const char *Cmd); +int CmdVisa2kDemod(const char *Cmd); + +int getvisa2kBits(uint64_t fullcode, uint8_t *bits); + +int usage_lf_visa2k_clone(void); +int usage_lf_visa2k_sim(void); +int usage_lf_visa2k_read(void); +int usage_lf_visa2k_demod(void); +#endif + -- 2.39.5