From 383eaff2a552918fc48bd466ed305ecfcb1f6e74 Mon Sep 17 00:00:00 2001 From: wh201906 Date: Tue, 28 Apr 2020 19:54:05 +0800 Subject: [PATCH] Support editing data and key manually --- module/mifare.cpp | 50 ++++++++++++++++++++++++++------------ module/mifare.h | 2 ++ ui/mainwindow.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++++++ ui/mainwindow.h | 6 +++++ ui/mainwindow.ui | 21 +++++++++++++--- 5 files changed, 122 insertions(+), 19 deletions(-) diff --git a/module/mifare.cpp b/module/mifare.cpp index 7fe5214..c7f3dd0 100644 --- a/module/mifare.cpp +++ b/module/mifare.cpp @@ -417,28 +417,35 @@ void Mifare::restore() void Mifare::data_syncWithDataWidget(bool syncAll, int block) { - QString tmp = ""; + QString tmp; if(syncAll) { for(int i = 0; i < cardType.blocks; i++) { tmp = ""; - tmp += dataList->at(i).mid(0, 2); - for(int j = 1; j < 16; j++) + if(dataList->at(i) != "") { - tmp += " "; - tmp += dataList->at(i).mid(j * 2, 2); + tmp += dataList->at(i).mid(0, 2); + for(int j = 1; j < 16; j++) + { + tmp += " "; + tmp += dataList->at(i).mid(j * 2, 2); + } } ui->MF_dataWidget->item(i, 2)->setText(tmp); } } else { - tmp += dataList->at(block).mid(0, 2); - for(int j = 1; j < 16; j++) + tmp = ""; + if(dataList->at(block) != "") { - tmp += " "; - tmp += dataList->at(block).mid(j * 2, 2); + tmp += dataList->at(block).mid(0, 2); + for(int j = 1; j < 16; j++) + { + tmp += " "; + tmp += dataList->at(block).mid(j * 2, 2); + } } ui->MF_dataWidget->item(block, 2)->setText(tmp); } @@ -659,13 +666,13 @@ bool Mifare::data_saveDataFile(const QString& filename, bool isBin) unsigned char Byt[2]; for(int k = 0; k < 2; k++) { - tmp = dataList->at(i).at(j*2+k).toUpper(); + tmp = dataList->at(i).at(j * 2 + k).toUpper(); if(tmp >= '0' && tmp <= '9') Byt[k] = tmp.toLatin1() - '0'; else if(tmp >= 'A' && tmp <= 'F') Byt[k] = tmp.toLatin1() - 'A' + 10; } - buff += (Byt[0] << 4)|Byt[1]; + buff += (Byt[0] << 4) | Byt[1]; } } } @@ -703,26 +710,26 @@ bool Mifare::data_saveKeyFile(const QString& filename, bool isBin) unsigned char Byt[2]; for(int k = 0; k < 2; k++) { - tmp = keyAList->at(i).at(j*2+k).toUpper(); + tmp = keyAList->at(i).at(j * 2 + k).toUpper(); if(tmp >= '0' && tmp <= '9') Byt[k] = tmp.toLatin1() - '0'; else if(tmp >= 'A' && tmp <= 'F') Byt[k] = tmp.toLatin1() - 'A' + 10; } - buff += (Byt[0] << 4)|Byt[1]; + buff += (Byt[0] << 4) | Byt[1]; } for(int j = 0; j < 6; j++) { unsigned char Byt[2]; for(int k = 0; k < 2; k++) { - tmp = keyBList->at(i).at(j*2+k).toUpper(); + tmp = keyBList->at(i).at(j * 2 + k).toUpper(); if(tmp >= '0' && tmp <= '9') Byt[k] = tmp.toLatin1() - '0'; else if(tmp >= 'A' && tmp <= 'F') Byt[k] = tmp.toLatin1() - 'A' + 10; } - buff += (Byt[0] << 4)|Byt[1]; + buff += (Byt[0] << 4) | Byt[1]; } } } @@ -782,3 +789,16 @@ void Mifare::data_data2Key() data_syncWithKeyWidget(); } } + +void Mifare::data_setData(int block, const QString& data) +{ + dataList->replace(block, data); +} + +void Mifare::data_setKey(int sector, bool isKeyA, const QString& key) +{ + if(isKeyA) + keyAList->replace(sector, key); + else + keyBList->replace(sector, key); +} diff --git a/module/mifare.h b/module/mifare.h index fdc1392..c05f0fe 100644 --- a/module/mifare.h +++ b/module/mifare.h @@ -101,6 +101,8 @@ public: void data_key2Data(); void data_data2Key(); + void data_setData(int block, const QString &data); + void data_setKey(int sector, bool isKeyA, const QString &key); public slots: signals: diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index a126b42..76f89e8 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -192,6 +192,54 @@ void MainWindow::on_MF_key2DataBotton_clicked() mifare->data_key2Data(); } +void MainWindow::on_MF_dataWidget_itemChanged(QTableWidgetItem *item) +{ + + if(item->column() == 2) + { + QString data = item->text().replace(" ", ""); + if(data == "" || mifare->data_isDataValid(data) == Mifare::DATA_NOSPACE) + { + mifare->data_setData(item->row(), data); + } + else + { + QMessageBox::information(this, tr("Info"), tr("Data must consists of 32 Hex symbols(Whitespace is allowed)")); + } + mifare->data_syncWithDataWidget(false, item->row()); + } +} + +void MainWindow::on_MF_keyWidget_itemChanged(QTableWidgetItem *item) +{ + if(item->column() == 1) + { + QString key = item->text().replace(" ", ""); + if(key == "" || mifare->data_isKeyValid(key)) + { + mifare->data_setKey(item->row(), true, key); + } + else + { + QMessageBox::information(this, tr("Info"), tr("Key must consists of 12 Hex symbols(Whitespace is allowed)")); + } + mifare->data_syncWithKeyWidget(false, item->row(), true); + } + else if(item->column() == 2) + { + QString key = item->text().replace(" ", ""); + if(key == "" || mifare->data_isKeyValid(key)) + { + mifare->data_setKey(item->row(), false, key); + } + else + { + QMessageBox::information(this, tr("Info"), tr("Key must consists of 12 Hex symbols(Whitespace is allowed)")); + } + mifare->data_syncWithKeyWidget(false, item->row(), false); + } +} + void MainWindow::on_MF_File_loadButton_clicked() { QString title = ""; @@ -261,6 +309,20 @@ void MainWindow::on_MF_File_saveButton_clicked() qDebug() << filename << selectedType; } +void MainWindow::on_MF_File_clearButton_clicked() +{ + if(ui->MF_File_keyBox->isChecked()) + { + mifare->data_clearKey(); + mifare->data_syncWithKeyWidget(); + } + else if(ui->MF_File_dataBox->isChecked()) + { + mifare->data_clearData(); + mifare->data_syncWithDataWidget(); + } +} + void MainWindow::on_MF_Attack_infoButton_clicked() { mifare->info(); diff --git a/ui/mainwindow.h b/ui/mainwindow.h index 7909c3c..e4d00f3 100644 --- a/ui/mainwindow.h +++ b/ui/mainwindow.h @@ -98,6 +98,12 @@ private slots: void on_MF_key2DataBotton_clicked(); + void on_MF_dataWidget_itemChanged(QTableWidgetItem *item); + + void on_MF_File_clearButton_clicked(); + + void on_MF_keyWidget_itemChanged(QTableWidgetItem *item); + private: Ui::MainWindow* ui; QButtonGroup* typeBtnGroup; diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index 63adddc..c3b88bb 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -6,14 +6,14 @@ 0 0 - 820 + 859 770 - 800 - 550 + 820 + 770 @@ -42,7 +42,7 @@ - E:\Documents\source\qt\pm3\win64\proxmark3 + ../pm3/win64/proxmark3 @@ -322,6 +322,19 @@ + + + + + 40 + 0 + + + + Clear + + +