X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/ab2fd3d68b5670b5c7550f2e98f9c8f8909a6a6e..54a942b05dd2a601b85e9851a5799929cbdffd5f:/client/cmdlfem4x.c diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c index 9b40d7c0..f823750b 100644 --- a/client/cmdlfem4x.c +++ b/client/cmdlfem4x.c @@ -1,5 +1,18 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// 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 EM4x commands +//----------------------------------------------------------------------------- + #include -#include "proxusb.h" +#include +#include +//#include "proxusb.h" +#include "proxmark3.h" #include "ui.h" #include "graph.h" #include "cmdparser.h" @@ -23,7 +36,7 @@ int CmdEM410xRead(const char *Cmd) int parity[4]; char id[11]; int retested = 0; - int BitStream[MAX_GRAPH_TRACE_LEN]; + uint8_t BitStream[MAX_GRAPH_TRACE_LEN]; high = low = 0; /* Detect high and lows and clock */ @@ -264,13 +277,13 @@ int CmdEM410xWatch(const char *Cmd) */ int CmdEM4x50Read(const char *Cmd) { - int i, j, startblock, clock, skip, block, start, end, low, high; + int i, j, startblock, skip, block, start, end, low, high; bool complete= false; int tmpbuff[MAX_GRAPH_TRACE_LEN / 64]; char tmp[6]; high= low= 0; - clock= 64; + memset(tmpbuff, 0, MAX_GRAPH_TRACE_LEN / 64); /* first get high and low values */ for (i = 0; i < GraphTraceLen; i++) @@ -387,13 +400,140 @@ int CmdEM4x50Read(const char *Cmd) return 0; } -static command_t CommandTable[] = +int CmdEM410xWrite(const char *Cmd) +{ + uint64_t id = 0; + unsigned int card; + + sscanf(Cmd, "%" PRIx64 " %d", &id, &card); + + if (id >= 0x10000000000) { + PrintAndLog("Error! Given EM410x ID is longer than 40 bits.\n"); + return 0; + } + + if (card > 1) { + PrintAndLog("Error! Bad card type selected.\n"); + return 0; + } + + PrintAndLog("Writing %s tag with UID 0x%010" PRIx64, card ? "T55x7":"T5555", id); + UsbCommand c = {CMD_EM410X_WRITE_TAG, {card, (uint32_t)(id >> 32), (uint32_t)id}}; + SendCommand(&c); + + return 0; +} + +int CmdReadWord(const char *Cmd) +{ + int Word = 16; //default to invalid word + UsbCommand c; + + sscanf(Cmd, "%d", &Word); + + if (Word > 15) { + PrintAndLog("Word must be between 0 and 15"); + return 1; + } + + PrintAndLog("Reading word %d", Word); + + c.cmd = CMD_EM4X_READ_WORD; + c.d.asBytes[0] = 0x0; //Normal mode + c.arg[0] = 0; + c.arg[1] = Word; + c.arg[2] = 0; + SendCommand(&c); + return 0; +} + +int CmdReadWordPWD(const char *Cmd) +{ + int Word = 16; //default to invalid word + int Password = 0xFFFFFFFF; //default to blank password + UsbCommand c; + + sscanf(Cmd, "%d %x", &Word, &Password); + + if (Word > 15) { + PrintAndLog("Word must be between 0 and 15"); + return 1; + } + + PrintAndLog("Reading word %d with password %08X", Word, Password); + + c.cmd = CMD_EM4X_READ_WORD; + c.d.asBytes[0] = 0x1; //Password mode + c.arg[0] = 0; + c.arg[1] = Word; + c.arg[2] = Password; + SendCommand(&c); + return 0; +} + +int CmdWriteWord(const char *Cmd) +{ + int Word = 16; //default to invalid block + int Data = 0xFFFFFFFF; //default to blank data + UsbCommand c; + + sscanf(Cmd, "%x %d", &Data, &Word); + + if (Word > 15) { + PrintAndLog("Word must be between 0 and 15"); + return 1; + } + + PrintAndLog("Writting word %d with data %08X", Word, Data); + + c.cmd = CMD_EM4X_WRITE_WORD; + c.d.asBytes[0] = 0x0; //Normal mode + c.arg[0] = Data; + c.arg[1] = Word; + c.arg[2] = 0; + SendCommand(&c); + return 0; +} + +int CmdWriteWordPWD(const char *Cmd) +{ + int Word = 8; //default to invalid word + int Data = 0xFFFFFFFF; //default to blank data + int Password = 0xFFFFFFFF; //default to blank password + UsbCommand c; + + sscanf(Cmd, "%x %d %x", &Data, &Word, &Password); + + if (Word > 15) { + PrintAndLog("Word must be between 0 and 15"); + return 1; + } + + PrintAndLog("Writting word %d with data %08X and password %08X", Word, Data, Password); + + c.cmd = CMD_EM4X_WRITE_WORD; + c.d.asBytes[0] = 0x1; //Password mode + c.arg[0] = Data; + c.arg[1] = Word; + c.arg[2] = Password; + SendCommand(&c); + return 0; +} + + + +static command_t CommandTable[] = { - {"help", CmdHelp, 1, "This help"}, - {"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"}, - {"em410xsim", CmdEM410xSim, 0, " -- Simulate EM410x tag"}, + {"help", CmdHelp, 1, "This help"}, + {"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"}, + {"em410xsim", CmdEM410xSim, 0, " -- Simulate EM410x tag"}, {"em410xwatch", CmdEM410xWatch, 0, "Watches for EM410x tags"}, - {"em4x50read", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"}, + {"em410xwrite", CmdEM410xWrite, 1, " <'0' T5555> <'1' T55x7> -- Write EM410x UID to T5555(Q5) or T55x7 tag"}, + {"em4x50read", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"}, + {"readword", CmdReadWord, 1, " -- Read EM4xxx word data"}, + {"readwordPWD", CmdReadWordPWD, 1, " -- Read EM4xxx word data in password mode"}, + {"writeword", CmdWriteWord, 1, " -- Write EM4xxx word data"}, + {"writewordPWD", CmdWriteWordPWD, 1, " -- Write EM4xxx word data in password mode"}, {NULL, NULL, 0, NULL} };