mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-24 07:05:40 -07:00
adapted to hf search etc..
This commit is contained in:
parent
098a1e8343
commit
9b2bf3e544
3 changed files with 205 additions and 8 deletions
|
@ -165,6 +165,14 @@ int CmdHFSearch(const char *Cmd) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// texkom
|
||||||
|
PROMPT_CLEARLINE;
|
||||||
|
PrintAndLogEx(INPLACE, " Searching for TEXCOM tag...");
|
||||||
|
if (read_texkom_uid(false, false) == PM3_SUCCESS) {
|
||||||
|
PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("TEXCOM tag") " found\n");
|
||||||
|
res = PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
PROMPT_CLEARLINE;
|
PROMPT_CLEARLINE;
|
||||||
|
|
|
@ -372,23 +372,205 @@ static void TexcomReverseCode(const uint8_t *code, int length, uint8_t *reverse_
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int texkom_get_type(texkom_card_select_t* card, bool verbose) {
|
||||||
|
|
||||||
|
if (card == NULL) {
|
||||||
|
return PM3_EINVARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get samples from tag.
|
||||||
|
|
||||||
|
uint32_t samplesCount = 30000;
|
||||||
|
clearCommandBuffer();
|
||||||
|
SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t));
|
||||||
|
PacketResponseNG resp;
|
||||||
|
if (WaitForResponseTimeout(CMD_HF_ACQ_RAW_ADC, &resp, 2500) == false) {
|
||||||
|
if (verbose) {
|
||||||
|
PrintAndLogEx(WARNING, "command execution time out");
|
||||||
|
}
|
||||||
|
return PM3_ETIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t size = (resp.data.asDwords[0]);
|
||||||
|
if (size > 0) {
|
||||||
|
if (getSamples(samplesCount, false) != PM3_SUCCESS) {
|
||||||
|
if (verbose)
|
||||||
|
PrintAndLogEx(ERR, "Get samples error");
|
||||||
|
|
||||||
|
return PM3_EFAILED;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// decode samples to 8 bytes
|
||||||
|
char bitstring[256] = {0};
|
||||||
|
char cbitstring[128] = {0};
|
||||||
|
char genbitstring[256] = {0};
|
||||||
|
int found = TexkomModError;
|
||||||
|
uint32_t sindx = 0;
|
||||||
|
|
||||||
|
while (sindx < samplesCount - 5) {
|
||||||
|
|
||||||
|
sindx = TexkomSearchStart(sindx, TEXKOM_NOISE_THRESHOLD);
|
||||||
|
if (sindx == 0 || sindx > samplesCount - 5) {
|
||||||
|
if (TexkomAVGField() > 30 && verbose) {
|
||||||
|
PrintAndLogEx(WARNING, "Too noisy environment. Try to move the tag from the antenna a bit.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t slen = TexkomSearchLength(sindx, TEXKOM_NOISE_THRESHOLD);
|
||||||
|
if (slen == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t maxlvl = TexkomSearchMax(sindx, 1760);
|
||||||
|
if (maxlvl < TEXKOM_NOISE_THRESHOLD) {
|
||||||
|
sindx += 1700;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t noiselvl = maxlvl / 5;
|
||||||
|
if (noiselvl < TEXKOM_NOISE_THRESHOLD) {
|
||||||
|
noiselvl = TEXKOM_NOISE_THRESHOLD;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t implengths[256] = {};
|
||||||
|
uint32_t implengthslen = 0;
|
||||||
|
uint32_t impulseindx = 0;
|
||||||
|
uint32_t impulsecnt = 0;
|
||||||
|
for (uint32_t i = 0; i < slen; i++) {
|
||||||
|
if (TexkomCorrelate(sindx + i, noiselvl)) {
|
||||||
|
impulsecnt++;
|
||||||
|
|
||||||
|
if (impulseindx != 0) {
|
||||||
|
if (implengthslen < 256) {
|
||||||
|
implengths[implengthslen++] = sindx + i - impulseindx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impulseindx = sindx + i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if it TK-17 modulation
|
||||||
|
// 65 impulses and 64 intervals (1 interval = 2 bits, interval length encoding) that represents 128 bit of card code
|
||||||
|
if (impulsecnt == 65) {
|
||||||
|
if (TexcomTK17Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) {
|
||||||
|
found = TexkomModTK17;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if it TK-13 modulation
|
||||||
|
// it have 127 or 128 impulses and 128 double-intervals that represents 128 bit of card code
|
||||||
|
if (impulsecnt == 127 || impulsecnt == 128) {
|
||||||
|
if (TexcomTK13Decode(implengths, implengthslen, bitstring, cbitstring, verbose)) {
|
||||||
|
found = TexkomModTK13;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// general decoding. it thought that there is 2 types of intervals "long" (1) and "short" (0)
|
||||||
|
// and tries to decode sequence. shows only raw data
|
||||||
|
if (verbose)
|
||||||
|
TexcomGeneralDecode(implengths, implengthslen, genbitstring, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found != TexkomModError) {
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < strlen(cbitstring); i++) {
|
||||||
|
card->tcode[i / 8] = (card->tcode[i / 8] << 1) | ((cbitstring[i] == '1') ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TexcomReverseCode(card->tcode, sizeof(card->tcode), card->rtcode);
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
return PM3_ESOFT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int read_texkom_uid(bool loop, bool verbose) {
|
||||||
|
|
||||||
|
do {
|
||||||
|
texkom_card_select_t card;
|
||||||
|
|
||||||
|
int res = texkom_get_type(&card, verbose);
|
||||||
|
|
||||||
|
if (loop) {
|
||||||
|
if (res != PM3_SUCCESS) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (res) {
|
||||||
|
case PM3_EFAILED:
|
||||||
|
case PM3_EINVARG:
|
||||||
|
return res;
|
||||||
|
case PM3_ETIMEOUT:
|
||||||
|
if (verbose) {
|
||||||
|
PrintAndLogEx(WARNING, "command execution time out");
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
case PM3_ESOFT:
|
||||||
|
if (verbose) {
|
||||||
|
PrintAndLogEx(WARNING, "texkom card select failed");
|
||||||
|
}
|
||||||
|
return PM3_ESOFT;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// decoding code
|
||||||
|
if (card.tcode[0] == 0xff && card.tcode[1] == 0xff) {
|
||||||
|
|
||||||
|
bool crc = (TexcomTK13CRC(&card.tcode[3]) == card.tcode[7]);
|
||||||
|
|
||||||
|
if (card.tcode[2] == 0x63) {
|
||||||
|
PrintAndLogEx(INFO, "TYPE..... TK13");
|
||||||
|
PrintAndLogEx(INFO, "UID...... " _GREEN_("%s"), sprint_hex(&card.tcode[3], 4));
|
||||||
|
if (verbose) {
|
||||||
|
PrintAndLogEx(INFO, "CRC...... %s", (crc) ? _GREEN_("ok") : _RED_("fail"));
|
||||||
|
}
|
||||||
|
} else if (card.tcode[2] == 0xCA) {
|
||||||
|
PrintAndLogEx(INFO, "TYPE..... TK17");
|
||||||
|
PrintAndLogEx(INFO, "UID...... " _GREEN_("%s"), sprint_hex(&card.tcode[3], 4));
|
||||||
|
if (verbose) {
|
||||||
|
PrintAndLogEx(INFO, "CRC...... %s", (crc) ? _GREEN_("ok") : _RED_("fail"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PrintAndLogEx(INFO, "Raw... %s", sprint_hex(card.tcode, 8));
|
||||||
|
PrintAndLogEx(INFO, "Raw Reversed... %s", sprint_hex(card.rtcode, 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (loop && kbd_enter_pressed() == false);
|
||||||
|
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int CmdHFTexkomReader(const char *Cmd) {
|
static int CmdHFTexkomReader(const char *Cmd) {
|
||||||
CLIParserContext *ctx;
|
CLIParserContext *ctx;
|
||||||
CLIParserInit(&ctx, "hf texkom reader",
|
CLIParserInit(&ctx, "hf texkom reader",
|
||||||
"Read a texkom tag",
|
"Read a texkom tag",
|
||||||
"hf texkom reader");
|
"hf texkom reader"
|
||||||
|
"hf texkom reader -@ -> continuous reader mode"
|
||||||
|
);
|
||||||
|
|
||||||
void *argtable[] = {
|
void *argtable[] = {
|
||||||
arg_param_begin,
|
arg_param_begin,
|
||||||
arg_lit0("v", "verbose", "Verbose scan and output"),
|
arg_lit0("v", "verbose", "Verbose scan and output"),
|
||||||
|
arg_lit0("@", NULL, "optional - continuous reader mode"),
|
||||||
arg_param_end
|
arg_param_end
|
||||||
};
|
};
|
||||||
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||||
|
|
||||||
bool verbose = arg_get_lit(ctx, 1);
|
bool verbose = arg_get_lit(ctx, 1);
|
||||||
|
bool cm = arg_get_lit(ctx, 2);
|
||||||
|
|
||||||
|
if (cm) {
|
||||||
|
PrintAndLogEx(INFO, "Press " _GREEN_("<Enter>") " to exit");
|
||||||
|
}
|
||||||
CLIParserFree(ctx);
|
CLIParserFree(ctx);
|
||||||
|
|
||||||
|
// return read_texkom_uid(cm, true);
|
||||||
|
|
||||||
uint32_t samplesCount = 30000;
|
uint32_t samplesCount = 30000;
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t));
|
SendCommandNG(CMD_HF_ACQ_RAW_ADC, (uint8_t *)&samplesCount, sizeof(uint32_t));
|
||||||
|
@ -494,7 +676,7 @@ static int CmdHFTexkomReader(const char *Cmd) {
|
||||||
if (tcode[0] == 0xff && tcode[1] == 0xff) {
|
if (tcode[0] == 0xff && tcode[1] == 0xff) {
|
||||||
// decoding code
|
// decoding code
|
||||||
|
|
||||||
if (!verbose) {
|
if (verbose == false) {
|
||||||
PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8));
|
PrintAndLogEx(INFO, "Texkom: %s", sprint_hex(tcode, 8));
|
||||||
PrintAndLogEx(INFO, "Texkom duplicator: %s", sprint_hex(rtcode, 8));
|
PrintAndLogEx(INFO, "Texkom duplicator: %s", sprint_hex(rtcode, 8));
|
||||||
}
|
}
|
||||||
|
@ -508,8 +690,9 @@ static int CmdHFTexkomReader(const char *Cmd) {
|
||||||
|
|
||||||
if (tcode[2] == 0x63) {
|
if (tcode[2] == 0x63) {
|
||||||
// TK13
|
// TK13
|
||||||
if (codefound != TexkomModTK13)
|
if (codefound != TexkomModTK13) {
|
||||||
PrintAndLogEx(WARNING, " mod type: WRONG");
|
PrintAndLogEx(WARNING, " mod type: WRONG");
|
||||||
|
}
|
||||||
PrintAndLogEx(INFO, "type : TK13");
|
PrintAndLogEx(INFO, "type : TK13");
|
||||||
PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4));
|
PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4));
|
||||||
|
|
||||||
|
@ -518,10 +701,11 @@ static int CmdHFTexkomReader(const char *Cmd) {
|
||||||
else
|
else
|
||||||
PrintAndLogEx(WARNING, "crc : WRONG");
|
PrintAndLogEx(WARNING, "crc : WRONG");
|
||||||
|
|
||||||
} else if (tcode[2] == 0xca) {
|
} else if (tcode[2] == 0xCA) {
|
||||||
// TK17
|
// TK17
|
||||||
if (codefound != TexkomModTK17)
|
if (codefound != TexkomModTK17) {
|
||||||
PrintAndLogEx(WARNING, " mod type: WRONG");
|
PrintAndLogEx(WARNING, " mod type: WRONG");
|
||||||
|
}
|
||||||
PrintAndLogEx(INFO, "type : TK17");
|
PrintAndLogEx(INFO, "type : TK17");
|
||||||
PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4));
|
PrintAndLogEx(INFO, "uid : %s", sprint_hex(&tcode[3], 4));
|
||||||
|
|
||||||
|
@ -551,7 +735,6 @@ static int CmdHFTexkomReader(const char *Cmd) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int CmdHFTexkomSim(const char *Cmd) {
|
static int CmdHFTexkomSim(const char *Cmd) {
|
||||||
CLIParserContext *ctx;
|
CLIParserContext *ctx;
|
||||||
CLIParserInit(&ctx, "hf texkom sim",
|
CLIParserInit(&ctx, "hf texkom sim",
|
||||||
|
@ -643,7 +826,6 @@ static int CmdHFTexkomSim(const char *Cmd) {
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int CmdHelp(const char *Cmd);
|
static int CmdHelp(const char *Cmd);
|
||||||
|
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
|
|
|
@ -36,6 +36,13 @@ enum TexkomModulation {
|
||||||
TexkomModTK17
|
TexkomModTK17
|
||||||
};
|
};
|
||||||
|
|
||||||
int CmdHFTexkom(const char *Cmd);
|
typedef struct {
|
||||||
|
uint8_t tcode[8];
|
||||||
|
uint8_t rtcode[8];
|
||||||
|
uint8_t tagtype;
|
||||||
|
} PACKED texkom_card_select_t;
|
||||||
|
|
||||||
|
|
||||||
|
int CmdHFTexkom(const char *Cmd);
|
||||||
|
int read_texkom_uid(bool loop, bool verbose);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue