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
+
+
+
-