CHG: hf 14a read - started to add a Magic tag gen2 detection. SKipping it for now. Can't decide to put in on deviceside or in client.

FIX:  `lf read` - ophs..  it works again.
ADD: `lf em 4x05--`  - added a chipset definition
CHG: better kali fix - from @pwpivi
This commit is contained in:
iceman1001 2017-02-28 08:16:02 +01:00
parent 8db18d2f15
commit f24edfec54
5 changed files with 48 additions and 20 deletions

View file

@ -1360,24 +1360,48 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain){
void MifareCIdent(){
#define GEN_1A 1
#define GEN_1B 2
#define GEN_2 4
// variables
uint8_t isGen = 0;
uint8_t receivedAnswer[1] = {0x00};
uint8_t receivedAnswerPar[1] = {0x00};
uint8_t rec[1] = {0x00};
uint8_t recpar[1] = {0x00};
// Generation 1 test
ReaderTransmitBitsPar(wupC1, 7, NULL, NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
goto OUT;
}
isGen |= GEN_1B;
if(!ReaderReceive(rec, recpar) || (rec[0] != 0x0a)) {
goto TEST2;
};
isGen = GEN_1B;
ReaderTransmit(wupC2, sizeof(wupC2), NULL);
if(!ReaderReceive(receivedAnswer, receivedAnswerPar) || (receivedAnswer[0] != 0x0a)) {
if(!ReaderReceive(rec, recpar) || (rec[0] != 0x0a)) {
goto OUT;
}
};
isGen = GEN_1A;
goto OUT;
OUT:
TEST2:;
/*
// Generation 2 test
struct Crypto1State mpcs = {0, 0};
struct Crypto1State *pcs = &mpcs;
// halt previous.
mifare_classic_halt(NULL, 0);
//select
if (!iso14443a_select_card(NULL, NULL, NULL, true, 0)) {
goto OUT;
};
// MIFARE_CLASSIC_WRITEBLOCK 0xA0
// ACK 0x0a
uint16_t len = mifare_sendcmd_short(pcs, 1, 0xA0, 0, rec, recpar, NULL);
if ((len != 1) || (rec[0] != 0x0A)) {
isGen = GEN_2;
};
*/
OUT:;
// removed the if, since some magic tags misbehavies and send an answer to it.
mifare_classic_halt(NULL, 0);
cmd_send(CMD_ACK,isGen, 0, 0, 0, 0);

View file

@ -391,18 +391,21 @@ int CmdHF14AReader(const char *Cmd) {
// try to see if card responses to "chinese magic backdoor" commands.
uint8_t isGeneration = 0;
clearCommandBuffer();
c.cmd = CMD_MIFARE_CIDENT;
c.arg[0] = 0;
c.arg[1] = 0;
c.arg[2] = 0;
SendCommand(&c);
if (WaitForResponseTimeout(CMD_ACK, &resp, 1500)) {
if (WaitForResponseTimeout(CMD_ACK, &resp, 1500))
isGeneration = resp.arg[0] & 0xff;
switch( isGeneration ){
case 1: PrintAndLog("Answers to magic commands (GEN 1a): YES"); break;
case 2: PrintAndLog("Answers to magic commands (GEN 1b): YES"); break;
//case 4: PrintAndLog("Answers to magic commands (GEN 2): YES"); break;
default: PrintAndLog("Answers to magic commands: NO"); break;
}
if ( isGeneration )
PrintAndLog("Answers to magic commands (GEN %s): YES", ((isGeneration & 0x2 )==2)?"1B":"1A");
// disconnect
SendCommand(&cDisconnect);

View file

@ -567,15 +567,12 @@ int CmdLFRead(const char *Cmd) {
break;
default:
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
errors = 1;
errors = TRUE;
break;
}
if(errors) break;
}
// No args
if (cmdp == 0) errors = 1;
//Validations
if (errors) return usage_lf_read();

View file

@ -797,7 +797,7 @@ int EM4x05ReadWord_ext(uint8_t addr, uint32_t pwd, bool usePwd, uint32_t *word)
}
int testLen = (GraphTraceLen < 1000) ? GraphTraceLen : 1000;
if (graphJustNoise(GraphBuffer, testLen)) {
PrintAndLog("no tag not found");
PrintAndLog("no tag found");
return -1;
}
return demodEM4x05resp(word);
@ -981,6 +981,7 @@ void printEM4x05info(uint32_t block0, uint32_t serial) {
switch (chipType) {
case 9: PrintAndLog("\n Chip Type: %u | EM4305", chipType); break;
case 8: PrintAndLog("\n Chip Type: %u | EM4205", chipType); break;
case 4: PrintAndLog(" Chip Type: %u | Unknown", chipType); break;
case 2: PrintAndLog(" Chip Type: %u | EM4469", chipType); break;
//add more here when known

View file

@ -10,7 +10,10 @@
extern "C" {
#endif
#if defined(__linux__)
// make realpath() available:
#define _DEFAULT_SOURCE
#endif
#if !defined(WAI_MALLOC) || !defined(WAI_FREE) || !defined(WAI_REALLOC)
#include <stdlib.h>