mirror of
https://github.com/wh201906/Proxmark3GUI.git
synced 2025-02-16 22:21:30 +08:00
Unify all read and write functions
This commit is contained in:
parent
6af85bffc0
commit
bf8136a7fe
@ -269,7 +269,7 @@ void Mifare::list()
|
|||||||
ui->funcTab->setCurrentIndex(1);
|
ui->funcTab->setCurrentIndex(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, TargetType targetType, int waitTime)
|
QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, TargetType targetType, int waitTime)
|
||||||
{
|
{
|
||||||
QString data;
|
QString data;
|
||||||
QString result;
|
QString result;
|
||||||
@ -322,7 +322,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targ
|
|||||||
"hf mf cgetblk "
|
"hf mf cgetblk "
|
||||||
+ QString::number(blockId),
|
+ QString::number(blockId),
|
||||||
waitTime);
|
waitTime);
|
||||||
if(result.indexOf("No chinese") == -1)
|
if(result.indexOf("Chinese magic") != -1)
|
||||||
{
|
{
|
||||||
data = dataPattern->match(result).captured().toUpper();
|
data = dataPattern->match(result).captured().toUpper();
|
||||||
data.remove(" ");
|
data.remove(" ");
|
||||||
@ -335,7 +335,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targ
|
|||||||
result = util->execCMDWithOutput(
|
result = util->execCMDWithOutput(
|
||||||
"hf mf eget "
|
"hf mf eget "
|
||||||
+ QString::number(blockId),
|
+ QString::number(blockId),
|
||||||
waitTime);
|
150);
|
||||||
data = dataPattern->match(result).captured().toUpper();
|
data = dataPattern->match(result).captured().toUpper();
|
||||||
data.remove(" ");
|
data.remove(" ");
|
||||||
}
|
}
|
||||||
@ -343,34 +343,45 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targ
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key, int waitTime)
|
QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key, TargetType targetType, int waitTime)
|
||||||
{
|
{
|
||||||
QStringList data;
|
QStringList data;
|
||||||
QString result, tmp;
|
QString result, tmp;
|
||||||
QRegularExpressionMatch reMatch;
|
QRegularExpressionMatch reMatch;
|
||||||
int offset = 0;
|
int offset = -1;
|
||||||
|
|
||||||
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
||||||
{
|
{
|
||||||
data.append("");
|
data.append("");
|
||||||
}
|
}
|
||||||
if(!data_isKeyValid(key))
|
|
||||||
{
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN)
|
if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN)
|
||||||
{
|
{
|
||||||
// try to read all blocks together
|
// try to read all blocks together
|
||||||
result = util->execCMDWithOutput(
|
if(targetType == TARGET_MIFARE)
|
||||||
"hf mf rdsc "
|
{
|
||||||
+ QString::number(sectorId)
|
if(!data_isKeyValid(key))
|
||||||
+ " "
|
{
|
||||||
+ (char)keyType
|
return data;
|
||||||
+ " "
|
}
|
||||||
+ key,
|
result = util->execCMDWithOutput(
|
||||||
waitTime);
|
"hf mf rdsc "
|
||||||
offset = result.indexOf("isOk:01");
|
+ QString::number(sectorId)
|
||||||
|
+ " "
|
||||||
|
+ (char)keyType
|
||||||
|
+ " "
|
||||||
|
+ key,
|
||||||
|
waitTime);
|
||||||
|
offset = result.indexOf("isOk:01");
|
||||||
|
}
|
||||||
|
else if(targetType == TARGET_UID)
|
||||||
|
{
|
||||||
|
result = util->execCMDWithOutput(
|
||||||
|
"hf mf cgetsc "
|
||||||
|
+ QString::number(sectorId),
|
||||||
|
waitTime);
|
||||||
|
offset = result.indexOf("Chinese magic");
|
||||||
|
}
|
||||||
if(offset != -1)
|
if(offset != -1)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
||||||
@ -388,17 +399,15 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key,
|
|||||||
}
|
}
|
||||||
// if failed, try to read them seperately.
|
// if failed, try to read them seperately.
|
||||||
// (when one of the block cannot be read, the rdsc will return nothing, so you need to read the rest of blocks manually)
|
// (when one of the block cannot be read, the rdsc will return nothing, so you need to read the rest of blocks manually)
|
||||||
else
|
else if(targetType != TARGET_UID) // if the targetType is Chinese Magic Card, then the result implies the backdoor command is invalid.
|
||||||
{
|
{
|
||||||
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
||||||
{
|
data[i] = _readblk(cardType.blks[sectorId] + i, keyType, key, targetType, waitTime);
|
||||||
data[i] = _readblk(cardType.blks[sectorId] + i, keyType, key, TARGET_MIFARE, waitTime);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//process trailer(like _readblk())
|
//process trailer(like _readblk())
|
||||||
QString trailer = data[cardType.blk[sectorId] - 1];
|
QString trailer = data[cardType.blk[sectorId] - 1];
|
||||||
if(trailer != "")
|
if(trailer != "" && targetType == TARGET_MIFARE)
|
||||||
{
|
{
|
||||||
if(keyType == KEY_A) // in this case, the Access Bits is always accessible
|
if(keyType == KEY_A) // in this case, the Access Bits is always accessible
|
||||||
{
|
{
|
||||||
@ -435,11 +444,17 @@ void Mifare::readOne(TargetType targetType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::readSelected(const QList<int>& selectedBlocks)
|
void Mifare::readSelected(TargetType targetType)
|
||||||
{
|
{
|
||||||
QStringList data, dataA, dataB;
|
QStringList data, dataA, dataB;
|
||||||
QString trailerA, trailerB;
|
QString trailerA, trailerB;
|
||||||
QList<bool> selectedSectors;
|
QList<bool> selectedSectors;
|
||||||
|
QList<int> selectedBlocks;
|
||||||
|
for(int i = 0; i < cardType.block_size; i++)
|
||||||
|
{
|
||||||
|
if(ui->MF_dataWidget->item(i, 1)->checkState() == Qt::Checked)
|
||||||
|
selectedBlocks.append(i);
|
||||||
|
}
|
||||||
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
for(int i = 0; i < cardType.sector_size; i++)
|
||||||
{
|
{
|
||||||
@ -452,64 +467,68 @@ void Mifare::readSelected(const QList<int>& selectedBlocks)
|
|||||||
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
for(int i = 0; i < cardType.sector_size; i++)
|
||||||
{
|
{
|
||||||
if(!selectedSectors[i])
|
|
||||||
{
|
{
|
||||||
continue;
|
if(!selectedSectors[i])
|
||||||
}
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
|
||||||
// dataA is always filled with "" because of the _readsec()
|
|
||||||
data.append("");
|
|
||||||
dataB.append("");
|
|
||||||
}
|
|
||||||
|
|
||||||
dataA = _readsec(i, Mifare::KEY_A, keyAList->at(i));
|
|
||||||
if(dataA.contains("") || dataA[cardType.blk[i] - 1].right(12) == "????????????")
|
|
||||||
dataB = _readsec(i, Mifare::KEY_B, keyBList->at(i));
|
|
||||||
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
|
||||||
if(dataA[j] != "")
|
|
||||||
data[j] = dataA[j];
|
|
||||||
else
|
|
||||||
data[j] = dataB[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
// process trailer block seperately
|
|
||||||
trailerA = dataA[cardType.blk[i] - 1];
|
|
||||||
trailerB = dataB[cardType.blk[i] - 1];
|
|
||||||
if(trailerA != "" && trailerB != "")
|
|
||||||
{
|
|
||||||
QString ACbits = trailerA.mid(12, 8);
|
|
||||||
QString key_A = trailerA.left(12);
|
|
||||||
QString key_B = trailerA.at(31) != '?' ? trailerA.right(12) : trailerB.right(12);
|
|
||||||
data[cardType.blk[i] - 1] = key_A + ACbits + key_B;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
|
||||||
if(selectedBlocks.contains(cardType.blks[i] + j))
|
|
||||||
{
|
{
|
||||||
dataList->replace(cardType.blks[i] + j, data[j]);
|
continue;
|
||||||
data_syncWithDataWidget(false, cardType.blks[i] + j);
|
|
||||||
}
|
}
|
||||||
|
for(int j = 0; j < cardType.blk[i]; j++)
|
||||||
|
{
|
||||||
|
// dataA is always filled with "" because of the _readsec()
|
||||||
|
data.append("");
|
||||||
|
dataB.append("");
|
||||||
|
}
|
||||||
|
|
||||||
|
dataA = _readsec(i, Mifare::KEY_A, keyAList->at(i), targetType);
|
||||||
|
|
||||||
|
// in other situations, the key doesn't matters
|
||||||
|
if(targetType == TARGET_MIFARE && (dataA.contains("") || dataA[cardType.blk[i] - 1].right(12) == "????????????"))
|
||||||
|
dataB = _readsec(i, Mifare::KEY_B, keyBList->at(i), targetType);
|
||||||
|
|
||||||
|
for(int j = 0; j < cardType.blk[i]; j++)
|
||||||
|
{
|
||||||
|
if(dataA[j] != "")
|
||||||
|
data[j] = dataA[j];
|
||||||
|
else
|
||||||
|
data[j] = dataB[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
// process trailer block seperately
|
||||||
|
trailerA = dataA[cardType.blk[i] - 1];
|
||||||
|
trailerB = dataB[cardType.blk[i] - 1];
|
||||||
|
if(trailerA != "" && trailerB != "")
|
||||||
|
{
|
||||||
|
QString ACbits = trailerA.mid(12, 8);
|
||||||
|
QString key_A = trailerA.left(12);
|
||||||
|
QString key_B = trailerA.at(31) != '?' ? trailerA.right(12) : trailerB.right(12);
|
||||||
|
data[cardType.blk[i] - 1] = key_A + ACbits + key_B;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int j = 0; j < cardType.blk[i]; j++)
|
||||||
|
{
|
||||||
|
if(selectedBlocks.contains(cardType.blks[i] + j))
|
||||||
|
{
|
||||||
|
dataList->replace(cardType.blks[i] + j, data[j]);
|
||||||
|
data_syncWithDataWidget(false, cardType.blks[i] + j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(selectedBlocks.contains(cardType.blks[i] + cardType.blk[i] - 1))
|
||||||
|
{
|
||||||
|
// data widget has been updated, so this is just a temporary varient.
|
||||||
|
if(data[cardType.blk[i] - 1] == "")
|
||||||
|
data[cardType.blk[i] - 1] = "????????????????????????????????";
|
||||||
|
|
||||||
|
// doesn't replace the existing key.
|
||||||
|
if(!data_isKeyValid(keyAList->at(i)))
|
||||||
|
keyAList->replace(i, data[cardType.blk[i] - 1].left(12));
|
||||||
|
if(!data_isKeyValid(keyBList->at(i)))
|
||||||
|
keyBList->replace(i, data[cardType.blk[i] - 1].right(12));
|
||||||
|
data_syncWithKeyWidget(false, i, KEY_A);
|
||||||
|
data_syncWithKeyWidget(false, i, KEY_B);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(selectedBlocks.contains(cardType.blks[i] + cardType.blk[i] - 1))
|
|
||||||
{
|
|
||||||
// data widget has been updated, so this is just a temporary varient.
|
|
||||||
if(data[cardType.blk[i] - 1] == "")
|
|
||||||
data[cardType.blk[i] - 1] = "????????????????????????????????";
|
|
||||||
|
|
||||||
// doesn't replace the existing key.
|
|
||||||
if(!data_isKeyValid(keyAList->at(i)))
|
|
||||||
keyAList->replace(i, data[cardType.blk[i] - 1].left(12));
|
|
||||||
if(!data_isKeyValid(keyBList->at(i)))
|
|
||||||
keyBList->replace(i, data[cardType.blk[i] - 1].right(12));
|
|
||||||
data_syncWithKeyWidget(false, i, KEY_A);
|
|
||||||
data_syncWithKeyWidget(false, i, KEY_B);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -548,16 +567,16 @@ bool Mifare::_writeblk(int blockId, KeyType keyType, const QString& key, const Q
|
|||||||
+ " "
|
+ " "
|
||||||
+ input,
|
+ input,
|
||||||
waitTime);
|
waitTime);
|
||||||
return (result.indexOf("No chinese") == -1);
|
return (result.indexOf("Chinese magic") != -1);
|
||||||
}
|
}
|
||||||
else if(targetType == TARGET_EMULATOR)
|
else if(targetType == TARGET_EMULATOR)
|
||||||
{
|
{
|
||||||
result = util->execCMDWithOutput(
|
util->execCMD(
|
||||||
"hf mf eset "
|
"hf mf eset "
|
||||||
+ QString::number(blockId)
|
+ QString::number(blockId)
|
||||||
+ " "
|
+ " "
|
||||||
+ input,
|
+ input);
|
||||||
waitTime);
|
util->delay(5);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -578,78 +597,40 @@ void Mifare::writeOne(TargetType targetType)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::writeSelected(const QList<int>& selectedBlocks)
|
QList<int> Mifare::writeSelected(TargetType targetType)
|
||||||
{
|
{
|
||||||
|
QList<int> failedBlocks;
|
||||||
|
QList<int> selectedBlocks;
|
||||||
|
for(int i = 0; i < cardType.block_size; i++)
|
||||||
|
{
|
||||||
|
if(ui->MF_dataWidget->item(i, 1)->checkState() == Qt::Checked)
|
||||||
|
selectedBlocks.append(i);
|
||||||
|
}
|
||||||
for(int item : selectedBlocks)
|
for(int item : selectedBlocks)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
result = _writeblk(item, KEY_A, keyAList->at(data_b2s(item)), dataList->at(item));
|
if(targetType == TARGET_MIFARE)
|
||||||
if(!result)
|
|
||||||
{
|
{
|
||||||
result = _writeblk(item, KEY_B, keyBList->at(data_b2s(item)), dataList->at(item));
|
result = _writeblk(item, KEY_A, keyAList->at(data_b2s(item)), dataList->at(item), TARGET_MIFARE);
|
||||||
}
|
if(!result)
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
result = _writeblk(item, KEY_A, "FFFFFFFFFFFF", dataList->at(item));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mifare::readAllC()
|
|
||||||
{
|
|
||||||
QString result;
|
|
||||||
const int waitTime = 150;
|
|
||||||
|
|
||||||
QString tmp;
|
|
||||||
int offset = 0;
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
|
||||||
{
|
|
||||||
result = util->execCMDWithOutput(
|
|
||||||
"hf mf cgetsc "
|
|
||||||
+ QString::number(i),
|
|
||||||
waitTime);
|
|
||||||
qDebug() << result;
|
|
||||||
if(result.indexOf("No chinese") == -1)
|
|
||||||
{
|
|
||||||
offset = 0;
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
{
|
||||||
// offset = dataPattern->indexIn(result, offset);
|
result = _writeblk(item, KEY_B, keyBList->at(data_b2s(item)), dataList->at(item), TARGET_MIFARE);
|
||||||
// offset = result.indexOf(*dataPattern, offset);
|
}
|
||||||
tmp = result.mid(offset, 47).toUpper();
|
if(!result)
|
||||||
offset += 47;
|
{
|
||||||
qDebug() << tmp;
|
result = _writeblk(item, KEY_A, "FFFFFFFFFFFF", dataList->at(item), TARGET_MIFARE);
|
||||||
tmp.replace(" ", "");
|
|
||||||
dataList->replace(cardType.blks[i] + j, tmp);
|
|
||||||
data_syncWithDataWidget(false, cardType.blks[i] + j);
|
|
||||||
}
|
}
|
||||||
keyAList->replace(i, dataList->at(cardType.blks[i] + cardType.blk[i] - 1).left(12));
|
|
||||||
keyBList->replace(i, dataList->at(cardType.blks[i] + cardType.blk[i] - 1).right(12));
|
|
||||||
data_syncWithKeyWidget(false, i, KEY_A);
|
|
||||||
data_syncWithKeyWidget(false, i, KEY_B);
|
|
||||||
}
|
}
|
||||||
}
|
else // key doesn't matter when writing to Chinese Magic Card and Emulator Memory
|
||||||
}
|
|
||||||
|
|
||||||
void Mifare::writeAllC()
|
|
||||||
{
|
|
||||||
const int waitTime = 150;
|
|
||||||
QString result;
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
|
||||||
{
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
{
|
||||||
result = "";
|
result = _writeblk(item, KEY_A, "FFFFFFFFFFFF", dataList->at(item), targetType);
|
||||||
if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?'))
|
}
|
||||||
continue;
|
if(!result)
|
||||||
result = util->execCMDWithOutput(
|
{
|
||||||
"hf mf csetblk "
|
failedBlocks.append(item);
|
||||||
+ QString::number(cardType.blks[i] + j)
|
|
||||||
+ " "
|
|
||||||
+ dataList->at(cardType.blks[i] + j),
|
|
||||||
waitTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return failedBlocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::dump()
|
void Mifare::dump()
|
||||||
@ -701,69 +682,6 @@ void Mifare::lockC()
|
|||||||
util->execCMD("hf 14a raw 52");
|
util->execCMD("hf 14a raw 52");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::writeAllE()
|
|
||||||
{
|
|
||||||
const int waitTime = 200;
|
|
||||||
QString result;
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
|
||||||
{
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
|
||||||
result = "";
|
|
||||||
if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?'))
|
|
||||||
continue;
|
|
||||||
result = util->execCMDWithOutput(
|
|
||||||
"hf mf eset "
|
|
||||||
+ QString::number(cardType.blks[i] + j)
|
|
||||||
+ " "
|
|
||||||
+ dataList->at(cardType.blks[i] + j),
|
|
||||||
waitTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
util->execCMDWithOutput("hf mf eget", waitTime); // to refresh output buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mifare::readAllE()
|
|
||||||
{
|
|
||||||
QString result;
|
|
||||||
const int waitTime = 200;
|
|
||||||
|
|
||||||
QString tmp;
|
|
||||||
int offset = 0;
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
|
||||||
{
|
|
||||||
offset = 0;
|
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
|
||||||
{
|
|
||||||
|
|
||||||
qDebug() << "**********" ;
|
|
||||||
result = util->execCMDWithOutput(
|
|
||||||
"hf mf eget "
|
|
||||||
+ QString::number(cardType.blks[i] + j),
|
|
||||||
waitTime);
|
|
||||||
qDebug() << result ;
|
|
||||||
|
|
||||||
// offset = dataPattern->indexIn(result);
|
|
||||||
// offset = result.indexOf(*dataPattern, offset); // When I find the data position in this way, the Regex might fail to match.
|
|
||||||
|
|
||||||
tmp = result.mid(offset, 47).toUpper();
|
|
||||||
qDebug() << tmp << offset;
|
|
||||||
qDebug() << "**********" ;
|
|
||||||
|
|
||||||
if(offset == -1)
|
|
||||||
continue;
|
|
||||||
tmp.replace(" ", "");
|
|
||||||
dataList->replace(cardType.blks[i] + j, tmp);
|
|
||||||
data_syncWithDataWidget(false, cardType.blks[i] + j);
|
|
||||||
}
|
|
||||||
keyAList->replace(i, dataList->at(cardType.blks[i] + cardType.blk[i] - 1).left(12));
|
|
||||||
keyBList->replace(i, dataList->at(cardType.blks[i] + cardType.blk[i] - 1).right(12));
|
|
||||||
data_syncWithKeyWidget(false, i, KEY_A);
|
|
||||||
data_syncWithKeyWidget(false, i, KEY_B);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mifare::wipeE()
|
void Mifare::wipeE()
|
||||||
{
|
{
|
||||||
util->execCMD("hf mf eclr");
|
util->execCMD("hf mf eclr");
|
||||||
|
@ -71,9 +71,9 @@ public:
|
|||||||
void snoop();
|
void snoop();
|
||||||
void list();
|
void list();
|
||||||
void readOne(TargetType targetType = TARGET_MIFARE);
|
void readOne(TargetType targetType = TARGET_MIFARE);
|
||||||
void readSelected(const QList<int>& selectedBlocks);
|
void readSelected(TargetType targetType = TARGET_MIFARE);
|
||||||
void writeOne(TargetType targetType = TARGET_MIFARE);
|
void writeOne(TargetType targetType = TARGET_MIFARE);
|
||||||
void writeSelected(const QList<int>& selectedBlocks);
|
QList<int> writeSelected(TargetType targetType = TARGET_MIFARE);
|
||||||
void dump();
|
void dump();
|
||||||
void restore();
|
void restore();
|
||||||
|
|
||||||
@ -87,8 +87,6 @@ public:
|
|||||||
CardType cardType;
|
CardType cardType;
|
||||||
Mifare::CardType getCardType();
|
Mifare::CardType getCardType();
|
||||||
void setCardType(int type);
|
void setCardType(int type);
|
||||||
void writeAllC();
|
|
||||||
void readAllC();
|
|
||||||
void wipeC();
|
void wipeC();
|
||||||
void setParameterC();
|
void setParameterC();
|
||||||
|
|
||||||
@ -102,8 +100,6 @@ public:
|
|||||||
void data_setData(int block, const QString& data);
|
void data_setData(int block, const QString& data);
|
||||||
void data_setKey(int sector, KeyType keyType, const QString& key);
|
void data_setKey(int sector, KeyType keyType, const QString& key);
|
||||||
void lockC();
|
void lockC();
|
||||||
void writeAllE();
|
|
||||||
void readAllE();
|
|
||||||
void wipeE();
|
void wipeE();
|
||||||
void simulate();
|
void simulate();
|
||||||
void loadSniff(const QString& file);
|
void loadSniff(const QString& file);
|
||||||
@ -129,7 +125,7 @@ private:
|
|||||||
QString bin2text(const QByteArray& buff, int start, int length);
|
QString bin2text(const QByteArray& buff, int start, int length);
|
||||||
|
|
||||||
QString _readblk(int blockId, KeyType keyType, const QString &key, TargetType targetType = TARGET_MIFARE, int waitTime = 300);
|
QString _readblk(int blockId, KeyType keyType, const QString &key, TargetType targetType = TARGET_MIFARE, int waitTime = 300);
|
||||||
QStringList _readsec(int sectorId, KeyType keyType, const QString &key, int waitTime = 300);
|
QStringList _readsec(int sectorId, KeyType keyType, const QString &key, TargetType targetType = TARGET_MIFARE, int waitTime = 300);
|
||||||
bool _writeblk(int blockId, KeyType keyType, const QString &key, const QString &data, TargetType targetType = TARGET_MIFARE, int waitTime = 300);
|
bool _writeblk(int blockId, KeyType keyType, const QString &key, const QString &data, TargetType targetType = TARGET_MIFARE, int waitTime = 300);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,8 +17,6 @@ MainWindow::MainWindow(QWidget *parent):
|
|||||||
|
|
||||||
pm3Thread = new QThread(this);
|
pm3Thread = new QThread(this);
|
||||||
pm3 = new PM3Process(pm3Thread);
|
pm3 = new PM3Process(pm3Thread);
|
||||||
// pm3->moveToThread(pm3Thread);
|
|
||||||
// pm3->init();
|
|
||||||
pm3Thread->start();
|
pm3Thread->start();
|
||||||
pm3state = false;
|
pm3state = false;
|
||||||
|
|
||||||
@ -491,13 +489,7 @@ void MainWindow::on_MF_Attack_hardnestedButton_clicked()
|
|||||||
void MainWindow::on_MF_RW_readSelectedButton_clicked()
|
void MainWindow::on_MF_RW_readSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
setState(false);
|
setState(false);
|
||||||
QList<int> selectedBlocks;
|
mifare->readSelected(Mifare::TARGET_MIFARE);
|
||||||
for(int i = 0; i < mifare->cardType.block_size; i++)
|
|
||||||
{
|
|
||||||
if(ui->MF_dataWidget->item(i, 1)->checkState() == Qt::Checked)
|
|
||||||
selectedBlocks.append(i);
|
|
||||||
}
|
|
||||||
mifare->readSelected(selectedBlocks);
|
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,14 +509,9 @@ void MainWindow::on_MF_RW_writeBlockButton_clicked()
|
|||||||
|
|
||||||
void MainWindow::on_MF_RW_writeSelectedButton_clicked()
|
void MainWindow::on_MF_RW_writeSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
|
QList<int> failedBlocks;
|
||||||
setState(false);
|
setState(false);
|
||||||
QList<int> selectedBlocks;
|
failedBlocks = mifare->writeSelected(Mifare::TARGET_MIFARE);
|
||||||
for(int i = 0; i < mifare->cardType.block_size; i++)
|
|
||||||
{
|
|
||||||
if(ui->MF_dataWidget->item(i, 1)->checkState() == Qt::Checked)
|
|
||||||
selectedBlocks.append(i);
|
|
||||||
}
|
|
||||||
mifare->writeSelected(selectedBlocks);
|
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,10 +525,10 @@ void MainWindow::on_MF_RW_restoreButton_clicked()
|
|||||||
mifare->restore();
|
mifare->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_UID_readAllButton_clicked()
|
void MainWindow::on_MF_UID_readSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->readAllC();
|
mifare->readSelected(Mifare::TARGET_UID);
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,10 +539,11 @@ void MainWindow::on_MF_UID_readBlockButton_clicked()
|
|||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_UID_writeAllButton_clicked()
|
void MainWindow::on_MF_UID_writeSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
|
QList<int> failedBlocks;
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->writeAllC();
|
failedBlocks = mifare->writeSelected(Mifare::TARGET_UID);
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,17 +592,18 @@ void MainWindow::on_MF_UID_lockButton_clicked()
|
|||||||
mifare->lockC();
|
mifare->lockC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Sim_loadDataButton_clicked()
|
void MainWindow::on_MF_Sim_readSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->writeAllE();
|
mifare->readSelected(Mifare::TARGET_EMULATOR);
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Sim_writeAllButton_clicked()
|
void MainWindow::on_MF_Sim_writeSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
|
QList<int> failedBlocks;
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->readAllE();
|
failedBlocks = mifare->writeSelected(Mifare::TARGET_EMULATOR);
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,11 +92,11 @@ private slots:
|
|||||||
|
|
||||||
void on_MF_RW_restoreButton_clicked();
|
void on_MF_RW_restoreButton_clicked();
|
||||||
|
|
||||||
void on_MF_UID_readAllButton_clicked();
|
void on_MF_UID_readSelectedButton_clicked();
|
||||||
|
|
||||||
void on_MF_UID_readBlockButton_clicked();
|
void on_MF_UID_readBlockButton_clicked();
|
||||||
|
|
||||||
void on_MF_UID_writeAllButton_clicked();
|
void on_MF_UID_writeSelectedButton_clicked();
|
||||||
|
|
||||||
void on_MF_UID_writeBlockButton_clicked();
|
void on_MF_UID_writeBlockButton_clicked();
|
||||||
|
|
||||||
@ -124,9 +124,9 @@ private slots:
|
|||||||
|
|
||||||
void on_MF_UID_lockButton_clicked();
|
void on_MF_UID_lockButton_clicked();
|
||||||
|
|
||||||
void on_MF_Sim_loadDataButton_clicked();
|
void on_MF_Sim_readSelectedButton_clicked();
|
||||||
|
|
||||||
void on_MF_Sim_writeAllButton_clicked();
|
void on_MF_Sim_writeSelectedButton_clicked();
|
||||||
|
|
||||||
void on_MF_Sim_clearButton_clicked();
|
void on_MF_Sim_clearButton_clicked();
|
||||||
|
|
||||||
|
207
ui/mainwindow.ui
207
ui/mainwindow.ui
@ -72,6 +72,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="PM3_refreshPortButton">
|
<widget class="QPushButton" name="PM3_refreshPortButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Refresh</string>
|
<string>Refresh</string>
|
||||||
</property>
|
</property>
|
||||||
@ -79,6 +85,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="PM3_connectButton">
|
<widget class="QPushButton" name="PM3_connectButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Connect</string>
|
<string>Connect</string>
|
||||||
</property>
|
</property>
|
||||||
@ -86,6 +98,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="PM3_disconnectButton">
|
<widget class="QPushButton" name="PM3_disconnectButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Disconnect</string>
|
<string>Disconnect</string>
|
||||||
</property>
|
</property>
|
||||||
@ -188,8 +206,27 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="MF_selectTrailerBox">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Select Trailer</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_data2KeyButton">
|
<widget class="QPushButton" name="MF_data2KeyButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>KeyBlocks->Key</string>
|
<string>KeyBlocks->Key</string>
|
||||||
</property>
|
</property>
|
||||||
@ -197,6 +234,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_key2DataButton">
|
<widget class="QPushButton" name="MF_key2DataButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>KeyBlocks<-Key</string>
|
<string>KeyBlocks<-Key</string>
|
||||||
</property>
|
</property>
|
||||||
@ -204,6 +247,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_fillKeysButton">
|
<widget class="QPushButton" name="MF_fillKeysButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Fill Keys</string>
|
<string>Fill Keys</string>
|
||||||
</property>
|
</property>
|
||||||
@ -211,6 +260,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_trailerDecoderButton">
|
<widget class="QPushButton" name="MF_trailerDecoderButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Trailer Decoder</string>
|
<string>Trailer Decoder</string>
|
||||||
</property>
|
</property>
|
||||||
@ -218,6 +273,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_fontButton">
|
<widget class="QPushButton" name="MF_fontButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Set Fonts</string>
|
<string>Set Fonts</string>
|
||||||
</property>
|
</property>
|
||||||
@ -290,6 +351,12 @@
|
|||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="MF_Type_miniButton">
|
<widget class="QRadioButton" name="MF_Type_miniButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string extracomment="320">MINI</string>
|
<string extracomment="320">MINI</string>
|
||||||
</property>
|
</property>
|
||||||
@ -297,6 +364,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="MF_Type_1kButton">
|
<widget class="QRadioButton" name="MF_Type_1kButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string extracomment="1024">1K</string>
|
<string extracomment="1024">1K</string>
|
||||||
</property>
|
</property>
|
||||||
@ -307,6 +380,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="MF_Type_2kButton">
|
<widget class="QRadioButton" name="MF_Type_2kButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string extracomment="2048">2K</string>
|
<string extracomment="2048">2K</string>
|
||||||
</property>
|
</property>
|
||||||
@ -314,6 +393,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="MF_Type_4kButton">
|
<widget class="QRadioButton" name="MF_Type_4kButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string extracomment="4096">4K</string>
|
<string extracomment="4096">4K</string>
|
||||||
</property>
|
</property>
|
||||||
@ -426,6 +511,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_Attack_infoButton">
|
<widget class="QPushButton" name="MF_Attack_infoButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Card Info</string>
|
<string>Card Info</string>
|
||||||
</property>
|
</property>
|
||||||
@ -439,6 +530,12 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Check Default</string>
|
<string>Check Default</string>
|
||||||
</property>
|
</property>
|
||||||
@ -448,7 +545,7 @@
|
|||||||
<widget class="QPushButton" name="MF_Attack_nestedButton">
|
<widget class="QPushButton" name="MF_Attack_nestedButton">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>40</width>
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
@ -459,6 +556,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_Attack_hardnestedButton">
|
<widget class="QPushButton" name="MF_Attack_hardnestedButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Hardnested</string>
|
<string>Hardnested</string>
|
||||||
</property>
|
</property>
|
||||||
@ -611,6 +714,12 @@
|
|||||||
</property>
|
</property>
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QPushButton" name="MF_RW_readBlockButton">
|
<widget class="QPushButton" name="MF_RW_readBlockButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Read One</string>
|
<string>Read One</string>
|
||||||
</property>
|
</property>
|
||||||
@ -618,6 +727,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QPushButton" name="MF_RW_writeBlockButton">
|
<widget class="QPushButton" name="MF_RW_writeBlockButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Write One</string>
|
<string>Write One</string>
|
||||||
</property>
|
</property>
|
||||||
@ -625,6 +740,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QPushButton" name="MF_RW_readSelectedButton">
|
<widget class="QPushButton" name="MF_RW_readSelectedButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Read Selected</string>
|
<string>Read Selected</string>
|
||||||
</property>
|
</property>
|
||||||
@ -632,6 +753,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QPushButton" name="MF_RW_writeSelectedButton">
|
<widget class="QPushButton" name="MF_RW_writeSelectedButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Write Selected</string>
|
<string>Write Selected</string>
|
||||||
</property>
|
</property>
|
||||||
@ -664,6 +791,12 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Restore</string>
|
<string>Restore</string>
|
||||||
</property>
|
</property>
|
||||||
@ -689,6 +822,12 @@
|
|||||||
</property>
|
</property>
|
||||||
<item row="0" column="2">
|
<item row="0" column="2">
|
||||||
<widget class="QPushButton" name="MF_UID_lockButton">
|
<widget class="QPushButton" name="MF_UID_lockButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Lock UFUID Card</string>
|
<string>Lock UFUID Card</string>
|
||||||
</property>
|
</property>
|
||||||
@ -696,6 +835,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="1" column="2">
|
<item row="1" column="2">
|
||||||
<widget class="QPushButton" name="MF_UID_aboutUIDButton">
|
<widget class="QPushButton" name="MF_UID_aboutUIDButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>About UID Card</string>
|
<string>About UID Card</string>
|
||||||
</property>
|
</property>
|
||||||
@ -703,6 +848,12 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QPushButton" name="MF_UID_readBlockButton">
|
<widget class="QPushButton" name="MF_UID_readBlockButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Read One</string>
|
<string>Read One</string>
|
||||||
</property>
|
</property>
|
||||||
@ -710,20 +861,38 @@
|
|||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QPushButton" name="MF_UID_writeBlockButton">
|
<widget class="QPushButton" name="MF_UID_writeBlockButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Write One</string>
|
<string>Write One</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QPushButton" name="MF_UID_readAllButton">
|
<widget class="QPushButton" name="MF_UID_readSelectedButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Read Selected</string>
|
<string>Read Selected</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QPushButton" name="MF_UID_writeAllButton">
|
<widget class="QPushButton" name="MF_UID_writeSelectedButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Write Selected</string>
|
<string>Write Selected</string>
|
||||||
</property>
|
</property>
|
||||||
@ -737,6 +906,12 @@
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Set Parameter</string>
|
<string>Set Parameter</string>
|
||||||
</property>
|
</property>
|
||||||
@ -812,22 +987,28 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="MF_Sim_loadDataButton">
|
<widget class="QPushButton" name="MF_Sim_writeSelectedButton">
|
||||||
<property name="text">
|
|
||||||
<string>Load from data above</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="MF_Sim_writeAllButton">
|
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>0</width>
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Read All</string>
|
<string>Write Selected</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="MF_Sim_readSelectedButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Read Selected</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user