mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 05:13:46 -07:00
ADD: 'lf search' - added @marshmellow42 's hitag2 identification
This commit is contained in:
parent
a38f5a0704
commit
69784c3801
3 changed files with 67 additions and 8 deletions
|
@ -698,6 +698,42 @@ static bool hitag2_test_auth_attempts(byte_t* rx, const size_t rxlen, byte_t* tx
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool hitag2_read_uid(byte_t* rx, const size_t rxlen, byte_t* tx, size_t* txlen) {
|
||||||
|
// Reset the transmission frame length
|
||||||
|
*txlen = 0;
|
||||||
|
|
||||||
|
// Try to find out which command was send by selecting on length (in bits)
|
||||||
|
switch (rxlen) {
|
||||||
|
// No answer, try to resurrect
|
||||||
|
case 0: {
|
||||||
|
// Just starting or if there is no answer
|
||||||
|
*txlen = 5;
|
||||||
|
memcpy(tx,"\xc0",nbytes(*txlen));
|
||||||
|
} break;
|
||||||
|
// Received UID
|
||||||
|
case 32: {
|
||||||
|
// Check if we received answer tag (at)
|
||||||
|
if (bAuthenticating) {
|
||||||
|
bAuthenticating = false;
|
||||||
|
} else {
|
||||||
|
// Store the received block
|
||||||
|
memcpy(tag.sectors[blocknr],rx,4);
|
||||||
|
blocknr++;
|
||||||
|
}
|
||||||
|
if (blocknr > 0) {
|
||||||
|
//DbpString("Read successful!");
|
||||||
|
bSuccessful = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} break;
|
||||||
|
// Unexpected response
|
||||||
|
default: {
|
||||||
|
Dbprintf("Uknown frame length: %d",rxlen);
|
||||||
|
return false;
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void SnoopHitag(uint32_t type) {
|
void SnoopHitag(uint32_t type) {
|
||||||
int frame_count;
|
int frame_count;
|
||||||
|
@ -1129,7 +1165,7 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
clear_trace();
|
clear_trace();
|
||||||
set_tracing(TRUE);
|
set_tracing(TRUE);
|
||||||
|
|
||||||
DbpString("Starting Hitag reader family");
|
//DbpString("Starting Hitag reader family");
|
||||||
|
|
||||||
// Check configuration
|
// Check configuration
|
||||||
switch(htf) {
|
switch(htf) {
|
||||||
|
@ -1171,7 +1207,13 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
bQuiet = false;
|
bQuiet = false;
|
||||||
bCrypto = false;
|
bCrypto = false;
|
||||||
} break;
|
} break;
|
||||||
|
case RHT2F_UID_ONLY: {
|
||||||
|
blocknr = 0;
|
||||||
|
bQuiet = false;
|
||||||
|
bCrypto = false;
|
||||||
|
bAuthenticating = false;
|
||||||
|
bQuitTraceFull = true;
|
||||||
|
} break;
|
||||||
default: {
|
default: {
|
||||||
Dbprintf("Error, unknown function: %d",htf);
|
Dbprintf("Error, unknown function: %d",htf);
|
||||||
set_tracing(FALSE);
|
set_tracing(FALSE);
|
||||||
|
@ -1229,23 +1271,23 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
// hitagS settings
|
// hitagS settings
|
||||||
reset_sof = 1;
|
reset_sof = 1;
|
||||||
t_wait = 200;
|
t_wait = 200;
|
||||||
DbpString("Configured for hitagS reader");
|
//DbpString("Configured for hitagS reader");
|
||||||
} else if (htf < 20) {
|
} else if (htf < 20) {
|
||||||
// hitag1 settings
|
// hitag1 settings
|
||||||
reset_sof = 1;
|
reset_sof = 1;
|
||||||
t_wait = 200;
|
t_wait = 200;
|
||||||
DbpString("Configured for hitag1 reader");
|
//DbpString("Configured for hitag1 reader");
|
||||||
} else if (htf < 30) {
|
} else if (htf < 30) {
|
||||||
// hitag2 settings
|
// hitag2 settings
|
||||||
reset_sof = 4;
|
reset_sof = 4;
|
||||||
t_wait = HITAG_T_WAIT_2;
|
t_wait = HITAG_T_WAIT_2;
|
||||||
DbpString("Configured for hitag2 reader");
|
//DbpString("Configured for hitag2 reader");
|
||||||
} else {
|
} else {
|
||||||
Dbprintf("Error, unknown hitag reader type: %d",htf);
|
Dbprintf("Error, unknown hitag reader type: %d",htf);
|
||||||
set_tracing(FALSE);
|
set_tracing(FALSE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
uint8_t attempt_count=0;
|
||||||
while(!bStop && !BUTTON_PRESS()) {
|
while(!bStop && !BUTTON_PRESS()) {
|
||||||
// Watchdog hit
|
// Watchdog hit
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
@ -1280,6 +1322,11 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
case RHT2F_TEST_AUTH_ATTEMPTS: {
|
case RHT2F_TEST_AUTH_ATTEMPTS: {
|
||||||
bStop = !hitag2_test_auth_attempts(rx,rxlen,tx,&txlen);
|
bStop = !hitag2_test_auth_attempts(rx,rxlen,tx,&txlen);
|
||||||
} break;
|
} break;
|
||||||
|
case RHT2F_UID_ONLY: {
|
||||||
|
bStop = !hitag2_read_uid(rx, rxlen, tx, &txlen);
|
||||||
|
attempt_count++; //attempt 3 times to get uid then quit
|
||||||
|
if (!bStop && attempt_count == 3) bStop = true;
|
||||||
|
} break;
|
||||||
default: {
|
default: {
|
||||||
Dbprintf("Error, unknown function: %d",htf);
|
Dbprintf("Error, unknown function: %d",htf);
|
||||||
set_tracing(FALSE);
|
set_tracing(FALSE);
|
||||||
|
@ -1326,6 +1373,8 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
bSkip = true;
|
bSkip = true;
|
||||||
tag_sof = reset_sof;
|
tag_sof = reset_sof;
|
||||||
response = 0;
|
response = 0;
|
||||||
|
//Dbprintf("DEBUG: Waiting to receive frame");
|
||||||
|
uint32_t errorCount = 0;
|
||||||
|
|
||||||
// Receive frame, watch for at most T0*EOF periods
|
// Receive frame, watch for at most T0*EOF periods
|
||||||
while (AT91C_BASE_TC1->TC_CV < T0*HITAG_T_WAIT_MAX) {
|
while (AT91C_BASE_TC1->TC_CV < T0*HITAG_T_WAIT_MAX) {
|
||||||
|
@ -1375,10 +1424,13 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
rxlen++;
|
rxlen++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
//Dbprintf("DEBUG: Wierd2");
|
||||||
|
errorCount++;
|
||||||
// Ignore wierd value, is to small to mean anything
|
// Ignore wierd value, is to small to mean anything
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//if we saw over 100 wierd values break it probably isn't hitag...
|
||||||
|
if (errorCount >100) break;
|
||||||
// We can break this loop if we received the last bit from a frame
|
// We can break this loop if we received the last bit from a frame
|
||||||
if (AT91C_BASE_TC1->TC_CV > T0*HITAG_T_EOF) {
|
if (AT91C_BASE_TC1->TC_CV > T0*HITAG_T_EOF) {
|
||||||
if (rxlen>0) break;
|
if (rxlen>0) break;
|
||||||
|
@ -1390,7 +1442,7 @@ void ReaderHitag(hitag_function htf, hitag_data* htd) {
|
||||||
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
|
AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
|
||||||
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
|
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
Dbprintf("DONE: frame received: %d",frame_count);
|
// Dbprintf("DONE: frame received: %d",frame_count);
|
||||||
cmd_send(CMD_ACK,bSuccessful,0,0,(byte_t*)tag.sectors,48);
|
cmd_send(CMD_ACK,bSuccessful,0,0,(byte_t*)tag.sectors,48);
|
||||||
set_tracing(FALSE);
|
set_tracing(FALSE);
|
||||||
}
|
}
|
|
@ -1119,6 +1119,12 @@ int CmdLFfind(const char *Cmd) {
|
||||||
}
|
}
|
||||||
// TIdemod?
|
// TIdemod?
|
||||||
|
|
||||||
|
if (!offline && (cmdp != '1')){
|
||||||
|
ans=CmdLFHitagReader("26");
|
||||||
|
if (ans==0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PrintAndLog("\nNo Known Tags Found!\n");
|
PrintAndLog("\nNo Known Tags Found!\n");
|
||||||
if (testRaw=='u' || testRaw=='U'){
|
if (testRaw=='u' || testRaw=='U'){
|
||||||
|
|
|
@ -22,6 +22,7 @@ typedef enum {
|
||||||
RHT2F_AUTHENTICATE = 22,
|
RHT2F_AUTHENTICATE = 22,
|
||||||
RHT2F_CRYPTO = 23,
|
RHT2F_CRYPTO = 23,
|
||||||
RHT2F_TEST_AUTH_ATTEMPTS = 25,
|
RHT2F_TEST_AUTH_ATTEMPTS = 25,
|
||||||
|
RHT2F_UID_ONLY = 26
|
||||||
} hitag_function;
|
} hitag_function;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue