mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
Add - analyse lf signal in graphbuffer and detects clock and matching modulations
This commit is contained in:
parent
ee3f5a9c2b
commit
4c85ce5f2f
2 changed files with 132 additions and 3 deletions
|
@ -27,6 +27,7 @@
|
||||||
#include "fileutils.h" // searchFile
|
#include "fileutils.h" // searchFile
|
||||||
#include "mifare/ndef.h"
|
#include "mifare/ndef.h"
|
||||||
#include "cliparser.h"
|
#include "cliparser.h"
|
||||||
|
#include "cmdlft55xx.h" // print...
|
||||||
|
|
||||||
uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
|
uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
|
||||||
size_t DemodBufferLen = 0;
|
size_t DemodBufferLen = 0;
|
||||||
|
@ -2309,6 +2310,131 @@ static int CmdDataNDEF(const char *Cmd) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
t55xx_modulation modulation;
|
||||||
|
int bitrate;
|
||||||
|
} lf_modulation_t;
|
||||||
|
|
||||||
|
static int print_modulation(lf_modulation_t b) {
|
||||||
|
PrintAndLogEx(INFO, " Modulation... " _GREEN_("%s"), GetSelectedModulationStr(b.modulation));
|
||||||
|
PrintAndLogEx(INFO, " Bit Rate..... " _GREEN_("RF/%u"), b.bitrate);
|
||||||
|
PrintAndLogEx(NORMAL, "");
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int try_detect_modulation(void) {
|
||||||
|
|
||||||
|
lf_modulation_t tests[6];
|
||||||
|
int clk = 0, firstClockEdge = 0;
|
||||||
|
uint8_t hits = 0, fc1 = 0, fc2 = 0, ans = 0;
|
||||||
|
bool st = false;
|
||||||
|
|
||||||
|
ans = fskClocks(&fc1, &fc2, (uint8_t *)&clk, &firstClockEdge);
|
||||||
|
|
||||||
|
if (ans && ((fc1 == 10 && fc2 == 8) || (fc1 == 8 && fc2 == 5))) {
|
||||||
|
|
||||||
|
if ((FSKrawDemod(0, 0, 0, 0, false) == PM3_SUCCESS)) {
|
||||||
|
tests[hits].modulation = DEMOD_FSK;
|
||||||
|
if (fc1 == 8 && fc2 == 5)
|
||||||
|
tests[hits].modulation = DEMOD_FSK1a;
|
||||||
|
else if (fc1 == 10 && fc2 == 8)
|
||||||
|
tests[hits].modulation = DEMOD_FSK2;
|
||||||
|
tests[hits].bitrate = clk;
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
clk = GetAskClock("", false);
|
||||||
|
if (clk > 0) {
|
||||||
|
// 0 = auto clock
|
||||||
|
// 0 = no invert
|
||||||
|
// 1 = maxError 1
|
||||||
|
// 0 = max len
|
||||||
|
// false = no amplify
|
||||||
|
// false = no verbose
|
||||||
|
// false = no emSearch
|
||||||
|
// 1 = Ask/Man
|
||||||
|
// st = true
|
||||||
|
if ((ASKDemod_ext(0, 0, 1, 0, false, false, false, 1, &st) == PM3_SUCCESS)) {
|
||||||
|
tests[hits].modulation = DEMOD_ASK;
|
||||||
|
tests[hits].bitrate = clk;
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
// "0 0 1 " == clock auto, invert true, maxError 1.
|
||||||
|
// false = no verbose
|
||||||
|
// false = no emSearch
|
||||||
|
// 1 = Ask/Man
|
||||||
|
// st = true
|
||||||
|
|
||||||
|
// ASK / biphase
|
||||||
|
if ((ASKbiphaseDemod(0, 0, 0, 2, false) == PM3_SUCCESS)) {
|
||||||
|
tests[hits].modulation = DEMOD_BI;
|
||||||
|
tests[hits].bitrate = clk;
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
// ASK / Diphase
|
||||||
|
if ((ASKbiphaseDemod(0, 0, 1, 2, false) == PM3_SUCCESS)) {
|
||||||
|
tests[hits].modulation = DEMOD_BIa;
|
||||||
|
tests[hits].bitrate = clk;
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clk = GetNrzClock("", false);
|
||||||
|
if (clk > 8) { //clock of rf/8 is likely a false positive, so don't use it.
|
||||||
|
if ((NRZrawDemod(0, 0, 1, false) == PM3_SUCCESS)) {
|
||||||
|
tests[hits].modulation = DEMOD_NRZ;
|
||||||
|
tests[hits].bitrate = clk;
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clk = GetPskClock("", false);
|
||||||
|
if (clk > 0) {
|
||||||
|
// allow undo
|
||||||
|
save_restoreGB(GRAPH_SAVE);
|
||||||
|
// skip first 160 samples to allow antenna to settle in (psk gets inverted occasionally otherwise)
|
||||||
|
CmdLtrim("160");
|
||||||
|
if ((PSKDemod(0, 0, 6, false) == PM3_SUCCESS)) {
|
||||||
|
tests[hits].modulation = DEMOD_PSK1;
|
||||||
|
tests[hits].bitrate = clk;
|
||||||
|
++hits;
|
||||||
|
}
|
||||||
|
//undo trim samples
|
||||||
|
save_restoreGB(GRAPH_RESTORE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hits) {
|
||||||
|
PrintAndLogEx(SUCCESS, "Found [%d] possible matches for modulation.", hits);
|
||||||
|
for (int i = 0; i < hits; ++i) {
|
||||||
|
PrintAndLogEx(INFO, "--[%d]---------------", i + 1);
|
||||||
|
print_modulation(tests[i]);
|
||||||
|
}
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
} else {
|
||||||
|
PrintAndLogEx(INFO, "Signal doesn't match");
|
||||||
|
return PM3_ESOFT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int CmdDataModeSearch(const char *Cmd) {
|
||||||
|
CLIParserContext *ctx;
|
||||||
|
CLIParserInit(&ctx, "data modesearch",
|
||||||
|
"search LF signal after clock and modulation\n",
|
||||||
|
"data modesearch"
|
||||||
|
);
|
||||||
|
|
||||||
|
void *argtable[] = {
|
||||||
|
arg_param_begin,
|
||||||
|
arg_param_end
|
||||||
|
};
|
||||||
|
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||||
|
CLIParserFree(ctx);
|
||||||
|
|
||||||
|
try_detect_modulation();
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
{"help", CmdHelp, AlwaysAvailable, "This help"},
|
||||||
{"askedgedetect", CmdAskEdgeDetect, AlwaysAvailable, "[threshold] Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave (use 20-45, def:25)"},
|
{"askedgedetect", CmdAskEdgeDetect, AlwaysAvailable, "[threshold] Adjust Graph for manual ASK demod using the length of sample differences to detect the edge of a wave (use 20-45, def:25)"},
|
||||||
|
@ -2348,6 +2474,7 @@ static command_t CommandTable[] = {
|
||||||
{"zerocrossings", CmdZerocrossings, AlwaysAvailable, "Count time between zero-crossings"},
|
{"zerocrossings", CmdZerocrossings, AlwaysAvailable, "Count time between zero-crossings"},
|
||||||
{"iir", CmdDataIIR, AlwaysAvailable, "apply IIR buttersworth filter on plotdata"},
|
{"iir", CmdDataIIR, AlwaysAvailable, "apply IIR buttersworth filter on plotdata"},
|
||||||
{"ndef", CmdDataNDEF, AlwaysAvailable, "Decode NDEF records"},
|
{"ndef", CmdDataNDEF, AlwaysAvailable, "Decode NDEF records"},
|
||||||
|
{"modesearch", CmdDataModeSearch, AlwaysAvailable, "Search LF signal for clock, modulation"},
|
||||||
{NULL, NULL, NULL, NULL}
|
{NULL, NULL, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -105,8 +105,7 @@ typedef struct {
|
||||||
uint32_t dw;
|
uint32_t dw;
|
||||||
} t5555_tracedata_t;
|
} t5555_tracedata_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef enum {
|
||||||
enum {
|
|
||||||
DEMOD_NRZ = 0x00,
|
DEMOD_NRZ = 0x00,
|
||||||
DEMOD_PSK1 = 0x01,
|
DEMOD_PSK1 = 0x01,
|
||||||
DEMOD_PSK2 = 0x02,
|
DEMOD_PSK2 = 0x02,
|
||||||
|
@ -119,7 +118,10 @@ typedef struct {
|
||||||
DEMOD_ASK = 0x08,
|
DEMOD_ASK = 0x08,
|
||||||
DEMOD_BI = 0x10,
|
DEMOD_BI = 0x10,
|
||||||
DEMOD_BIa = 0x18,
|
DEMOD_BIa = 0x18,
|
||||||
} modulation;
|
} t55xx_modulation;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
t55xx_modulation modulation;
|
||||||
bool inverted;
|
bool inverted;
|
||||||
uint8_t offset;
|
uint8_t offset;
|
||||||
uint32_t block0;
|
uint32_t block0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue