From eb5fa7ec9a328439a0d6988dfcd87d314354222a Mon Sep 17 00:00:00 2001 From: wh201906 Date: Wed, 5 Aug 2020 22:46:41 +0800 Subject: [PATCH] Replace QRegExp with QRegularExpression(Uncompleted) --- common/pm3process.cpp | 4 +- module/mifare.cpp | 105 ++++++++++++++++++++++++++++-------------- module/mifare.h | 4 +- ui/mainwindow.cpp | 3 +- ui/mainwindow.ui | 2 +- 5 files changed, 77 insertions(+), 41 deletions(-) diff --git a/common/pm3process.cpp b/common/pm3process.cpp index dc219b7..08aef5a 100644 --- a/common/pm3process.cpp +++ b/common/pm3process.cpp @@ -17,6 +17,7 @@ PM3Process::PM3Process(QThread* thread, QObject* parent): QProcess(parent) void PM3Process::connectPM3(const QString path, const QString port) { QString result; + Util::ClientType clientType = Util::CLIENTTYPE_OFFICIAL; setRequiringOutput(true); // using "-f" option to make the client output flushed after every print. @@ -28,7 +29,7 @@ void PM3Process::connectPM3(const QString path, const QString port) result = *requiredOutput; if(result.indexOf("[=]") != -1) { - emit changeClientType(Util::CLIENTTYPE_ICEMAN); + clientType = Util::CLIENTTYPE_ICEMAN; setRequiringOutput(true); write("hw version\r\n"); waitForReadyRead(1000); @@ -37,6 +38,7 @@ void PM3Process::connectPM3(const QString path, const QString port) } if(result.indexOf("os: ") != -1) // make sure the PM3 is connected { + emit changeClientType(clientType); result = result.mid(result.indexOf("os: ")); result = result.left(result.indexOf("\r\n")); result = result.mid(3, result.lastIndexOf(" ") - 3); diff --git a/module/mifare.cpp b/module/mifare.cpp index 1dbaa10..e9a0e94 100644 --- a/module/mifare.cpp +++ b/module/mifare.cpp @@ -9,42 +9,45 @@ Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QWidget *parent): QObject(parent) keyAList = new QStringList(); keyBList = new QStringList(); dataList = new QStringList(); - data_clearKey(); // fill with blank Qstring - data_clearData(); // fill with blank Qstring + data_clearKey(); // fill with blank QString + data_clearData(); // fill with blank QString dataPattern = new QRegExp("([0-9a-fA-F]{2} ){15}[0-9a-fA-F]{2}"); - chkKeyPattern = new QRegExp("\\|\\d{3}\\|.+\\|.+\\|"); - nestedKeyPattern = new QRegExp("\\|\\d{3}\\|.+\\|.+\\|.+\\|.+\\|"); + keyPattern_res = new QRegularExpression("\\|\\d{3}\\|.+?\\|.+?\\|.+?\\|.+?\\|"); + keyPattern = new QRegularExpression("\\|\\d{3}\\|.+?\\|.+?\\|"); } QString Mifare::info(bool isRequiringOutput) { - if(isRequiringOutput) + if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN) { - QString result = util->execCMDWithOutput("hf 14a info", 500); - qDebug() << result << result.indexOf(QRegExp(ui->MF_RW_dataEdit->text()), 0); - result.replace("UID :", "|"); - result.replace("ATQA :", "|"); - result.replace("SAK :", "|"); - result.replace("TYPE :", "|"); - QStringList lis = result.split("|"); - if(lis.length() > 4) + if(isRequiringOutput) { - qDebug() << lis[1] + lis[2] + lis[3]; - return lis[1] + lis[2] + lis[3]; + QString result = util->execCMDWithOutput("hf 14a info", 500); + result.replace("UID :", "|||"); + result.replace("ATQA :", "|||"); + result.replace("SAK :", "|||"); + result.replace("TYPE :", "|||"); + QStringList lis = result.split("|||"); + if(lis.length() > 4) + { + qDebug() << lis[1] + lis[2] + lis[3]; + return lis[1] + lis[2] + lis[3]; + } + else + return ""; } else + { + util->execCMD("hf 14a info"); + ui->funcTab->setCurrentIndex(1); return ""; - } - else - { - util->execCMD("hf 14a info"); - ui->funcTab->setCurrentIndex(1); - return ""; + } } } void Mifare::chk() { + QRegularExpressionMatch reMatch; QString result = util->execCMDWithOutput( "hf mf chk *" + QString::number(cardType.type) @@ -53,21 +56,53 @@ void Mifare::chk() qDebug() << result; int offset = 0; - QString tmp, tmp2; - for(int i = 0; i < cardType.sector_size; i++) + QString data; + if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) + { + for(int i = 0; i < cardType.sector_size; i++) + { + reMatch = keyPattern->match(result, offset); + offset = reMatch.capturedStart(); + if(reMatch.hasMatch()) + { + data = reMatch.captured().toUpper(); + offset += data.length(); + QStringList cells = data.remove(" ").split("|"); + if(!cells.at(2).contains("?")) + { + keyAList->replace(i, cells.at(2)); + } + if(!cells.at(3).contains("?")) + { + keyBList->replace(i, cells.at(3)); + } + } + } + } + else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) { - offset = chkKeyPattern->indexIn(result, offset); -// offset = result.indexOf(*chkKeyPattern, offset); - tmp = result.mid(offset, 39).toUpper(); - offset += 39; - qDebug() << tmp << offset; - tmp2 = tmp.mid(7, 12).trimmed(); - if(tmp2 != "?") - keyAList->replace(i, tmp2); - tmp2 = tmp.mid(24, 12).trimmed(); - if(tmp2 != "?") - keyBList->replace(i, tmp2); + for(int i = 0; i < cardType.sector_size; i++) + { + reMatch = keyPattern_res->match(result, offset); + offset = reMatch.capturedStart(); + if(reMatch.hasMatch()) + { + data = reMatch.captured().toUpper(); + offset += data.length(); + QStringList cells = data.remove(" ").split("|"); + if(cells.at(3) == "1") + { + keyAList->replace(i, cells.at(2)); + } + if(cells.at(5) == "1") + { + keyBList->replace(i, cells.at(4)); + } + } + } + } + data_syncWithKeyWidget(); } @@ -82,7 +117,7 @@ void Mifare::nested() QString tmp; for(int i = 0; i < cardType.sector_size; i++) { - offset = nestedKeyPattern->indexIn(result, offset); +// offset = nestedKeyPattern->indexIn(result, offset); // offset = result.indexOf(*nestedKeyPattern, offset); tmp = result.mid(offset, 47).toUpper(); offset += 47; diff --git a/module/mifare.h b/module/mifare.h index f578f16..4b622da 100644 --- a/module/mifare.h +++ b/module/mifare.h @@ -135,8 +135,8 @@ private: QStringList* keyBList; QStringList* dataList; QRegExp* dataPattern; - QRegExp* chkKeyPattern; - QRegExp* nestedKeyPattern; + QRegularExpression* keyPattern_res; + QRegularExpression* keyPattern; QRegExp* UIDPattern; QString bin2text(const QByteArray& buff, int start, int length); diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index 26d60d3..ef0dc3f 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -6,8 +6,6 @@ MainWindow::MainWindow(QWidget *parent): , ui(new Ui::MainWindow) { ui->setupUi(this); -// ui->MF_simGroupBox->setVisible(false); // developing... -// ui->MF_sniffGroupBox->setVisible(false); // developing... myInfo = new QAction("wh201906", this); connect(myInfo, &QAction::triggered, [ = ]() { @@ -94,6 +92,7 @@ void MainWindow::onPM3StateChanged(bool st, QString info) } else { + setStatusBar(PM3VersionBar, ""); setStatusBar(connectStatusBar, tr("Not Connected")); } } diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index cf7518d..7096074 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -60,7 +60,7 @@ - ../pm3/win64/proxmark3 + ../pm3/iceman-64/win64/proxmark3