Unify all read and write functions

pull/4/head
wh201906 4 years ago
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;
}
for(int j = 0; j < cardType.blk[i]; j++)
{ {
// dataA is always filled with "" because of the _readsec() if(!selectedSectors[i])
data.append(""); {
dataB.append(""); continue;
} }
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)); dataA = _readsec(i, Mifare::KEY_A, keyAList->at(i), targetType);
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++) // in other situations, the key doesn't matters
{ if(targetType == TARGET_MIFARE && (dataA.contains("") || dataA[cardType.blk[i] - 1].right(12) == "????????????"))
if(dataA[j] != "") dataB = _readsec(i, Mifare::KEY_B, keyBList->at(i), targetType);
data[j] = dataA[j];
else
data[j] = dataB[j];
}
// process trailer block seperately for(int j = 0; j < cardType.blk[i]; j++)
trailerA = dataA[cardType.blk[i] - 1]; {
trailerB = dataB[cardType.blk[i] - 1]; if(dataA[j] != "")
if(trailerA != "" && trailerB != "") data[j] = dataA[j];
{ else
QString ACbits = trailerA.mid(12, 8); data[j] = dataB[j];
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++) // process trailer block seperately
{ trailerA = dataA[cardType.blk[i] - 1];
if(selectedBlocks.contains(cardType.blks[i] + j)) trailerB = dataB[cardType.blk[i] - 1];
if(trailerA != "" && trailerB != "")
{ {
dataList->replace(cardType.blks[i] + j, data[j]); QString ACbits = trailerA.mid(12, 8);
data_syncWithDataWidget(false, cardType.blks[i] + j); 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;
} }
}
if(selectedBlocks.contains(cardType.blks[i] + cardType.blk[i] - 1)) for(int j = 0; j < cardType.blk[i]; j++)
{ {
// data widget has been updated, so this is just a temporary varient. if(selectedBlocks.contains(cardType.blks[i] + j))
if(data[cardType.blk[i] - 1] == "") {
data[cardType.blk[i] - 1] = "????????????????????????????????"; dataList->replace(cardType.blks[i] + j, data[j]);
data_syncWithDataWidget(false, cardType.blks[i] + j);
// 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))) if(selectedBlocks.contains(cardType.blks[i] + cardType.blk[i] - 1))
keyBList->replace(i, data[cardType.blk[i] - 1].right(12)); {
data_syncWithKeyWidget(false, i, KEY_A); // data widget has been updated, so this is just a temporary varient.
data_syncWithKeyWidget(false, i, KEY_B); 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)
{ {
for(int item : selectedBlocks) QList<int> failedBlocks;
QList<int> selectedBlocks;
for(int i = 0; i < cardType.block_size; i++)
{ {
bool result = false; if(ui->MF_dataWidget->item(i, 1)->checkState() == Qt::Checked)
result = _writeblk(item, KEY_A, keyAList->at(data_b2s(item)), dataList->at(item)); selectedBlocks.append(i);
if(!result)
{
result = _writeblk(item, KEY_B, keyBList->at(data_b2s(item)), dataList->at(item));
}
if(!result)
{
result = _writeblk(item, KEY_A, "FFFFFFFFFFFF", dataList->at(item));
}
} }
} for(int item : selectedBlocks)
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( bool result = false;
"hf mf cgetsc " if(targetType == TARGET_MIFARE)
+ QString::number(i),
waitTime);
qDebug() << result;
if(result.indexOf("No chinese") == -1)
{ {
offset = 0; result = _writeblk(item, KEY_A, keyAList->at(data_b2s(item)), dataList->at(item), TARGET_MIFARE);
for(int j = 0; j < cardType.blk[i]; j++) if(!result)
{ {
// 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();

@ -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-&gt;Key</string> <string>KeyBlocks-&gt;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&lt;-Key</string> <string>KeyBlocks&lt;-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="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text"> <property name="text">
<string>Load from data above</string> <string>Write Selected</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="MF_Sim_writeAllButton"> <widget class="QPushButton" name="MF_Sim_readSelectedButton">
<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>Read Selected</string>
</property> </property>
</widget> </widget>
</item> </item>

Loading…
Cancel
Save