diff --git a/client/cmddata.c b/client/cmddata.c index 9bd18eb90..80c3bf076 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -1872,7 +1872,7 @@ int CmdPlot(const char *Cmd) { return PM3_SUCCESS; } -static int CmdSave(const char *Cmd) { +int CmdSave(const char *Cmd) { int len = 0; char filename[FILE_PATH_SIZE] = {0x00}; diff --git a/client/cmddata.h b/client/cmddata.h index a453fafb1..a4bba407c 100644 --- a/client/cmddata.h +++ b/client/cmddata.h @@ -53,6 +53,7 @@ int CmdHpf(const char *Cmd); int CmdLtrim(const char *Cmd); // used by cmd lf em4x, lf t55xx int CmdNorm(const char *Cmd); // used by cmd lf data (!) int CmdPlot(const char *Cmd); // used by cmd lf cotag +int CmdSave(const char *Cmd); // used by cmd auto int CmdTuneSamples(const char *Cmd); // used by cmd lf hw int ASKbiphaseDemod(const char *Cmd, bool verbose); // used by cmd lf em4x, lf fdx, lf guard, lf jablotron, lf nedap, lf t55xx int ASKDemod(const char *Cmd, bool verbose, bool emSearch, uint8_t askType); // used by cmd lf em4x, lf t55xx, lf viking diff --git a/client/cmdmain.c b/client/cmdmain.c index 5a2c91904..802d09fa9 100644 --- a/client/cmdmain.c +++ b/client/cmdmain.c @@ -18,6 +18,7 @@ #include #include #include // MingW +#include // calloc #include "comms.h" #include "cmdhf.h" @@ -38,20 +39,6 @@ static int CmdHelp(const char *Cmd); -int CmdRem(const char *Cmd) { - char buf[22] = {0}; - struct tm *ct, tm_buf; - time_t now = time(NULL); -#if defined(_WIN32) - ct = gmtime_s(&tm_buf, &now) == 0 ? &tm_buf : NULL; -#else - ct = gmtime_r(&now, &tm_buf); -#endif - strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", ct); // ISO8601 - PrintAndLogEx(NORMAL, "%s remark: %s", buf, Cmd); - return PM3_SUCCESS; -} - static int usage_msleep(void) { PrintAndLogEx(NORMAL, "Sleep for given amount of milliseconds"); PrintAndLogEx(NORMAL, ""); @@ -65,6 +52,63 @@ static int usage_msleep(void) { return PM3_SUCCESS; } +static int usage_auto(void) { + PrintAndLogEx(NORMAL, "Run LF SEARCH / HF SEARCH / DATA PLOT / DATA SAVE "); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Usage: auto "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, " auto"); + return PM3_SUCCESS; +} + +static void AppendDate(char *s, size_t slen, char *fmt) { + struct tm *ct, tm_buf; + time_t now = time(NULL); +#if defined(_WIN32) + ct = gmtime_s(&tm_buf, &now) == 0 ? &tm_buf : NULL; +#else + ct = gmtime_r(&now, &tm_buf); +#endif + if (fmt == NULL) + strftime(s, slen, "%Y-%m-%dT%H:%M:%SZ", ct); // ISO8601 + else + strftime(s, slen, fmt, ct); +} + +static int CmdAuto(const char *Cmd) { + char ctmp = tolower(param_getchar(Cmd, 0)); + if (ctmp == 'h') return usage_auto(); + + int ret = CmdLFfind(""); + if (ret == PM3_SUCCESS) + return ret; + + ret = CmdHFSearch(""); + if (ret == PM3_SUCCESS) + return ret; + + PrintAndLogEx(INFO, "Failed both LF / HF SEARCH,"); + PrintAndLogEx(INFO, "Trying 'lf read' and save a trace for you..."); + + CmdPlot(""); + lf_read(true, 40000); + char *fname = calloc(100, sizeof(uint8_t)); + AppendDate(fname, 100, "lf_unknown_%Y-%m-%d_%H:%M.pm3"); + CmdSave(fname); + free(fname); + return PM3_SUCCESS; +} + +int CmdRem(const char *Cmd) { + char buf[22] = {0}; + AppendDate(buf, sizeof(buf), NULL); + PrintAndLogEx(NORMAL, "%s remark: %s", buf, Cmd); + return PM3_SUCCESS; +} + static int CmdMsleep(const char *Cmd) { uint32_t ms = 0; char ctmp = tolower(param_getchar(Cmd, 0)); @@ -90,6 +134,7 @@ static int CmdRev(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help. Use ' help' for details of a particular command."}, + {"auto", CmdAuto, IfPm3Present, "Automated detection process for unknown tags"}, {"analyse", CmdAnalyse, AlwaysAvailable, "{ Analyse utils... }"}, {"data", CmdData, AlwaysAvailable, "{ Plot window / data buffer manipulation... }"}, {"emv", CmdEMV, AlwaysAvailable, "{ EMV ISO-14443 / ISO-7816... }"},