style fixes

This commit is contained in:
iceman1001 2025-03-19 21:11:05 +01:00
commit 9965c784bf
2 changed files with 129 additions and 69 deletions

View file

@ -55,91 +55,118 @@ void annotateHitagU(char *exp, size_t size, const uint8_t *cmd, uint8_t cmdsize,
size_t exp_len = snprintf(exp, size, "Flg:"); size_t exp_len = snprintf(exp, size, "Flg:");
if (flag & HITAGU_FLAG_PEXT) { if ((flag & HITAGU_FLAG_PEXT) == HITAGU_FLAG_PEXT) {
exp_len += snprintf(exp + exp_len, size - exp_len, " PEXT"); exp_len += snprintf(exp + exp_len, size - exp_len, " PEXT");
} }
if (flag & HITAGU_FLAG_INV) {
if ((flag & HITAGU_FLAG_INV) == HITAGU_FLAG_INV) {
exp_len += snprintf(exp + exp_len, size - exp_len, " INV"); exp_len += snprintf(exp + exp_len, size - exp_len, " INV");
if (flag & HITAGU_FLAG_RFU) {
if ((flag & HITAGU_FLAG_RFU) == HITAGU_FLAG_RFU) {
exp_len += snprintf(exp + exp_len, size - exp_len, " RFU"); exp_len += snprintf(exp + exp_len, size - exp_len, " RFU");
} }
if (flag & HITAGU_FLAG_NOS) {
if ((flag & HITAGU_FLAG_NOS) == HITAGU_FLAG_NOS) {
exp_len += snprintf(exp + exp_len, size - exp_len, " NOS"); exp_len += snprintf(exp + exp_len, size - exp_len, " NOS");
} }
} else { } else {
if (flag & HITAGU_FLAG_SEL) {
if ((flag & HITAGU_FLAG_SEL) == HITAGU_FLAG_SEL) {
exp_len += snprintf(exp + exp_len, size - exp_len, " SEL"); exp_len += snprintf(exp + exp_len, size - exp_len, " SEL");
} }
if (flag & HITAGU_FLAG_ADR) {
if ((flag & HITAGU_FLAG_ADR) == HITAGU_FLAG_ADR) {
exp_len += snprintf(exp + exp_len, size - exp_len, " ADR"); exp_len += snprintf(exp + exp_len, size - exp_len, " ADR");
has_uid = true; has_uid = true;
} }
} }
if (flag & HITAGU_FLAG_CRCT) {
if ((flag & HITAGU_FLAG_CRCT) == HITAGU_FLAG_CRCT) {
exp_len += snprintf(exp + exp_len, size - exp_len, " CRCT"); exp_len += snprintf(exp + exp_len, size - exp_len, " CRCT");
} }
exp_len += snprintf(exp + exp_len, size - exp_len, "|Cmd: "); exp_len += snprintf(exp + exp_len, size - exp_len, "|Cmd: ");
switch (command) { switch (command) {
case HITAGU_CMD_LOGIN: { case HITAGU_CMD_LOGIN: {
bool has_mfc = false; bool has_mfc = false;
if (cmdsize == 6 + has_uid * HITAGU_UID_SIZE || cmdsize == 8 + has_uid * HITAGU_UID_SIZE) {
if (cmdsize == (6 + (has_uid * HITAGU_UID_SIZE)) || cmdsize == (8 + (has_uid * HITAGU_UID_SIZE))) {
exp_len += snprintf(exp + exp_len, size - exp_len, "8265 LOGIN"); exp_len += snprintf(exp + exp_len, size - exp_len, "8265 LOGIN");
} else if (cmdsize == 7 + has_uid * HITAGU_UID_SIZE || cmdsize == 9 + has_uid * HITAGU_UID_SIZE) {
uint8_t mfc; } else if (cmdsize == (7 + (has_uid * HITAGU_UID_SIZE)) || cmdsize == (9 + (has_uid * HITAGU_UID_SIZE))) {
uint8_t mfc = 0;
concatbits(&mfc, 0, cmd, 5 + 6 + 8 + 32, 8, false); concatbits(&mfc, 0, cmd, 5 + 6 + 8 + 32, 8, false);
exp_len += snprintf(exp + exp_len, size - exp_len, "LOGIN mfc:%02x ", mfc); exp_len += snprintf(exp + exp_len, size - exp_len, "LOGIN mfc:%02x ", mfc);
has_mfc = true; has_mfc = true;
} }
if (has_uid) { if (has_uid) {
uint8_t uid[HITAGU_UID_SIZE]; uint8_t uid[HITAGU_UID_SIZE] = {0};
concatbits(uid, 0, cmd, 5 + 6 + has_mfc * 8 + 32, HITAGU_UID_SIZE * 8, false); concatbits(uid, 0, cmd, 5 + 6 + has_mfc * 8 + 32, HITAGU_UID_SIZE * 8, false);
exp_len += snprintf(exp + exp_len, size - exp_len, " uid:%s", sprint_hex_inrow(uid, HITAGU_UID_SIZE)); exp_len += snprintf(exp + exp_len, size - exp_len, " uid:%s", sprint_hex_inrow(uid, HITAGU_UID_SIZE));
} }
uint8_t password[HITAG_PASSWORD_SIZE];
uint8_t password[HITAG_PASSWORD_SIZE] = {0};
concatbits(password, 0, cmd, 5 + 6 + has_mfc * 8 + has_uid * HITAGU_UID_SIZE * 8, HITAG_PASSWORD_SIZE * 8, false); concatbits(password, 0, cmd, 5 + 6 + has_mfc * 8 + has_uid * HITAGU_UID_SIZE * 8, HITAG_PASSWORD_SIZE * 8, false);
exp_len += snprintf(exp + exp_len, size - exp_len, " pwd:%s", sprint_hex_inrow(password, HITAG_PASSWORD_SIZE)); exp_len += snprintf(exp + exp_len, size - exp_len, " pwd:%s", sprint_hex_inrow(password, HITAG_PASSWORD_SIZE));
break; break;
} }
case HITAGU_CMD_INVENTORY: case HITAGU_CMD_INVENTORY: {
exp_len += snprintf(exp + exp_len, size - exp_len, "INVENTORY"); exp_len += snprintf(exp + exp_len, size - exp_len, "INVENTORY");
break; break;
}
case HITAGU_CMD_READ_MULTIPLE_BLOCK: { case HITAGU_CMD_READ_MULTIPLE_BLOCK: {
uint8_t block_addr; uint8_t block_addr = 0;
concatbits(&block_addr, 0, cmd, 5 + 6, 8, false); concatbits(&block_addr, 0, cmd, 5 + 6, 8, false);
uint8_t block_count; uint8_t block_count = 0;
concatbits(&block_count, 0, cmd, 5 + 6 + 8, 8, false); concatbits(&block_count, 0, cmd, 5 + 6 + 8, 8, false);
exp_len += snprintf(exp + exp_len, size - exp_len, "READ MULTIPLE BLOCK start:%d num:%d", reflect8(block_addr), reflect8(block_count)); exp_len += snprintf(exp + exp_len, size - exp_len, "READ MULTIPLE BLOCK start:%d num:%d"
, reflect8(block_addr)
, reflect8(block_count)
);
break; break;
} }
case HITAGU_CMD_WRITE_SINGLE_BLOCK: { case HITAGU_CMD_WRITE_SINGLE_BLOCK: {
uint8_t block_addr; uint8_t block_addr = 0;
concatbits(&block_addr, 0, cmd, 5 + 6, 8, false); concatbits(&block_addr, 0, cmd, 5 + 6, 8, false);
uint8_t block_data[4]; uint8_t block_data[4] = {0};
concatbits(block_data, 0, cmd, 5 + 6 + 8, 32, false); concatbits(block_data, 0, cmd, 5 + 6 + 8, 32, false);
exp_len += snprintf(exp + exp_len, size - exp_len, "WRITE SINGLE BLOCK start:%d data:[%s]", exp_len += snprintf(exp + exp_len, size - exp_len, "WRITE SINGLE BLOCK start:%d data:[%s]"
reflect8(block_addr), sprint_hex_inrow(block_data, 4)); , reflect8(block_addr)
, sprint_hex_inrow(block_data, 4)
);
break; break;
} }
case HITAGU_CMD_SELECT: case HITAGU_CMD_SELECT: {
exp_len += snprintf(exp + exp_len, size - exp_len, "SELECT"); exp_len += snprintf(exp + exp_len, size - exp_len, "SELECT");
break; break;
case HITAGU_CMD_SYSINFO: }
case HITAGU_CMD_SYSINFO: {
exp_len += snprintf(exp + exp_len, size - exp_len, "GET SYSTEM INFORMATION"); exp_len += snprintf(exp + exp_len, size - exp_len, "GET SYSTEM INFORMATION");
break; break;
case HITAGU_CMD_READ_UID: }
case HITAGU_CMD_READ_UID: {
exp_len += snprintf(exp + exp_len, size - exp_len, "READ UID"); exp_len += snprintf(exp + exp_len, size - exp_len, "READ UID");
break; break;
case HITAGU_CMD_STAY_QUIET: }
case HITAGU_CMD_STAY_QUIET: {
exp_len += snprintf(exp + exp_len, size - exp_len, "STAY QUIET"); exp_len += snprintf(exp + exp_len, size - exp_len, "STAY QUIET");
break; break;
default: }
default: {
exp_len += snprintf(exp + exp_len, size - exp_len, "Unknown 0x%02X", command); exp_len += snprintf(exp + exp_len, size - exp_len, "Unknown 0x%02X", command);
break; break;
}
} }
} }
} }
@ -206,10 +233,12 @@ static int process_hitagu_common_args(CLIParserContext *ctx, lf_hitag_data_t *co
packet->cmd = HTUF_82xx; packet->cmd = HTUF_82xx;
memcpy(packet->pwd, key, sizeof(packet->pwd)); memcpy(packet->pwd, key, sizeof(packet->pwd));
PrintAndLogEx(INFO, "Authenticating to " _YELLOW_("Hitag µ") " in 82xx mode"); PrintAndLogEx(INFO, "Authenticating to " _YELLOW_("Hitag µ") " in 82xx mode");
} else if (use_password) { } else if (use_password) {
packet->cmd = HTUF_PASSWORD; packet->cmd = HTUF_PASSWORD;
memcpy(packet->pwd, key, sizeof(packet->pwd)); memcpy(packet->pwd, key, sizeof(packet->pwd));
PrintAndLogEx(INFO, "Authenticating to " _YELLOW_("Hitag µ") " in password mode"); PrintAndLogEx(INFO, "Authenticating to " _YELLOW_("Hitag µ") " in password mode");
} else { } else {
packet->cmd = HTUF_PLAIN; packet->cmd = HTUF_PLAIN;
memcpy(packet->pwd, key, sizeof(packet->pwd)); memcpy(packet->pwd, key, sizeof(packet->pwd));
@ -220,43 +249,58 @@ static int process_hitagu_common_args(CLIParserContext *ctx, lf_hitag_data_t *co
} }
static void print_error(int8_t reason) { static void print_error(int8_t reason) {
//todo: USE ENUM OR DEFINES
switch (reason) { switch (reason) {
case 0: case 0: {
PrintAndLogEx(FAILED, "No data"); PrintAndLogEx(FAILED, "No data");
break; break;
case -2: }
case -2: {
PrintAndLogEx(FAILED, "UID Request failed!"); PrintAndLogEx(FAILED, "UID Request failed!");
break; break;
case -3: }
case -3: {
PrintAndLogEx(FAILED, "Select UID failed!"); PrintAndLogEx(FAILED, "Select UID failed!");
break; break;
case -4: }
case -4: {
PrintAndLogEx(FAILED, "No write access on block. Not authorized?"); PrintAndLogEx(FAILED, "No write access on block. Not authorized?");
break; break;
case -5: }
case -5: {
PrintAndLogEx(FAILED, "Write failed! Wrong password?"); PrintAndLogEx(FAILED, "Write failed! Wrong password?");
break; break;
case -6: }
case -6: {
PrintAndLogEx(FAILED, "Error, " _YELLOW_("AUT=1") " This tag is configured in Authentication Mode"); PrintAndLogEx(FAILED, "Error, " _YELLOW_("AUT=1") " This tag is configured in Authentication Mode");
break; break;
case -7: }
case -7: {
PrintAndLogEx(FAILED, "Error, unknown function"); PrintAndLogEx(FAILED, "Error, unknown function");
break; break;
case -8: }
case -8: {
PrintAndLogEx(FAILED, "Authenticate failed!"); PrintAndLogEx(FAILED, "Authenticate failed!");
break; break;
case -9: }
case -9: {
PrintAndLogEx(FAILED, "No write access on block"); PrintAndLogEx(FAILED, "No write access on block");
break; break;
case -10: }
case -10: {
PrintAndLogEx(FAILED, "Write to block failed!"); PrintAndLogEx(FAILED, "Write to block failed!");
break; break;
case -11: }
case -11: {
PrintAndLogEx(FAILED, "Read block failed!"); PrintAndLogEx(FAILED, "Read block failed!");
break; break;
default: }
default: {
// PM3_REASON_UNKNOWN // PM3_REASON_UNKNOWN
PrintAndLogEx(FAILED, "Error - Hitag µ failed"); PrintAndLogEx(FAILED, "Error - Hitag µ failed");
break;
}
} }
} }
@ -312,19 +356,21 @@ static int CmdLFHitagURead(const char *Cmd) {
lf_hitag_data_t packet; lf_hitag_data_t packet;
if (process_hitagu_common_args(ctx, &packet) < 0) return PM3_EINVARG; if (process_hitagu_common_args(ctx, &packet) < 0) {
return PM3_EINVARG;
}
uint32_t page = arg_get_int_def(ctx, 3, 0); uint32_t page = arg_get_int_def(ctx, 3, 0);
if (page >= HITAGU_MAX_BLOCKS) { if (page >= HITAGU_MAX_BLOCKS) {
PrintAndLogEx(WARNING, "Block address Invalid. Maximum is 255."); PrintAndLogEx(WARNING, "Block address out-of-range. Max is 255, got %u", page);
return PM3_EINVARG; return PM3_EINVARG;
} }
uint32_t count = arg_get_int_def(ctx, 4, 1); uint32_t count = arg_get_int_def(ctx, 4, 1);
if (count > HITAGU_MAX_BLOCKS) { if (count > HITAGU_MAX_BLOCKS) {
PrintAndLogEx(WARNING, "No more than %d blocks can be read at once.", HITAGU_MAX_BLOCKS); PrintAndLogEx(WARNING, "No more than %d blocks can be read at once", HITAGU_MAX_BLOCKS);
return PM3_EINVARG; return PM3_EINVARG;
} }
@ -334,14 +380,14 @@ static int CmdLFHitagURead(const char *Cmd) {
packet.page_count = count; packet.page_count = count;
// packet.mode = 1; // for debug // packet.mode = 1; // for debug
PrintAndLogEx(INFO, "Read Hitag µ memory block %d, count %d", page, count); PrintAndLogEx(INFO, "Read Hitag µ memory block " _YELLOW_("%d") ", count " _YELLOW_("%d"), page, count);
clearCommandBuffer(); clearCommandBuffer();
SendCommandNG(CMD_LF_HITAGU_READ, (uint8_t *)&packet, sizeof(packet)); SendCommandNG(CMD_LF_HITAGU_READ, (uint8_t *)&packet, sizeof(packet));
PacketResponseNG resp; PacketResponseNG resp;
if (WaitForResponseTimeout(CMD_LF_HITAGU_READ, &resp, 2000) == false) { if (WaitForResponseTimeout(CMD_LF_HITAGU_READ, &resp, 2000) == false) {
PrintAndLogEx(WARNING, "timeout while waiting for reply."); PrintAndLogEx(WARNING, "timeout while waiting for reply");
SendCommandNG(CMD_BREAK_LOOP, NULL, 0); SendCommandNG(CMD_BREAK_LOOP, NULL, 0);
return PM3_ETIMEOUT; return PM3_ETIMEOUT;
} }
@ -392,10 +438,12 @@ static int CmdLFHitagURead(const char *Cmd) {
} }
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
int page_addr = page + i; int page_addr = page + i;
if (page_addr >= HITAGU_MAX_BLOCKS) { if (page_addr >= HITAGU_MAX_BLOCKS) {
break; break;
} }
if (card->pages_reason[i] > 0) { if (card->pages_reason[i] > 0) {
PrintAndLogEx(SUCCESS, "% 3u | %s | " NOLF, page_addr, sprint_hex_ascii(card->pages[i], HITAGU_BLOCK_SIZE)); PrintAndLogEx(SUCCESS, "% 3u | %s | " NOLF, page_addr, sprint_hex_ascii(card->pages[i], HITAGU_BLOCK_SIZE));
@ -407,26 +455,36 @@ static int CmdLFHitagURead(const char *Cmd) {
PrintAndLogEx(NORMAL, _RED_("R/WP") NOLF); PrintAndLogEx(NORMAL, _RED_("R/WP") NOLF);
// Hitag µ // Hitag µ
} else if (page_addr < HITAGU_MAX_PAGE_STANDARD) { } else if (page_addr < HITAGU_MAX_PAGE_STANDARD) {
if (card->config_page.s.pwdW0_127)
if (card->config_page.s.pwdW0_127) {
PrintAndLogEx(NORMAL, _RED_("RO ") NOLF); PrintAndLogEx(NORMAL, _RED_("RO ") NOLF);
else } else {
PrintAndLogEx(NORMAL, _GREEN_("RW ") NOLF); PrintAndLogEx(NORMAL, _GREEN_("RW ") NOLF);
}
} else if (HITAGU_MAX_PAGE_STANDARD <= page_addr && page_addr < HITAGU_MAX_PAGE_ADVANCED) { } else if (HITAGU_MAX_PAGE_STANDARD <= page_addr && page_addr < HITAGU_MAX_PAGE_ADVANCED) {
if (card->config_page.s.pwdW128_511)
if (card->config_page.s.pwdW128_511) {
PrintAndLogEx(NORMAL, _RED_("RO ") NOLF); PrintAndLogEx(NORMAL, _RED_("RO ") NOLF);
else } else {
PrintAndLogEx(NORMAL, _GREEN_("RW ") NOLF); PrintAndLogEx(NORMAL, _GREEN_("RW ") NOLF);
}
} else if (HITAGU_MAX_PAGE_ADVANCED <= page_addr && page_addr < HITAGU_MAX_PAGE_ADVANCED_PLUS) { } else if (HITAGU_MAX_PAGE_ADVANCED <= page_addr && page_addr < HITAGU_MAX_PAGE_ADVANCED_PLUS) {
if (card->config_page.s.pwdRW512_max) { if (card->config_page.s.pwdRW512_max) {
PrintAndLogEx(NORMAL, _RED_("R/WP") NOLF); PrintAndLogEx(NORMAL, _RED_("R/WP") NOLF);
} else { } else {
if (card->config_page.s.pwdW512_max)
if (card->config_page.s.pwdW512_max) {
PrintAndLogEx(NORMAL, _RED_("RO ") NOLF); PrintAndLogEx(NORMAL, _RED_("RO ") NOLF);
else } else {
PrintAndLogEx(NORMAL, _GREEN_("RW ") NOLF); PrintAndLogEx(NORMAL, _GREEN_("RW ") NOLF);
}
} }
} else } else {
PrintAndLogEx(NORMAL, _YELLOW_("UNK ") NOLF); PrintAndLogEx(NORMAL, _YELLOW_("UNK ") NOLF);
}
PrintAndLogEx(NORMAL, " | " NOLF); PrintAndLogEx(NORMAL, " | " NOLF);
@ -435,8 +493,9 @@ static int CmdLFHitagURead(const char *Cmd) {
PrintAndLogEx(NORMAL, "Password"); PrintAndLogEx(NORMAL, "Password");
} else if (page_addr == HITAGU_CONFIG_PADR) { } else if (page_addr == HITAGU_CONFIG_PADR) {
PrintAndLogEx(NORMAL, "Config"); PrintAndLogEx(NORMAL, "Config");
} else } else {
PrintAndLogEx(NORMAL, "Data"); PrintAndLogEx(NORMAL, "Data");
}
} else { } else {
PrintAndLogEx(INFO, "% 3u | -- -- -- -- | .... | N/A | " NOLF, page_addr); PrintAndLogEx(INFO, "% 3u | -- -- -- -- | .... | N/A | " NOLF, page_addr);
print_error(card->pages_reason[i]); print_error(card->pages_reason[i]);
@ -493,7 +552,7 @@ static int CmdLFHitagUDump(const char *Cmd) {
PacketResponseNG resp; PacketResponseNG resp;
if (WaitForResponseTimeout(CMD_LF_HITAGU_READ, &resp, 5000) == false) { if (WaitForResponseTimeout(CMD_LF_HITAGU_READ, &resp, 5000) == false) {
PrintAndLogEx(WARNING, "timeout while waiting for reply."); PrintAndLogEx(WARNING, "timeout while waiting for reply");
return PM3_ETIMEOUT; return PM3_ETIMEOUT;
} }
@ -540,7 +599,7 @@ static int CmdLFHitagUDump(const char *Cmd) {
if (fnlen < 1) { if (fnlen < 1) {
char *fptr = filename; char *fptr = filename;
fptr += snprintf(filename, sizeof(filename), "lf-hitagu-"); fptr += snprintf(filename, sizeof(filename), "lf-htu-");
FillFileNameByUID(fptr, card->uid, "-dump", HITAGU_UID_SIZE); FillFileNameByUID(fptr, card->uid, "-dump", HITAGU_UID_SIZE);
} }
@ -593,7 +652,7 @@ static int CmdLFHitagUWrite(const char *Cmd) {
PacketResponseNG resp; PacketResponseNG resp;
if (WaitForResponseTimeout(CMD_LF_HITAGU_WRITE, &resp, 4000) == false) { if (WaitForResponseTimeout(CMD_LF_HITAGU_WRITE, &resp, 4000) == false) {
PrintAndLogEx(WARNING, "timeout while waiting for reply."); PrintAndLogEx(WARNING, "timeout while waiting for reply");
return PM3_ETIMEOUT; return PM3_ETIMEOUT;
} }
@ -617,7 +676,9 @@ static int CmdLFHitagUReader(const char *Cmd) {
"lf hitag htu reader\n" "lf hitag htu reader\n"
"lf hitag htu reader -@ -> Continuous mode"); "lf hitag htu reader -@ -> Continuous mode");
void *argtable[] = {arg_param_begin, arg_lit0("@", NULL, "continuous reader mode"), arg_param_end}; void *argtable[] = {
arg_param_begin, arg_lit0("@", NULL, "continuous reader mode"), arg_param_end
};
CLIExecWithReturn(ctx, Cmd, argtable, true); CLIExecWithReturn(ctx, Cmd, argtable, true);
bool cm = arg_get_lit(ctx, 1); bool cm = arg_get_lit(ctx, 1);
CLIParserFree(ctx); CLIParserFree(ctx);
@ -627,7 +688,6 @@ static int CmdLFHitagUReader(const char *Cmd) {
} }
do { do {
// read UID
read_htu_uid(); read_htu_uid();
} while (cm && kbd_enter_pressed() == false); } while (cm && kbd_enter_pressed() == false);
@ -663,16 +723,16 @@ static int CmdLFHitagUSim(const char *Cmd) {
static int CmdLFHitagUList(const char *Cmd) { return CmdTraceListAlias(Cmd, "lf hitag htu", "htu"); } static int CmdLFHitagUList(const char *Cmd) { return CmdTraceListAlias(Cmd, "lf hitag htu", "htu"); }
static command_t CommandTable[] = { static command_t CommandTable[] = {
{"help", CmdHelp, AlwaysAvailable, "This help" }, {"help", CmdHelp, AlwaysAvailable, "This help"},
{"list", CmdLFHitagUList, AlwaysAvailable, "List Hitag µ trace history" }, {"list", CmdLFHitagUList, AlwaysAvailable, "List Hitag µ trace history"},
{"-----------", CmdHelp, IfPm3Hitag, "----------------------- " _CYAN_("General") " ------------------------" }, {"-----------", CmdHelp, IfPm3Hitag, "----------- " _CYAN_("General") " -----------"},
{"reader", CmdLFHitagUReader, IfPm3Hitag, "Act like a Hitag µ reader" }, {"reader", CmdLFHitagUReader, IfPm3Hitag, "Act like a Hitag µ reader"},
{"rdbl", CmdLFHitagURead, IfPm3Hitag, "Read Hitag µ block" }, {"rdbl", CmdLFHitagURead, IfPm3Hitag, "Read Hitag µ block"},
{"dump", CmdLFHitagUDump, IfPm3Hitag, "Dump Hitag µ blocks to a file" }, {"dump", CmdLFHitagUDump, IfPm3Hitag, "Dump Hitag µ blocks to a file"},
{"wrbl", CmdLFHitagUWrite, IfPm3Hitag, "Write Hitag µ block" }, {"wrbl", CmdLFHitagUWrite, IfPm3Hitag, "Write Hitag µ block"},
{"-----------", CmdHelp, IfPm3Hitag, "----------------------- " _CYAN_("Simulation") " -----------------------"}, {"-----------", CmdHelp, IfPm3Hitag, "----------- " _CYAN_("Simulation") " -----------"},
{"sim", CmdLFHitagUSim, IfPm3Hitag, "Simulate Hitag µ transponder" }, {"sim", CmdLFHitagUSim, IfPm3Hitag, "Simulate Hitag µ transponder"},
{NULL, NULL, 0, NULL } {NULL, NULL, 0, NULL}
}; };
static int CmdHelp(const char *Cmd) { static int CmdHelp(const char *Cmd) {

View file

@ -9977,7 +9977,7 @@
}, },
"lf hitag help": { "lf hitag help": {
"command": "lf hitag help", "command": "lf hitag help",
"description": "help This help list List Hitag trace history hts { Hitag S/8211 operations } htu { Hitag \u00b5/8265 operations } test Perform self tests view Display content from tag dump file lookup Uses authentication trace to check for key in dictionary file --------------------------------------------------------------------------------------- lf hitag list available offline: yes Alias of `trace list -t hitag2` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "description": "help This help list List Hitag trace history hts { Hitag S/8211 operations } htu { Hitag \u00b5/8265 operations } test Perform self tests view Display content from tag dump file lookup Uses authentication trace to check for key in dictionary file --------------------------------------------------------------------------------------- lf hitag list available offline: yes Alias of `trace list -t ht2` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol",
"notes": [ "notes": [
"lf hitag list --frame -> show frame delay times", "lf hitag list --frame -> show frame delay times",
"lf hitag list -1 -> use trace buffer" "lf hitag list -1 -> use trace buffer"
@ -10021,7 +10021,7 @@
}, },
"lf hitag hts help": { "lf hitag hts help": {
"command": "lf hitag hts help", "command": "lf hitag hts help",
"description": "help This help list List Hitag S trace history --------------------------------------------------------------------------------------- lf hitag hts list available offline: yes Alias of `trace list -t hitags` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "description": "help This help list List Hitag S trace history --------------------------------------------------------------------------------------- lf hitag hts list available offline: yes Alias of `trace list -t hts` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol",
"notes": [ "notes": [
"lf hitag hts list --frame -> show frame delay times", "lf hitag hts list --frame -> show frame delay times",
"lf hitag hts list -1 -> use trace buffer" "lf hitag hts list -1 -> use trace buffer"
@ -10158,7 +10158,7 @@
}, },
"lf hitag htu help": { "lf hitag htu help": {
"command": "lf hitag htu help", "command": "lf hitag htu help",
"description": "help This help list List Hitag \u00b5 trace history --------------------------------------------------------------------------------------- lf hitag htu list available offline: yes Alias of `trace list -t hitagu` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol", "description": "help This help list List Hitag \u00b5 trace history --------------------------------------------------------------------------------------- lf hitag htu list available offline: yes Alias of `trace list -t htu` with selected protocol data to annotate trace buffer You can load a trace from file (see `trace load -h`) or it be downloaded from device by default It accepts all other arguments of `trace list`. Note that some might not be relevant for this specific protocol",
"notes": [ "notes": [
"lf hitag htu list --frame -> show frame delay times", "lf hitag htu list --frame -> show frame delay times",
"lf hitag htu list -1 -> use trace buffer" "lf hitag htu list -1 -> use trace buffer"
@ -13357,6 +13357,6 @@
"metadata": { "metadata": {
"commands_extracted": 767, "commands_extracted": 767,
"extracted_by": "PM3Help2JSON v1.00", "extracted_by": "PM3Help2JSON v1.00",
"extracted_on": "2025-03-19T14:19:20" "extracted_on": "2025-03-19T20:08:46"
} }
} }