mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 13:23:51 -07:00
Update cmdlfem4x05.c
Early bug fixs and extend to all commands.
This commit is contained in:
parent
a6beff18a5
commit
96a6b99a80
1 changed files with 68 additions and 36 deletions
|
@ -1660,23 +1660,50 @@ static size_t em4x05_Sniff_GetNextBitStart (size_t idx, size_t sc, int *data, si
|
||||||
uint32_t static em4x05_Sniff_GetBlock (char *bits, bool fwd) {
|
uint32_t static em4x05_Sniff_GetBlock (char *bits, bool fwd) {
|
||||||
uint32_t value = 0;
|
uint32_t value = 0;
|
||||||
uint8_t idx;
|
uint8_t idx;
|
||||||
|
bool parityerror = false;
|
||||||
|
uint8_t parity;
|
||||||
|
|
||||||
|
parity = 0;
|
||||||
for (idx = 0; idx < 8; idx++) {
|
for (idx = 0; idx < 8; idx++) {
|
||||||
value <<= 1;
|
value <<= 1;
|
||||||
value += (bits[idx] - '0');
|
value += (bits[idx] - '0');
|
||||||
|
parity += (bits[idx] - '0');
|
||||||
}
|
}
|
||||||
|
parity = parity % 2;
|
||||||
|
if (parity != (bits[8] - '0'))
|
||||||
|
parityerror = true;
|
||||||
|
|
||||||
|
parity = 0;
|
||||||
for (idx = 9; idx < 17; idx++) {
|
for (idx = 9; idx < 17; idx++) {
|
||||||
value <<= 1;
|
value <<= 1;
|
||||||
value += (bits[idx] - '0');
|
value += (bits[idx] - '0');
|
||||||
|
parity += (bits[idx] - '0');
|
||||||
}
|
}
|
||||||
|
parity = parity % 2;
|
||||||
|
if (parity != (bits[17] - '0'))
|
||||||
|
parityerror = true;
|
||||||
|
|
||||||
|
parity = 0;
|
||||||
for (idx = 18; idx < 26; idx++) {
|
for (idx = 18; idx < 26; idx++) {
|
||||||
value <<= 1;
|
value <<= 1;
|
||||||
value += (bits[idx] - '0');
|
value += (bits[idx] - '0');
|
||||||
|
parity += (bits[idx] - '0');
|
||||||
}
|
}
|
||||||
|
parity = parity % 2;
|
||||||
|
if (parity != (bits[26] - '0'))
|
||||||
|
parityerror = true;
|
||||||
|
|
||||||
|
parity = 0;
|
||||||
for (idx = 27; idx < 35; idx++) {
|
for (idx = 27; idx < 35; idx++) {
|
||||||
value <<= 1;
|
value <<= 1;
|
||||||
value += (bits[idx] - '0');
|
value += (bits[idx] - '0');
|
||||||
|
parity += (bits[idx] - '0');
|
||||||
}
|
}
|
||||||
|
parity = parity % 2;
|
||||||
|
if (parity != (bits[35] - '0'))
|
||||||
|
parityerror = true;
|
||||||
|
|
||||||
|
if (parityerror) printf ("parity error : ");
|
||||||
|
|
||||||
if (!fwd) {
|
if (!fwd) {
|
||||||
uint32_t t1 = value;
|
uint32_t t1 = value;
|
||||||
|
@ -1754,11 +1781,8 @@ int CmdEM4x05Sniff(const char *Cmd) {
|
||||||
idx = em4x05_Sniff_GetNextBitStart (idx, GraphTraceLen, GraphBuffer, &pulseSamples);
|
idx = em4x05_Sniff_GetNextBitStart (idx, GraphTraceLen, GraphBuffer, &pulseSamples);
|
||||||
ZeroWidth = idx - ZeroWidth;
|
ZeroWidth = idx - ZeroWidth;
|
||||||
|
|
||||||
// printf ("Zero width after 2 0 bits : %llu 0 Zero width %d\n",idx,ZeroWidth);
|
|
||||||
|
|
||||||
if (ZeroWidth <= 50) {
|
if (ZeroWidth <= 50) {
|
||||||
pktOffset -= ZeroWidth;
|
pktOffset -= ZeroWidth;
|
||||||
// ZeroSamples = 0;
|
|
||||||
memset(bits,0x00,sizeof(bits));
|
memset(bits,0x00,sizeof(bits));
|
||||||
bitidx = 0;
|
bitidx = 0;
|
||||||
|
|
||||||
|
@ -1771,7 +1795,7 @@ int CmdEM4x05Sniff(const char *Cmd) {
|
||||||
eop = true;
|
eop = true;
|
||||||
bits[bitidx++] = '0'; // Append last zero from the last bit find
|
bits[bitidx++] = '0'; // Append last zero from the last bit find
|
||||||
cmdText[0] = 0;
|
cmdText[0] = 0;
|
||||||
// Memo6->Lines->Add("Bit widths... : "+T1);
|
|
||||||
// EM4305 command lengths
|
// EM4305 command lengths
|
||||||
// Login 0011 <pwd> => 4 + 45 => 49
|
// Login 0011 <pwd> => 4 + 45 => 49
|
||||||
// Write Word 0101 <adr> <data> => 4 + 7 + 45 => 56
|
// Write Word 0101 <adr> <data> => 4 + 7 + 45 => 56
|
||||||
|
@ -1780,6 +1804,18 @@ int CmdEM4x05Sniff(const char *Cmd) {
|
||||||
// Disable 1010 <data> => 4 + 45 => 49
|
// Disable 1010 <data> => 4 + 45 => 49
|
||||||
// -> disaable 1010 11111111 0 11111111 0 11111111 0 11111111 0 00000000 0
|
// -> disaable 1010 11111111 0 11111111 0 11111111 0 11111111 0 00000000 0
|
||||||
|
|
||||||
|
// Check to see if we got the leading 0
|
||||||
|
if (((strncmp (bits,"00011",5) == 0)&& (bitidx == 50)) ||
|
||||||
|
((strncmp (bits,"00101",5) == 0)&& (bitidx == 57)) ||
|
||||||
|
((strncmp (bits,"01001",5) == 0)&& (bitidx == 12)) ||
|
||||||
|
((strncmp (bits,"01100",5) == 0)&& (bitidx == 50)) ||
|
||||||
|
((strncmp (bits,"01010",5) == 0)&& (bitidx == 50))) {
|
||||||
|
memcpy (bits,&bits[1],bitidx-1);
|
||||||
|
bitidx--;
|
||||||
|
printf ("Trim leading 0\n");
|
||||||
|
}
|
||||||
|
bits[bitidx] = 0;
|
||||||
|
// printf ("==> %s\n",bits);
|
||||||
// logon
|
// logon
|
||||||
if ((strncmp (bits,"0011",4) == 0) && (bitidx == 49)) {
|
if ((strncmp (bits,"0011",4) == 0) && (bitidx == 49)) {
|
||||||
haveData = true;
|
haveData = true;
|
||||||
|
@ -1794,7 +1830,6 @@ int CmdEM4x05Sniff(const char *Cmd) {
|
||||||
if ((strncmp (bits,"0101",4) == 0) && (bitidx == 56)) {
|
if ((strncmp (bits,"0101",4) == 0) && (bitidx == 56)) {
|
||||||
haveData = true;
|
haveData = true;
|
||||||
sprintf (cmdText,"Write");
|
sprintf (cmdText,"Write");
|
||||||
tmpValue = 0;
|
|
||||||
tmpValue = (bits[4] - '0') + ((bits[5] - '0') << 1) + ((bits[6] - '0') << 2) + ((bits[7] - '0') << 3);
|
tmpValue = (bits[4] - '0') + ((bits[5] - '0') << 1) + ((bits[6] - '0') << 2) + ((bits[7] - '0') << 3);
|
||||||
sprintf (blkAddr,"%d",tmpValue);
|
sprintf (blkAddr,"%d",tmpValue);
|
||||||
if (tmpValue == 2)
|
if (tmpValue == 2)
|
||||||
|
@ -1803,42 +1838,39 @@ int CmdEM4x05Sniff(const char *Cmd) {
|
||||||
sprintf (dataText,"%08X",tmpValue);
|
sprintf (dataText,"%08X",tmpValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
// write 2 test
|
// read
|
||||||
if ((strncmp (bits,"00101",5) == 0) && (bitidx == 57)) {
|
if ((strncmp (bits,"1001",4) == 0) && (bitidx == 11)) {
|
||||||
haveData = true;
|
haveData = true;
|
||||||
sprintf (cmdText,"Write");
|
pwd = false;
|
||||||
tmpValue = 0;
|
sprintf (cmdText,"Read");
|
||||||
tmpValue = (bits[5] - '0') + ((bits[6] - '0') << 1) + ((bits[7] - '0') << 2) + ((bits[8] - '0') << 3);
|
tmpValue = (bits[4] - '0') + ((bits[5] - '0') << 1) + ((bits[6] - '0') << 2) + ((bits[7] - '0') << 3);
|
||||||
sprintf (blkAddr,"%d",tmpValue);
|
sprintf (blkAddr,"%d",tmpValue);
|
||||||
if (tmpValue == 2)
|
sprintf (dataText," ");
|
||||||
pwd = true;
|
}
|
||||||
tmpValue = em4x05_Sniff_GetBlock (&bits[12], fwd);
|
|
||||||
|
// protect
|
||||||
|
if ((strncmp (bits,"1100",4) == 0) && (bitidx == 49)) {
|
||||||
|
haveData = true;
|
||||||
|
pwd = false;
|
||||||
|
sprintf (cmdText,"Protect");
|
||||||
|
sprintf (blkAddr," ");
|
||||||
|
tmpValue = em4x05_Sniff_GetBlock (&bits[11], fwd);
|
||||||
sprintf (dataText,"%08X",tmpValue);
|
sprintf (dataText,"%08X",tmpValue);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if ((Bits.SubString(1,4) == "1001") && (Bits.Length() == 11)) {
|
// disable
|
||||||
Addr = Bits.SubString(5,7);
|
if ((strncmp (bits,"1010",4) == 0) && (bitidx == 49)) {
|
||||||
Data = "";
|
haveData = true;
|
||||||
Memo6->Lines->Add("Read : "+Addr+" "+Data);
|
pwd = false;
|
||||||
|
sprintf (cmdText,"Disable");
|
||||||
|
sprintf (blkAddr," ");
|
||||||
|
tmpValue = em4x05_Sniff_GetBlock (&bits[11], fwd);
|
||||||
|
sprintf (dataText,"%08X",tmpValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Bits.SubString(1,4) == "1100") && (Bits.Length() == 49)) {
|
// bits[bitidx] = 0;
|
||||||
Addr = "";
|
|
||||||
Data = Bits.SubString(5,45);
|
|
||||||
Memo6->Lines->Add("Protect : "+Addr+" "+Data);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Bits.SubString(1,4) == "1010") && (Bits.Length() == 49)) {
|
|
||||||
Addr = "";
|
|
||||||
Data = Bits.SubString(5,45);
|
|
||||||
Memo6->Lines->Add("Disable : "+Addr+" "+Data);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// Memo6->Lines->Add("Raw : "+Bits);
|
|
||||||
bits[bitidx] = 0;
|
|
||||||
// printf ("%s\n",bits);
|
|
||||||
} else {
|
} else {
|
||||||
i = (CycleWidth - ZeroWidth) / 30;
|
i = (CycleWidth - ZeroWidth) / 28;
|
||||||
bits[bitidx++] = '0';
|
bits[bitidx++] = '0';
|
||||||
for (int ii = 0; ii < i; ii++)
|
for (int ii = 0; ii < i; ii++)
|
||||||
bits[bitidx++] = '1';
|
bits[bitidx++] = '1';
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue