mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-14 02:26:59 -07:00
upgrading 'hf mfu' (#830)
* chg: write new dump file format by @mceloff * chg: rename 'hf mfu dump' option 'n' to 'f' to align with other commands and RRG repo * chg: replace ISO14443A_CMD_READBLOCK by MIFARE_CMD_READBLOCK, same for WRITEBLOCK * fix: mifare_ultra_readblock() returned 14 bytes instead of 16 * chg: param_gethex_ex() now checks maximum output buffer length * chg: ul_comp_write() was incomplete and for magic testing only * fix: 16bit ULC counter had been displayed as 32bit * chg: add check for 7 Byte UID, drop check for ATQA in type identification GetHF14AMfU_Type() * fix: send HALT instead of dropping field in order to maintain a defined state * chg: DropField() when command ends * chg: check for invalid page ranges in 'hf mfu dump' * fix: print correct lock bits when page range is used * fix: do not write (incomplete) dumpfile when page range is used * add: use UID for filename when no filename is given (RRG repo) * chg: don't clear trace on each ULC authentication, clear trace at beginning of each command * fix: don't send (DESFire?) deselect command after authentication
This commit is contained in:
parent
d38bb3acc3
commit
b8dd1ef649
11 changed files with 729 additions and 772 deletions
|
@ -415,8 +415,8 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
|
|||
case ISO14443A_CMD_REQA:
|
||||
snprintf(exp,size,"REQA");
|
||||
break;
|
||||
case ISO14443A_CMD_READBLOCK: snprintf(exp,size,"READBLOCK(%d)",cmd[1]); break;
|
||||
case ISO14443A_CMD_WRITEBLOCK: snprintf(exp,size,"WRITEBLOCK(%d)",cmd[1]); break;
|
||||
case MIFARE_CMD_READBLOCK: snprintf(exp,size,"READBLOCK(%d)",cmd[1]); break;
|
||||
case MIFARE_CMD_WRITEBLOCK: snprintf(exp,size,"WRITEBLOCK(%d)",cmd[1]); break;
|
||||
case ISO14443A_CMD_HALT:
|
||||
snprintf(exp,size,"HALT");
|
||||
MifareAuthState = masNone;
|
||||
|
|
|
@ -1516,8 +1516,11 @@ int CmdHF14AMfSim(const char *Cmd) {
|
|||
break;
|
||||
case 'u':
|
||||
case 'U':
|
||||
param_gethex_ex(Cmd, cmdp+1, uid, &uidlen);
|
||||
switch(uidlen) {
|
||||
uidlen = 14;
|
||||
if (param_gethex_ex(Cmd, cmdp+1, uid, &uidlen)) {
|
||||
return usage_hf14_mfsim();
|
||||
}
|
||||
switch (uidlen) {
|
||||
case 14: flags = FLAG_7B_UID_IN_DATA; break;
|
||||
case 8: flags = FLAG_4B_UID_IN_DATA; break;
|
||||
default: return usage_hf14_mfsim();
|
||||
|
@ -2726,9 +2729,9 @@ int CmdHF14AMfSniff(const char *Cmd){
|
|||
//needs nt, ar, at, Data to decrypt
|
||||
int CmdDecryptTraceCmds(const char *Cmd){
|
||||
uint8_t data[50];
|
||||
int len = 0;
|
||||
param_gethex_ex(Cmd,3,data,&len);
|
||||
return tryDecryptWord(param_get32ex(Cmd,0,0,16),param_get32ex(Cmd,1,0,16),param_get32ex(Cmd,2,0,16),data,len/2);
|
||||
int len = 100;
|
||||
param_gethex_ex(Cmd, 3, data, &len);
|
||||
return tryDecryptWord(param_get32ex(Cmd, 0, 0, 16), param_get32ex(Cmd, 1, 0, 16), param_get32ex(Cmd, 2, 0, 16), data, len/2);
|
||||
}
|
||||
|
||||
int CmdHF14AMfAuth4(const char *cmd) {
|
||||
|
|
1304
client/cmdhfmfu.c
1304
client/cmdhfmfu.c
File diff suppressed because it is too large
Load diff
|
@ -117,9 +117,8 @@ void AddLogCurrentDT(char *fileName) {
|
|||
AddLogLine(fileName, "\nanticollision: ", buff);
|
||||
}
|
||||
|
||||
void FillFileNameByUID(char *fileName, uint8_t * uid, char *ext, int byteCount) {
|
||||
void FillFileNameByUID(char *fileName, uint8_t *uid, char *ext, int byteCount) {
|
||||
char * fnameptr = fileName;
|
||||
memset(fileName, 0x00, 200);
|
||||
|
||||
for (int j = 0; j < byteCount; j++, fnameptr += 2)
|
||||
sprintf(fnameptr, "%02x", (unsigned int) uid[j]);
|
||||
|
@ -323,13 +322,12 @@ uint32_t SwapBits(uint32_t value, int nrbits) {
|
|||
uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){
|
||||
static uint8_t buf[64];
|
||||
memset(buf, 0x00, 64);
|
||||
uint8_t *tmp = buf;
|
||||
for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){
|
||||
for (size_t i = 0; i < blockSize; i++){
|
||||
tmp[i+(blockSize*block)] = src[(blockSize-1-i)+(blockSize*block)];
|
||||
buf[i+(blockSize*block)] = src[(blockSize-1-i)+(blockSize*block)];
|
||||
}
|
||||
}
|
||||
return tmp;
|
||||
return buf;
|
||||
}
|
||||
|
||||
//assumes little endian
|
||||
|
@ -338,7 +336,7 @@ char *printBits(size_t const size, void const * const ptr)
|
|||
unsigned char *b = (unsigned char*) ptr;
|
||||
unsigned char byte;
|
||||
static char buf[1024];
|
||||
char * tmp = buf;
|
||||
char *tmp = buf;
|
||||
int i, j;
|
||||
|
||||
for (i=size-1;i>=0;i--)
|
||||
|
@ -354,7 +352,7 @@ char *printBits(size_t const size, void const * const ptr)
|
|||
return buf;
|
||||
}
|
||||
|
||||
char * printBitsPar(const uint8_t *b, size_t len) {
|
||||
char *printBitsPar(const uint8_t *b, size_t len) {
|
||||
static char buf1[512] = {0};
|
||||
static char buf2[512] = {0};
|
||||
static char *buf;
|
||||
|
@ -519,7 +517,8 @@ int param_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt)
|
|||
|
||||
return 0;
|
||||
}
|
||||
int param_gethex_ex(const char *line, int paramnum, uint8_t * data, int *hexcnt)
|
||||
|
||||
int param_gethex_ex(const char *line, int paramnum, uint8_t *data, int *hexcnt)
|
||||
{
|
||||
int bg, en, temp, i;
|
||||
|
||||
|
@ -528,6 +527,8 @@ int param_gethex_ex(const char *line, int paramnum, uint8_t * data, int *hexcnt)
|
|||
|
||||
if (param_getptr(line, &bg, &en, paramnum)) return 1;
|
||||
|
||||
if (en - bg + 1 > *hexcnt) return 1;
|
||||
|
||||
*hexcnt = en - bg + 1;
|
||||
if (*hexcnt % 2) //error if not complete hex bytes
|
||||
return 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue