mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-19 04:49:38 -07:00
add wake option to t55xx read command
This commit is contained in:
parent
21a615cb3b
commit
8e99ec25ed
5 changed files with 81 additions and 38 deletions
|
@ -5,6 +5,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
|
||||||
## [unreleased][unreleased]
|
## [unreleased][unreleased]
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- `lf t55xx read w` added wake with password then read following stream option to standard t55xx read commands (marshmellow)
|
||||||
- `hf iclass managekeys` to save, load and manage iclass keys. (adjusted most commands to accept a loaded key in memory) (marshmellow)
|
- `hf iclass managekeys` to save, load and manage iclass keys. (adjusted most commands to accept a loaded key in memory) (marshmellow)
|
||||||
- `hf iclass readblk` to select, authenticate, and read 1 block from an iclass card (marshmellow)
|
- `hf iclass readblk` to select, authenticate, and read 1 block from an iclass card (marshmellow)
|
||||||
- `hf iclass writeblk` to select, authenticate, and write 1 block to an iclass card (or picopass) (marshmellow + others)
|
- `hf iclass writeblk` to select, authenticate, and write 1 block to an iclass card (or picopass) (marshmellow + others)
|
||||||
|
|
|
@ -975,7 +975,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
|
||||||
CopyIndala224toT55x7(c->d.asDwords[0], c->d.asDwords[1], c->d.asDwords[2], c->d.asDwords[3], c->d.asDwords[4], c->d.asDwords[5], c->d.asDwords[6]);
|
CopyIndala224toT55x7(c->d.asDwords[0], c->d.asDwords[1], c->d.asDwords[2], c->d.asDwords[3], c->d.asDwords[4], c->d.asDwords[5], c->d.asDwords[6]);
|
||||||
break;
|
break;
|
||||||
case CMD_T55XX_READ_BLOCK:
|
case CMD_T55XX_READ_BLOCK:
|
||||||
T55xxReadBlock(c->arg[1], c->arg[2],c->d.asBytes[0]);
|
T55xxReadBlock(c->arg[0], c->arg[1], c->arg[2]);
|
||||||
break;
|
break;
|
||||||
case CMD_T55XX_WRITE_BLOCK:
|
case CMD_T55XX_WRITE_BLOCK:
|
||||||
T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
|
T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
|
||||||
|
|
|
@ -80,7 +80,7 @@ void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo);
|
||||||
void CopyIndala64toT55x7(int hi, int lo); // Clone Indala 64-bit tag by UID to T55x7
|
void CopyIndala64toT55x7(int hi, int lo); // Clone Indala 64-bit tag by UID to T55x7
|
||||||
void CopyIndala224toT55x7(int uid1, int uid2, int uid3, int uid4, int uid5, int uid6, int uid7); // Clone Indala 224-bit tag by UID to T55x7
|
void CopyIndala224toT55x7(int uid1, int uid2, int uid3, int uid4, int uid5, int uid6, int uid7); // Clone Indala 224-bit tag by UID to T55x7
|
||||||
void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMode);
|
void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMode);
|
||||||
void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode );
|
void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd);
|
||||||
void T55xxReadTrace(void);
|
void T55xxReadTrace(void);
|
||||||
void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
|
void EM4xReadWord(uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
|
||||||
void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
|
void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode);
|
||||||
|
|
|
@ -1202,9 +1202,10 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read one card block in page 0
|
// Read one card block in page 0
|
||||||
void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) {
|
void T55xxReadBlock(uint16_t arg0, uint8_t Block, uint32_t Pwd) {
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
|
uint8_t PwdMode = arg0 & 0xFF;
|
||||||
|
uint8_t wake = arg0 >> 8;
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
|
|
||||||
//clear buffer now so it does not interfere with timing later
|
//clear buffer now so it does not interfere with timing later
|
||||||
|
@ -1237,17 +1238,21 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) {
|
||||||
T55xxWriteBit(1);
|
T55xxWriteBit(1);
|
||||||
T55xxWriteBit(0); //Page 0
|
T55xxWriteBit(0); //Page 0
|
||||||
|
|
||||||
if (PwdMode == 1){
|
if (PwdMode || wake){
|
||||||
// Send Pwd
|
// Send Pwd
|
||||||
for (i = 0x80000000; i != 0; i >>= 1)
|
for (i = 0x80000000; i != 0; i >>= 1)
|
||||||
T55xxWriteBit(Pwd & i);
|
T55xxWriteBit(Pwd & i);
|
||||||
}
|
}
|
||||||
// Send a zero bit separation
|
|
||||||
T55xxWriteBit(0);
|
|
||||||
|
|
||||||
// Send Block number
|
// reading a block - send rest of read block cmd else skip for wake command
|
||||||
for (i = 0x04; i != 0; i >>= 1)
|
if (!wake) {
|
||||||
T55xxWriteBit(Block & i);
|
// Send a zero bit separation
|
||||||
|
T55xxWriteBit(0);
|
||||||
|
|
||||||
|
// Send Block number
|
||||||
|
for (i = 0x04; i != 0; i >>= 1)
|
||||||
|
T55xxWriteBit(Block & i);
|
||||||
|
}
|
||||||
|
|
||||||
// Turn field on to read the response
|
// Turn field on to read the response
|
||||||
TurnReadLFOn(READ_GAP);
|
TurnReadLFOn(READ_GAP);
|
||||||
|
|
|
@ -121,12 +121,12 @@ static int CmdHelp(const char *Cmd);
|
||||||
int CmdT55xxSetConfig(const char *Cmd) {
|
int CmdT55xxSetConfig(const char *Cmd) {
|
||||||
|
|
||||||
uint8_t offset = 0;
|
uint8_t offset = 0;
|
||||||
bool errors = FALSE;
|
|
||||||
uint8_t cmdp = 0;
|
|
||||||
char modulation[5] = {0x00};
|
char modulation[5] = {0x00};
|
||||||
char tmp = 0x00;
|
char tmp = 0x00;
|
||||||
uint8_t bitRate = 0;
|
uint8_t bitRate = 0;
|
||||||
uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};
|
uint8_t rates[9] = {8,16,32,40,50,64,100,128,0};
|
||||||
|
uint8_t cmdp = 0;
|
||||||
|
bool errors = FALSE;
|
||||||
while(param_getchar(Cmd, cmdp) != 0x00 && !errors)
|
while(param_getchar(Cmd, cmdp) != 0x00 && !errors)
|
||||||
{
|
{
|
||||||
tmp = param_getchar(Cmd, cmdp);
|
tmp = param_getchar(Cmd, cmdp);
|
||||||
|
@ -220,39 +220,72 @@ int CmdT55xxSetConfig(const char *Cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int CmdT55xxReadBlock(const char *Cmd) {
|
int CmdT55xxReadBlock(const char *Cmd) {
|
||||||
int block = -1;
|
uint8_t block = 255;
|
||||||
int password = 0xFFFFFFFF; //default to blank Block 7
|
uint8_t wake = 0;
|
||||||
int override = 0;
|
uint8_t usepwd = 0;
|
||||||
char cmdp = param_getchar(Cmd, 0);
|
uint32_t password = 0xFFFFFFFF; //default to blank Block 7
|
||||||
if (cmdp == 'h' || cmdp == 'H')
|
uint8_t override = 0;
|
||||||
return usage_t55xx_read();
|
uint8_t cmdp = 0;
|
||||||
|
bool errors = false;
|
||||||
int res = sscanf(Cmd, "%d %x %d", &block, &password, &override);
|
while(param_getchar(Cmd, cmdp) != 0x00 && !errors) {
|
||||||
|
switch(param_getchar(Cmd, cmdp)) {
|
||||||
if ( res < 1 || res > 3 )
|
case 'h':
|
||||||
return usage_t55xx_read();
|
case 'H':
|
||||||
|
return usage_t55xx_read();
|
||||||
if ((block < 0) || (block > 7)) {
|
case 'b':
|
||||||
|
case 'B':
|
||||||
|
errors |= param_getdec(Cmd, cmdp+1, &block);
|
||||||
|
cmdp+=2;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
case 'O':
|
||||||
|
override = 1;
|
||||||
|
cmdp++;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
case 'P':
|
||||||
|
password = param_get32ex(Cmd, cmdp+1, 0, 10);
|
||||||
|
usepwd = 1;
|
||||||
|
cmdp+=2;
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
case 'W':
|
||||||
|
wake = 1;
|
||||||
|
cmdp++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
|
||||||
|
errors = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (errors) return usage_t55xx_read();
|
||||||
|
if (wake && !usepwd) {
|
||||||
|
PrintAndLog("Wake command must use a pwd");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ((block > 7) && !wake) {
|
||||||
PrintAndLog("Block must be between 0 and 7");
|
PrintAndLog("Block must be between 0 and 7");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, 0}};
|
UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, password}};
|
||||||
c.d.asBytes[0] = 0x0;
|
|
||||||
|
|
||||||
//Password mode
|
//Password mode
|
||||||
if ( res > 1 ) {
|
if ( usepwd || wake ) {
|
||||||
// try reading the config block and verify that PWD bit is set before doing this!
|
// try reading the config block and verify that PWD bit is set before doing this!
|
||||||
AquireData( CONFIGURATION_BLOCK );
|
if ( wake || override ) {
|
||||||
if ( !tryDetectModulation() && !override) {
|
c.arg[0] = (wake<<8) & usepwd;
|
||||||
PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits.");
|
if ( !wake && override )
|
||||||
return 1;
|
PrintAndLog("Safety Check Overriden - proceeding despite risk");
|
||||||
} else if (override) {
|
|
||||||
PrintAndLog("Safety Check Overriden - proceeding despite risk");
|
|
||||||
c.arg[2] = password;
|
|
||||||
c.d.asBytes[0] = 0x1;
|
|
||||||
} else {
|
} else {
|
||||||
PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password...");
|
AquireData( CONFIGURATION_BLOCK );
|
||||||
|
if ( !tryDetectModulation() ) {
|
||||||
|
PrintAndLog("Safety Check: Could not detect if PWD bit is set in config block. Exits.");
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
PrintAndLog("Safety Check: PWD bit is NOT set in config block. Reading without password...");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,7 +303,11 @@ int CmdT55xxReadBlock(const char *Cmd) {
|
||||||
//DemodBufferLen=0;
|
//DemodBufferLen=0;
|
||||||
if (!DecodeT55xxBlock()) return 3;
|
if (!DecodeT55xxBlock()) return 3;
|
||||||
char blk[10]={0};
|
char blk[10]={0};
|
||||||
sprintf(blk,"%d", block);
|
if ( wake ) {
|
||||||
|
sprintf(blk,"wake");
|
||||||
|
} else {
|
||||||
|
sprintf(blk,"%d", block);
|
||||||
|
}
|
||||||
printT55xxBlock(blk);
|
printT55xxBlock(blk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue