mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
lf idteck demod takes a raw hex string and tries to decode it
This commit is contained in:
parent
7d67ac633a
commit
49f07a39d5
3 changed files with 71 additions and 14 deletions
|
@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
|
||||||
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
||||||
|
|
||||||
## [unreleased][unreleased]
|
## [unreleased][unreleased]
|
||||||
|
- Changed `lf idteck demod --raw` - now supports raw hex string to decode (@iceman1001)
|
||||||
- Changed `lf em 410x demod --bin` - now supports a raw binary string to demodulate. (@iceman1001)
|
- Changed `lf em 410x demod --bin` - now supports a raw binary string to demodulate. (@iceman1001)
|
||||||
- Changed `lf em 4x05 info` - use `-v` verbose flag to see protection bits (@iceman1001)
|
- Changed `lf em 4x05 info` - use `-v` verbose flag to see protection bits (@iceman1001)
|
||||||
- Changed `lf em 4x05 info` - output now shows detailed bits (@iceman1001)
|
- Changed `lf em 4x05 info` - output now shows detailed bits (@iceman1001)
|
||||||
|
|
|
@ -1859,7 +1859,7 @@ int CmdLFfind(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// psk
|
// psk
|
||||||
if (demodIdteck(true) == PM3_SUCCESS) {
|
if (demodIdteck(NULL, true) == PM3_SUCCESS) {
|
||||||
PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Idteck ID") " found!");
|
PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Idteck ID") " found!");
|
||||||
if (search_cont) {
|
if (search_cont) {
|
||||||
found++;
|
found++;
|
||||||
|
|
|
@ -32,18 +32,19 @@
|
||||||
#include "cmdlfem4x05.h" // EM defines
|
#include "cmdlfem4x05.h" // EM defines
|
||||||
#include "protocols.h" // T55x7 defines
|
#include "protocols.h" // T55x7 defines
|
||||||
#include "cmdlft55xx.h" // verifywrite
|
#include "cmdlft55xx.h" // verifywrite
|
||||||
|
#include "generator.h"
|
||||||
|
#include "wiegand_formats.h"
|
||||||
|
|
||||||
static int CmdHelp(const char *Cmd);
|
static int CmdHelp(const char *Cmd);
|
||||||
|
|
||||||
int demodIdteck(bool verbose) {
|
static int demod_idteck_signal(void) {
|
||||||
(void) verbose; // unused so far
|
|
||||||
if (PSKDemod(0, 0, 100, false) != PM3_SUCCESS) {
|
if (PSKDemod(0, 0, 100, false) != PM3_SUCCESS) {
|
||||||
PrintAndLogEx(DEBUG, "DEBUG: Error - Idteck PSKDemod failed");
|
PrintAndLogEx(DEBUG, "DEBUG: Error - Idteck PSKDemod failed");
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
}
|
}
|
||||||
size_t size = g_DemodBufferLen;
|
size_t size = g_DemodBufferLen;
|
||||||
|
|
||||||
//get binary from PSK1 wave
|
// get binary from PSK1 wave
|
||||||
int idx = detectIdteck(g_DemodBuffer, &size);
|
int idx = detectIdteck(g_DemodBuffer, &size);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
|
|
||||||
|
@ -81,17 +82,67 @@ int demodIdteck(bool verbose) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setDemodBuff(g_DemodBuffer, 64, idx);
|
setDemodBuff(g_DemodBuffer, 64, idx);
|
||||||
|
return PM3_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
//got a good demod
|
int demodIdteck(uint8_t *raw, bool verbose) {
|
||||||
|
(void) verbose; // unused so far
|
||||||
|
|
||||||
|
uint32_t raw1 = 0;
|
||||||
|
uint32_t raw2 = 0;
|
||||||
|
|
||||||
|
if (raw == NULL) {
|
||||||
|
// get binary from PSK1 wave
|
||||||
|
int ret = demod_idteck_signal();
|
||||||
|
if (ret != PM3_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
raw1 = bytebits_to_byte(g_DemodBuffer, 32);
|
||||||
|
raw2 = bytebits_to_byte(g_DemodBuffer + 32, 32);
|
||||||
|
} else {
|
||||||
|
raw1 = bytes_to_num(raw, 4);
|
||||||
|
raw2 = bytes_to_num(raw + 4, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// got a good demod
|
||||||
uint32_t id = 0;
|
uint32_t id = 0;
|
||||||
uint32_t raw1 = bytebits_to_byte(g_DemodBuffer, 32);
|
|
||||||
uint32_t raw2 = bytebits_to_byte(g_DemodBuffer + 32, 32);
|
|
||||||
|
|
||||||
//parity check (TBD)
|
if (raw1 != 0x4944544B) {
|
||||||
//checksum check (TBD)
|
PrintAndLogEx(FAILED, "No genuine IDTECK found");
|
||||||
|
}
|
||||||
|
|
||||||
//output
|
// parity check (TBD)
|
||||||
PrintAndLogEx(SUCCESS, "IDTECK Tag Found: Card ID %u , Raw: %08X%08X", id, raw1, raw2);
|
|
||||||
|
uint32_t tmp = raw2;
|
||||||
|
lf_idteck_decrypt((uint16_t*)&tmp);
|
||||||
|
|
||||||
|
// checksum check (TBD)
|
||||||
|
// 351FBE4B -> 90370752 Card Code [523707] CUSUM = 52+37+07=90
|
||||||
|
// So, first byte is Csum
|
||||||
|
uint8_t chksum = ((tmp >> 24) & 0xFF);
|
||||||
|
uint8_t calc = ((tmp >> 16) & 0xFF) +
|
||||||
|
((tmp >> 8) & 0xFF) +
|
||||||
|
(tmp & 0xFF);
|
||||||
|
|
||||||
|
id = ((tmp >> 16) & 0xFF) | ((tmp >> 8) & 0xFF) << 8 | (tmp & 0xFF) << 16;
|
||||||
|
|
||||||
|
// output
|
||||||
|
PrintAndLogEx(SUCCESS, "IDTECK Tag Found: Card ID " _GREEN_("%u") " ( 0x%06X ) Raw: %08X%08X chksum 0x%02X ( %s )",
|
||||||
|
id,
|
||||||
|
id,
|
||||||
|
raw1,
|
||||||
|
raw2,
|
||||||
|
chksum,
|
||||||
|
(chksum == calc) ? _GREEN_("ok") : _RED_("fail")
|
||||||
|
);
|
||||||
|
|
||||||
|
wiegand_message_t packed = {
|
||||||
|
.Bot = id,
|
||||||
|
.Mid = 0,
|
||||||
|
.Top = 0,
|
||||||
|
.Length = 26
|
||||||
|
};
|
||||||
|
HIDUnpack(0, &packed);
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,16 +150,21 @@ static int CmdIdteckDemod(const char *Cmd) {
|
||||||
CLIParserContext *ctx;
|
CLIParserContext *ctx;
|
||||||
CLIParserInit(&ctx, "lf idteck demod",
|
CLIParserInit(&ctx, "lf idteck demod",
|
||||||
"Try to find Idteck preamble, if found decode / descramble data",
|
"Try to find Idteck preamble, if found decode / descramble data",
|
||||||
"lf idteck demod"
|
"lf idteck demod\n"
|
||||||
|
"lf idteck demod --raw 4944544B351FBE4B"
|
||||||
);
|
);
|
||||||
|
|
||||||
void *argtable[] = {
|
void *argtable[] = {
|
||||||
arg_param_begin,
|
arg_param_begin,
|
||||||
|
arg_str0("r", "raw", "<hex>", "raw bytes"),
|
||||||
arg_param_end
|
arg_param_end
|
||||||
};
|
};
|
||||||
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
CLIExecWithReturn(ctx, Cmd, argtable, true);
|
||||||
|
int raw_len = 0;
|
||||||
|
uint8_t raw[8] = {0};
|
||||||
|
CLIGetHexWithReturn(ctx, 1, raw, &raw_len);
|
||||||
CLIParserFree(ctx);
|
CLIParserFree(ctx);
|
||||||
return demodIdteck(true);
|
return demodIdteck(raw, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CmdIdteckClone(const char *Cmd) {
|
static int CmdIdteckClone(const char *Cmd) {
|
||||||
|
@ -258,7 +314,7 @@ static int CmdIdteckReader(const char *Cmd) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
lf_read(false, 5000);
|
lf_read(false, 5000);
|
||||||
demodIdteck(!cm);
|
demodIdteck(NULL, !cm);
|
||||||
} while (cm && !kbd_enter_pressed());
|
} while (cm && !kbd_enter_pressed());
|
||||||
|
|
||||||
return PM3_SUCCESS;
|
return PM3_SUCCESS;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue