From e49d31c0e798d14d8b0607b953f06dceecb4a42e Mon Sep 17 00:00:00 2001 From: pwpiwi Date: Wed, 25 Sep 2019 14:24:36 +0200 Subject: [PATCH] fix 'hf iclass sim': * ignore standard iso15693 INVENTORY commands silently * make iso15693 command decoder more strict (prevent decoding rubbish) * re-enable sim 3 --- armsrc/iclass.c | 3 +++ armsrc/iso15693.c | 16 ++++++---------- client/cmdhficlass.c | 7 +++---- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/armsrc/iclass.c b/armsrc/iclass.c index 23701540..2e3a4db8 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -1128,6 +1128,9 @@ int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf) { // Otherwise, we should answer 8bytes (block) + 2bytes CRC } + } else if (receivedCmd[0] == 0x26 && len == 5) { + // standard ISO15693 INVENTORY command. Ignore. + } else { // don't know how to handle this command char debug_message[250]; // should be enough diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index f33e0156..dbc1ca4c 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -827,6 +827,7 @@ static int inline __attribute__((always_inline)) Handle15693SampleFromReader(uin break; case STATE_READER_RECEIVE_DATA_1_OUT_OF_4: + bit = !!bit; DecodeReader->posCount++; if (DecodeReader->posCount == 1) { DecodeReader->sum1 = bit; @@ -839,17 +840,14 @@ static int inline __attribute__((always_inline)) Handle15693SampleFromReader(uin } if (DecodeReader->posCount == 8) { DecodeReader->posCount = 0; - int corr10 = DecodeReader->sum1 - DecodeReader->sum2; - int corr01 = DecodeReader->sum2 - DecodeReader->sum1; - int corr11 = (DecodeReader->sum1 + DecodeReader->sum2) / 2; - if (corr01 > corr11 && corr01 > corr10) { // EOF + if (DecodeReader->sum1 <= 1 && DecodeReader->sum2 >= 3) { // EOF LED_B_OFF(); // Finished receiving DecodeReaderReset(DecodeReader); if (DecodeReader->byteCount != 0) { return true; } } - if (corr10 > corr11) { // detected a 2bit position + if (DecodeReader->sum1 >= 3 && DecodeReader->sum2 <= 1) { // detected a 2bit position DecodeReader->shiftReg >>= 2; DecodeReader->shiftReg |= (DecodeReader->bitCount << 6); } @@ -869,6 +867,7 @@ static int inline __attribute__((always_inline)) Handle15693SampleFromReader(uin break; case STATE_READER_RECEIVE_DATA_1_OUT_OF_256: + bit = !!bit; DecodeReader->posCount++; if (DecodeReader->posCount == 1) { DecodeReader->sum1 = bit; @@ -881,17 +880,14 @@ static int inline __attribute__((always_inline)) Handle15693SampleFromReader(uin } if (DecodeReader->posCount == 8) { DecodeReader->posCount = 0; - int corr10 = DecodeReader->sum1 - DecodeReader->sum2; - int corr01 = DecodeReader->sum2 - DecodeReader->sum1; - int corr11 = (DecodeReader->sum1 + DecodeReader->sum2) / 2; - if (corr01 > corr11 && corr01 > corr10) { // EOF + if (DecodeReader->sum1 <= 1 && DecodeReader->sum2 >= 3) { // EOF LED_B_OFF(); // Finished receiving DecodeReaderReset(DecodeReader); if (DecodeReader->byteCount != 0) { return true; } } - if (corr10 > corr11) { // detected the bit position + if (DecodeReader->sum1 >= 3 && DecodeReader->sum2 <= 1) { // detected the bit position DecodeReader->shiftReg = DecodeReader->bitCount; } if (DecodeReader->bitCount == 255) { // we have a full byte diff --git a/client/cmdhficlass.c b/client/cmdhficlass.c index 48b62b17..6f7cc4a4 100644 --- a/client/cmdhficlass.c +++ b/client/cmdhficlass.c @@ -144,7 +144,7 @@ int CmdHFiClassSim(const char *Cmd) { uint8_t simType = 0; uint8_t CSN[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - if (strlen(Cmd)<1) { + if (strlen(Cmd) < 1) { return usage_hf_iclass_sim(); } simType = param_get8ex(Cmd, 0, 0, 10); @@ -157,7 +157,6 @@ int CmdHFiClassSim(const char *Cmd) { PrintAndLog("--simtype:%02x csn:%s", simType, sprint_hex(CSN, 8)); } - uint8_t numberOfCSNs = 0; if (simType == ICLASS_SIM_MODE_READER_ATTACK) { UsbCommand c = {CMD_SIMULATE_TAG_ICLASS, {simType, NUM_CSNS}}; UsbCommand resp = {0}; @@ -196,8 +195,8 @@ int CmdHFiClassSim(const char *Cmd) { saveFile("iclass_mac_attack", "bin", dump,datalen); free(dump); - } else if (simType == ICLASS_SIM_MODE_CSN || simType == ICLASS_SIM_MODE_CSN_DEFAULT) { - UsbCommand c = {CMD_SIMULATE_TAG_ICLASS, {simType, numberOfCSNs}}; + } else if (simType == ICLASS_SIM_MODE_CSN || simType == ICLASS_SIM_MODE_CSN_DEFAULT || simType == ICLASS_SIM_MODE_FULL) { + UsbCommand c = {CMD_SIMULATE_TAG_ICLASS, {simType, 0}}; memcpy(c.d.asBytes, CSN, 8); SendCommand(&c); -- 2.39.2