mirror of
https://github.com/wh201906/Proxmark3GUI.git
synced 2025-04-21 03:56:19 +08:00
Refactor(nothing changed actually)
This commit is contained in:
parent
a325e3b670
commit
abfc940dc8
@ -68,7 +68,7 @@ void PM3Process::setSerialListener(const QString& name,bool state)
|
|||||||
|
|
||||||
void PM3Process::onTimeout() //when the proxmark3 client is unexpectedly terminated or the PM3 hardware is removed, the isBusy() will return false(only tested on Windows);
|
void PM3Process::onTimeout() //when the proxmark3 client is unexpectedly terminated or the PM3 hardware is removed, the isBusy() will return false(only tested on Windows);
|
||||||
{
|
{
|
||||||
qDebug()<<portInfo->isBusy();
|
// qDebug()<<portInfo->isBusy();
|
||||||
if(!portInfo->isBusy())
|
if(!portInfo->isBusy())
|
||||||
{
|
{
|
||||||
kill();
|
kill();
|
||||||
|
@ -1,51 +1,11 @@
|
|||||||
#include "mifare.h"
|
#include "mifare.h"
|
||||||
|
|
||||||
Mifare::Mifare(Util *addr,QObject *parent) : QObject(parent)
|
Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
util = addr;
|
util = addr;
|
||||||
isProcessingData=false;
|
this->ui = ui;
|
||||||
isProcessingKey=false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::processData(const QString str)
|
|
||||||
{
|
|
||||||
if(isProcessingData)
|
|
||||||
{
|
|
||||||
if(inputType==FROM_RDBL)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void Mifare::processKey(const QString str)
|
|
||||||
{
|
|
||||||
if(isProcessingKey)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void Mifare::setProcessingState(ProcessingState st)
|
|
||||||
{
|
|
||||||
if(st==Mifare::NONE)
|
|
||||||
{
|
|
||||||
isProcessingKey=false;
|
|
||||||
isProcessingData=false;
|
|
||||||
}
|
|
||||||
else if(st==Mifare::KEY)
|
|
||||||
{
|
|
||||||
isProcessingKey=true;
|
|
||||||
isProcessingData=false;
|
|
||||||
}
|
|
||||||
else if(st==Mifare::DATA)
|
|
||||||
{
|
|
||||||
isProcessingKey=false;
|
|
||||||
isProcessingData=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void Mifare::setInputType(InputType tp)
|
|
||||||
{
|
|
||||||
inputType=tp;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Mifare::isKeyValid(const QString key)
|
bool Mifare::isKeyValid(const QString key)
|
||||||
{
|
{
|
||||||
@ -58,3 +18,256 @@ bool Mifare::isKeyValid(const QString key)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mifare::info()
|
||||||
|
{
|
||||||
|
util->execCMD("hf 14a info");
|
||||||
|
ui->funcTab->setCurrentIndex(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::chk()
|
||||||
|
{
|
||||||
|
QString result = util->execCMDWithOutput("hf mf chk *1 ?");
|
||||||
|
result = result.mid(result.indexOf("|---|----------------|----------------|"));
|
||||||
|
QStringList keys = result.split("\r\n");
|
||||||
|
for(int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
ui->MF_keyWidget->setItem(i, 1, new QTableWidgetItem(keys[i + 3].mid(7, 12).trimmed().toUpper()));
|
||||||
|
ui->MF_keyWidget->setItem(i, 2, new QTableWidgetItem(keys[i + 3].mid(24, 12).trimmed().toUpper()));
|
||||||
|
}
|
||||||
|
qDebug() << "***********\n" << keys << "***********\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::nested()
|
||||||
|
{
|
||||||
|
QString result = util->execCMDWithOutput("hf mf nested 1 *");
|
||||||
|
result = result.mid(result.indexOf("|---|----------------|---|----------------|---|"));
|
||||||
|
QStringList keys = result.split("\r\n");
|
||||||
|
for(int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if(keys[i + 3].at(23) == '1')
|
||||||
|
ui->MF_keyWidget->setItem(i, 1, new QTableWidgetItem(keys[i + 3].mid(7, 12).trimmed().toUpper()));
|
||||||
|
if(keys[i + 3].at(44) == '1')
|
||||||
|
ui->MF_keyWidget->setItem(i, 2, new QTableWidgetItem(keys[i + 3].mid(28, 12).trimmed().toUpper()));
|
||||||
|
}
|
||||||
|
qDebug() << "***********\n" << keys << "***********\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::hardnested()
|
||||||
|
{
|
||||||
|
MF_Attack_hardnestedDialog dialog;
|
||||||
|
connect(&dialog, &MF_Attack_hardnestedDialog::sendCMD, util, &Util::execCMD);
|
||||||
|
if(dialog.exec() == QDialog::Accepted)
|
||||||
|
ui->funcTab->setCurrentIndex(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::sniff()
|
||||||
|
{
|
||||||
|
util->execCMD("hf mf sniff");
|
||||||
|
ui->funcTab->setCurrentIndex(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::list()
|
||||||
|
{
|
||||||
|
util->execCMD("hf list mf");
|
||||||
|
ui->funcTab->setCurrentIndex(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::read()
|
||||||
|
{
|
||||||
|
QString result = util->execCMDWithOutput("hf mf rdbl "
|
||||||
|
+ ui->MF_RW_blockBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_RW_keyTypeBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_RW_keyEdit->text());
|
||||||
|
if(result.indexOf("isOk:01") != -1)
|
||||||
|
{
|
||||||
|
result = result.mid(result.indexOf("isOk:01") + 13, 47).toUpper();
|
||||||
|
if((ui->MF_RW_blockBox->currentText().toInt() + 1) % 4 == 0)
|
||||||
|
{
|
||||||
|
if(ui->MF_RW_keyTypeBox->currentText() == "A")
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
result = result.replace(i * 3, 2, ui->MF_RW_keyEdit->text().mid(i * 2, 2));
|
||||||
|
}
|
||||||
|
ui->MF_RW_dataEdit->setText(result);
|
||||||
|
QString tmpKey = result.right(18).replace(" ", "");
|
||||||
|
result = util->execCMDWithOutput("hf mf rdbl "
|
||||||
|
+ ui->MF_RW_keyTypeBox->currentText()
|
||||||
|
+ " B "
|
||||||
|
+ tmpKey);
|
||||||
|
if(result.indexOf("isOk:01") == -1)
|
||||||
|
{
|
||||||
|
result = ui->MF_RW_dataEdit->text();
|
||||||
|
result = result.replace(30, 17, "?? ?? ?? ?? ?? ??");
|
||||||
|
ui->MF_RW_dataEdit->setText(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
result = result.replace(30 + i * 3, 2, ui->MF_RW_keyEdit->text().mid(i * 2, 2));
|
||||||
|
}
|
||||||
|
result = result.replace(0, 18, "?? ?? ?? ?? ?? ?? ");
|
||||||
|
ui->MF_RW_dataEdit->setText(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->MF_RW_dataEdit->setText(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::readAll()
|
||||||
|
{
|
||||||
|
QString result;
|
||||||
|
bool isKeyAValid;
|
||||||
|
bool isKeyBValid;
|
||||||
|
const int waitTime = 300;
|
||||||
|
for(int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
QApplication::processEvents();
|
||||||
|
result = "";
|
||||||
|
isKeyAValid = false;
|
||||||
|
isKeyBValid = false;
|
||||||
|
|
||||||
|
// check keys and read the first block of each sector
|
||||||
|
if(ui->MF_keyWidget->item(i, 1) != nullptr && isKeyValid(ui->MF_keyWidget->item(i, 1)->text()))
|
||||||
|
{
|
||||||
|
result = util->execCMDWithOutput("hf mf rdbl "
|
||||||
|
+ QString::number(4 * i)
|
||||||
|
+ " A "
|
||||||
|
+ ui->MF_keyWidget->item(i, 1)->text(), waitTime);
|
||||||
|
if(result.indexOf("isOk:01") != -1)
|
||||||
|
{
|
||||||
|
isKeyAValid = true;
|
||||||
|
ui->MF_dataWidget->setItem(4 * i, 2, new QTableWidgetItem(result.mid(result.indexOf("isOk:01") + 13, 47).toUpper()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QApplication::processEvents();
|
||||||
|
if(ui->MF_keyWidget->item(i, 2) != nullptr && isKeyValid(ui->MF_keyWidget->item(i, 2)->text()))
|
||||||
|
{
|
||||||
|
result = util->execCMDWithOutput("hf mf rdbl "
|
||||||
|
+ QString::number(4 * i)
|
||||||
|
+ " B "
|
||||||
|
+ ui->MF_keyWidget->item(i, 2)->text(), waitTime);
|
||||||
|
if(result.indexOf("isOk:01") != -1)
|
||||||
|
{
|
||||||
|
isKeyBValid = true;
|
||||||
|
ui->MF_dataWidget->setItem(4 * i, 2, new QTableWidgetItem(result.mid(result.indexOf("isOk:01") + 13, 47).toUpper()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// read the rest blocks of a sector
|
||||||
|
if(isKeyAValid || isKeyBValid)
|
||||||
|
{
|
||||||
|
for(int j = 1; j < 4; j++)
|
||||||
|
{
|
||||||
|
QApplication::processEvents();
|
||||||
|
result = util->execCMDWithOutput("hf mf rdbl "
|
||||||
|
+ QString::number(4 * i + j)
|
||||||
|
+ " "
|
||||||
|
+ (isKeyAValid ? "A" : "B")
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_keyWidget->item(i, (isKeyAValid ? 1 : 2))->text(), waitTime);
|
||||||
|
result = result.mid(result.indexOf("isOk:01") + 13, 47).toUpper();
|
||||||
|
ui->MF_dataWidget->setItem(4 * i + j, 2, new QTableWidgetItem(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
QApplication::processEvents();
|
||||||
|
// fill the MF_dataWidget with the known valid key
|
||||||
|
//
|
||||||
|
// check whether the MF_dataWidget contains the valid key,
|
||||||
|
// and fill MF_keyWidget(when you only have KeyA but the ReadBlock output contains the KeyB)
|
||||||
|
//
|
||||||
|
// the structure is not symmetric, since you cannot get KeyA from output
|
||||||
|
// this program will only process the provided KeyA(in MF_keyWidget)
|
||||||
|
result = ui->MF_dataWidget->item(4 * i + 3, 2)->text();
|
||||||
|
if(isKeyAValid)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < 6; j++)
|
||||||
|
{
|
||||||
|
result = result.replace(j * 3, 2, ui->MF_keyWidget->item(i, 1)->text().mid(j * 2, 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = result.replace(0, 18, "?? ?? ?? ?? ?? ?? ");
|
||||||
|
}
|
||||||
|
ui->MF_dataWidget->setItem(4 * i + 3, 2, new QTableWidgetItem(result));
|
||||||
|
|
||||||
|
if(isKeyBValid)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < 6; j++)
|
||||||
|
{
|
||||||
|
result = result.replace(30 + j * 3, 2, ui->MF_keyWidget->item(i, 2)->text().mid(j * 2, 2));
|
||||||
|
ui->MF_dataWidget->setItem(4 * i + 3, 2, new QTableWidgetItem(result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QString tmpKey = result.right(18).replace(" ", "");
|
||||||
|
result = util->execCMDWithOutput("hf mf rdbl "
|
||||||
|
+ QString::number(4 * i + 3)
|
||||||
|
+ " B "
|
||||||
|
+ tmpKey, waitTime);
|
||||||
|
if(result.indexOf("isOk:01") != -1)
|
||||||
|
{
|
||||||
|
ui->MF_keyWidget->setItem(i, 2, new QTableWidgetItem(tmpKey));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = ui->MF_dataWidget->item(4 * i + 3, 2)->text();
|
||||||
|
result = result.replace(30, 17, "?? ?? ?? ?? ?? ??");
|
||||||
|
ui->MF_dataWidget->setItem(4 * i + 3, 2, new QTableWidgetItem(result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::write()
|
||||||
|
{
|
||||||
|
QString result = util->execCMDWithOutput("hf mf wrbl "
|
||||||
|
+ ui->MF_RW_blockBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_RW_keyTypeBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_RW_keyEdit->text()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_RW_dataEdit->text().replace(" ", ""));
|
||||||
|
if(result.indexOf("isOk:01") != -1)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mifare::writeAll()
|
||||||
|
{
|
||||||
|
QString result;
|
||||||
|
for(int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
for(int j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
result = util->execCMDWithOutput("hf mf wrbl "
|
||||||
|
+ QString::number(i * 4 + j)
|
||||||
|
+ " A "
|
||||||
|
+ ui->MF_keyWidget->item(i, 1)->text()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_dataWidget->item(2, i * 4 + j)->text().replace(" ", ""));
|
||||||
|
if(result.indexOf("isOk:01") == -1)
|
||||||
|
{
|
||||||
|
result = util->execCMDWithOutput("hf mf wrbl "
|
||||||
|
+ QString::number(i * 4 + j)
|
||||||
|
+ " B "
|
||||||
|
+ ui->MF_keyWidget->item(i, 2)->text()
|
||||||
|
+ " "
|
||||||
|
+ ui->MF_dataWidget->item(2, i * 4 + j)->text().replace(" ", ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#define MIFARE_H
|
#define MIFARE_H
|
||||||
|
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
#include "ui/mf_attack_hardnesteddialog.h"
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
@ -9,36 +11,25 @@ class Mifare : public QObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit Mifare(Util *addr,QObject *parent = nullptr);
|
explicit Mifare(Ui::MainWindow *ui, Util *addr, QObject *parent = nullptr);
|
||||||
enum ProcessingState
|
|
||||||
{
|
|
||||||
NONE,
|
|
||||||
DATA,
|
|
||||||
KEY,
|
|
||||||
};
|
|
||||||
enum InputType
|
|
||||||
{
|
|
||||||
FROM_RDBL,
|
|
||||||
FROM_RDSC,
|
|
||||||
FROM_CHK,
|
|
||||||
FROM_NESTED,
|
|
||||||
};
|
|
||||||
|
|
||||||
void setProcessingState(ProcessingState st);
|
|
||||||
void setInputType(InputType tp);
|
|
||||||
bool isKeyValid(const QString key);
|
bool isKeyValid(const QString key);
|
||||||
|
void info();
|
||||||
|
void chk();
|
||||||
|
void nested();
|
||||||
|
void hardnested();
|
||||||
|
void sniff();
|
||||||
|
void list();
|
||||||
|
void read();
|
||||||
|
void readAll();
|
||||||
|
void write();
|
||||||
|
void writeAll();
|
||||||
public slots:
|
public slots:
|
||||||
void processData(const QString str);
|
|
||||||
void processKey(const QString str);
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Ui::MainWindow *ui;
|
||||||
Util* util;
|
Util* util;
|
||||||
bool isProcessingData=false;
|
|
||||||
bool isProcessingKey=false;
|
|
||||||
InputType inputType;
|
|
||||||
QStringList dataList;
|
|
||||||
QStringList keyList[2];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MIFARE_H
|
#endif // MIFARE_H
|
||||||
|
@ -15,7 +15,7 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
pm3state = false;
|
pm3state = false;
|
||||||
|
|
||||||
util = new Util(this);
|
util = new Util(this);
|
||||||
mifare = new Mifare(util,this);
|
mifare = new Mifare(ui, util, this);
|
||||||
|
|
||||||
|
|
||||||
uiInit();
|
uiInit();
|
||||||
@ -91,6 +91,20 @@ void MainWindow::on_PM3_disconnectButton_clicked()
|
|||||||
setStatusBar(connectStatusBar, "Not Connected");
|
setStatusBar(connectStatusBar, "Not Connected");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::refreshOutput(const QString& output)
|
||||||
|
{
|
||||||
|
qDebug() << "MainWindow::refresh:" << output;
|
||||||
|
ui->Raw_outputEdit->insertPlainText(output);
|
||||||
|
ui->Raw_outputEdit->moveCursor(QTextCursor::End);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::refreshCMD(const QString& cmd)
|
||||||
|
{
|
||||||
|
ui->Raw_CMDEdit->setText(cmd);
|
||||||
|
if(cmd != "" && (ui->Raw_CMDHistoryWidget->count() == 0 || ui->Raw_CMDHistoryWidget->item(ui->Raw_CMDHistoryWidget->count() - 1)->text() != cmd))
|
||||||
|
ui->Raw_CMDHistoryWidget->addItem(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
// *********************************************************
|
// *********************************************************
|
||||||
|
|
||||||
// ******************** raw command ********************
|
// ******************** raw command ********************
|
||||||
@ -138,253 +152,52 @@ void MainWindow::on_Raw_CMDHistoryWidget_itemDoubleClicked(QListWidgetItem *item
|
|||||||
|
|
||||||
void MainWindow::on_MF_Attack_infoButton_clicked()
|
void MainWindow::on_MF_Attack_infoButton_clicked()
|
||||||
{
|
{
|
||||||
util->execCMD("hf 14a info");
|
mifare->info();
|
||||||
ui->funcTab->setCurrentIndex(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Attack_chkButton_clicked()
|
void MainWindow::on_MF_Attack_chkButton_clicked()
|
||||||
{
|
{
|
||||||
QString result = util->execCMDWithOutput("hf mf chk *1 ?");
|
mifare->chk();
|
||||||
result = result.mid(result.indexOf("|---|----------------|----------------|"));
|
|
||||||
QStringList keys = result.split("\r\n");
|
|
||||||
for(int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
ui->MF_keyWidget->setItem(i, 1, new QTableWidgetItem(keys[i + 3].mid(7, 12).trimmed().toUpper()));
|
|
||||||
ui->MF_keyWidget->setItem(i, 2, new QTableWidgetItem(keys[i + 3].mid(24, 12).trimmed().toUpper()));
|
|
||||||
}
|
|
||||||
qDebug() << "***********\n" << keys << "***********\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Attack_nestedButton_clicked()
|
void MainWindow::on_MF_Attack_nestedButton_clicked()
|
||||||
{
|
{
|
||||||
QString result = util->execCMDWithOutput("hf mf nested 1 *");
|
mifare->nested();
|
||||||
result = result.mid(result.indexOf("|---|----------------|---|----------------|---|"));
|
|
||||||
QStringList keys = result.split("\r\n");
|
|
||||||
for(int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
if(keys[i + 3].at(23) == '1')
|
|
||||||
ui->MF_keyWidget->setItem(i, 1, new QTableWidgetItem(keys[i + 3].mid(7, 12).trimmed().toUpper()));
|
|
||||||
if(keys[i + 3].at(44) == '1')
|
|
||||||
ui->MF_keyWidget->setItem(i, 2, new QTableWidgetItem(keys[i + 3].mid(28, 12).trimmed().toUpper()));
|
|
||||||
}
|
|
||||||
qDebug() << "***********\n" << keys << "***********\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Attack_hardnestedButton_clicked()
|
void MainWindow::on_MF_Attack_hardnestedButton_clicked()
|
||||||
{
|
{
|
||||||
MF_Attack_hardnestedDialog dialog;
|
mifare->hardnested();
|
||||||
connect(&dialog, &MF_Attack_hardnestedDialog::sendCMD, util, &Util::execCMD);
|
|
||||||
if(dialog.exec()==QDialog::Accepted)
|
|
||||||
ui->funcTab->setCurrentIndex(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Attack_sniffButton_clicked()
|
void MainWindow::on_MF_Attack_sniffButton_clicked()
|
||||||
{
|
{
|
||||||
util->execCMD("hf mf sniff");
|
mifare->sniff();
|
||||||
ui->funcTab->setCurrentIndex(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_Attack_listButton_clicked()
|
void MainWindow::on_MF_Attack_listButton_clicked()
|
||||||
{
|
{
|
||||||
util->execCMD("hf list mf");
|
mifare->list();
|
||||||
ui->funcTab->setCurrentIndex(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_RW_readAllButton_clicked()
|
void MainWindow::on_MF_RW_readAllButton_clicked()
|
||||||
{
|
{
|
||||||
QString result;
|
mifare->readAll();
|
||||||
bool isKeyAValid;
|
|
||||||
bool isKeyBValid;
|
|
||||||
const int waitTime = 300;
|
|
||||||
for(int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
QApplication::processEvents();
|
|
||||||
result = "";
|
|
||||||
isKeyAValid = false;
|
|
||||||
isKeyBValid = false;
|
|
||||||
|
|
||||||
// check keys and read the first block of each sector
|
|
||||||
if(ui->MF_keyWidget->item(i, 1) != nullptr && mifare->isKeyValid(ui->MF_keyWidget->item(i, 1)->text()))
|
|
||||||
{
|
|
||||||
result = util->execCMDWithOutput("hf mf rdbl "
|
|
||||||
+ QString::number(4 * i)
|
|
||||||
+ " A "
|
|
||||||
+ ui->MF_keyWidget->item(i, 1)->text(), waitTime);
|
|
||||||
if(result.indexOf("isOk:01") != -1)
|
|
||||||
{
|
|
||||||
isKeyAValid = true;
|
|
||||||
ui->MF_dataWidget->setItem(4 * i, 2, new QTableWidgetItem(result.mid(result.indexOf("isOk:01") + 13, 47).toUpper()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QApplication::processEvents();
|
|
||||||
if(ui->MF_keyWidget->item(i, 2) != nullptr && mifare->isKeyValid(ui->MF_keyWidget->item(i, 2)->text()))
|
|
||||||
{
|
|
||||||
result = util->execCMDWithOutput("hf mf rdbl "
|
|
||||||
+ QString::number(4 * i)
|
|
||||||
+ " B "
|
|
||||||
+ ui->MF_keyWidget->item(i, 2)->text(), waitTime);
|
|
||||||
if(result.indexOf("isOk:01") != -1)
|
|
||||||
{
|
|
||||||
isKeyBValid = true;
|
|
||||||
ui->MF_dataWidget->setItem(4 * i, 2, new QTableWidgetItem(result.mid(result.indexOf("isOk:01") + 13, 47).toUpper()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read the rest blocks of a sector
|
|
||||||
if(isKeyAValid || isKeyBValid)
|
|
||||||
{
|
|
||||||
for(int j = 1; j < 4; j++)
|
|
||||||
{
|
|
||||||
QApplication::processEvents();
|
|
||||||
result = util->execCMDWithOutput("hf mf rdbl "
|
|
||||||
+ QString::number(4 * i + j)
|
|
||||||
+ " "
|
|
||||||
+ (isKeyAValid ? "A" : "B")
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_keyWidget->item(i, (isKeyAValid ? 1 : 2))->text(), waitTime);
|
|
||||||
result = result.mid(result.indexOf("isOk:01") + 13, 47).toUpper();
|
|
||||||
ui->MF_dataWidget->setItem(4 * i + j, 2, new QTableWidgetItem(result));
|
|
||||||
}
|
|
||||||
|
|
||||||
QApplication::processEvents();
|
|
||||||
// fill the MF_dataWidget with the known valid key
|
|
||||||
//
|
|
||||||
// check whether the MF_dataWidget contains the valid key,
|
|
||||||
// and fill MF_keyWidget(when you only have KeyA but the ReadBlock output contains the KeyB)
|
|
||||||
//
|
|
||||||
// the structure is not symmetric, since you cannot get KeyA from output
|
|
||||||
// this program will only process the provided KeyA(in MF_keyWidget)
|
|
||||||
result = ui->MF_dataWidget->item(4 * i + 3, 2)->text();
|
|
||||||
if(isKeyAValid)
|
|
||||||
{
|
|
||||||
for(int j = 0; j < 6; j++)
|
|
||||||
{
|
|
||||||
result = result.replace(j * 3, 2, ui->MF_keyWidget->item(i, 1)->text().mid(j * 2, 2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = result.replace(0, 18, "?? ?? ?? ?? ?? ?? ");
|
|
||||||
}
|
|
||||||
ui->MF_dataWidget->setItem(4 * i + 3, 2, new QTableWidgetItem(result));
|
|
||||||
|
|
||||||
if(isKeyBValid)
|
|
||||||
{
|
|
||||||
for(int j = 0; j < 6; j++)
|
|
||||||
{
|
|
||||||
result = result.replace(30 + j * 3, 2, ui->MF_keyWidget->item(i, 2)->text().mid(j * 2, 2));
|
|
||||||
ui->MF_dataWidget->setItem(4 * i + 3, 2, new QTableWidgetItem(result));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QString tmpKey = result.right(18).replace(" ", "");
|
|
||||||
result = util->execCMDWithOutput("hf mf rdbl "
|
|
||||||
+ QString::number(4 * i + 3)
|
|
||||||
+ " B "
|
|
||||||
+ tmpKey, waitTime);
|
|
||||||
if(result.indexOf("isOk:01") != -1)
|
|
||||||
{
|
|
||||||
ui->MF_keyWidget->setItem(i, 2, new QTableWidgetItem(tmpKey));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result = ui->MF_dataWidget->item(4 * i + 3, 2)->text();
|
|
||||||
result = result.replace(30, 17, "?? ?? ?? ?? ?? ??");
|
|
||||||
ui->MF_dataWidget->setItem(4 * i + 3, 2, new QTableWidgetItem(result));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_RW_readBlockButton_clicked()
|
void MainWindow::on_MF_RW_readBlockButton_clicked()
|
||||||
{
|
{
|
||||||
QString result = util->execCMDWithOutput("hf mf rdbl "
|
mifare->read();
|
||||||
+ ui->MF_RW_blockBox->currentText()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_RW_keyTypeBox->currentText()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_RW_keyEdit->text());
|
|
||||||
if(result.indexOf("isOk:01") != -1)
|
|
||||||
{
|
|
||||||
result = result.mid(result.indexOf("isOk:01") + 13, 47).toUpper();
|
|
||||||
if((ui->MF_RW_blockBox->currentText().toInt() + 1) % 4 == 0)
|
|
||||||
{
|
|
||||||
if(ui->MF_RW_keyTypeBox->currentText() == "A")
|
|
||||||
{
|
|
||||||
for(int i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
result = result.replace(i * 3, 2, ui->MF_RW_keyEdit->text().mid(i * 2, 2));
|
|
||||||
}
|
|
||||||
ui->MF_RW_dataEdit->setText(result);
|
|
||||||
QString tmpKey = result.right(18).replace(" ", "");
|
|
||||||
result = util->execCMDWithOutput("hf mf rdbl "
|
|
||||||
+ ui->MF_RW_keyTypeBox->currentText()
|
|
||||||
+ " B "
|
|
||||||
+ tmpKey);
|
|
||||||
if(result.indexOf("isOk:01") == -1)
|
|
||||||
{
|
|
||||||
result = ui->MF_RW_dataEdit->text();
|
|
||||||
result = result.replace(30, 17, "?? ?? ?? ?? ?? ??");
|
|
||||||
ui->MF_RW_dataEdit->setText(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(int i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
result = result.replace(30 + i * 3, 2, ui->MF_RW_keyEdit->text().mid(i * 2, 2));
|
|
||||||
}
|
|
||||||
result = result.replace(0, 18, "?? ?? ?? ?? ?? ?? ");
|
|
||||||
ui->MF_RW_dataEdit->setText(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_RW_writeBlockButton_clicked()
|
void MainWindow::on_MF_RW_writeBlockButton_clicked()
|
||||||
{
|
{
|
||||||
QString result = util->execCMDWithOutput("hf mf wrbl "
|
mifare->write();
|
||||||
+ ui->MF_RW_blockBox->currentText()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_RW_keyTypeBox->currentText()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_RW_keyEdit->text()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_RW_dataEdit->text().replace(" ", ""));
|
|
||||||
if(result.indexOf("isOk:01") != -1)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_RW_writeAllButton_clicked()
|
void MainWindow::on_MF_RW_writeAllButton_clicked()
|
||||||
{
|
{
|
||||||
QString result;
|
mifare->writeAll();
|
||||||
for(int i = 0; i < 16; i++)
|
|
||||||
{
|
|
||||||
for(int j = 0; j < 4; j++)
|
|
||||||
{
|
|
||||||
result = util->execCMDWithOutput("hf mf wrbl "
|
|
||||||
+ QString::number(i * 4 + j)
|
|
||||||
+ " A "
|
|
||||||
+ ui->MF_keyWidget->item(i, 1)->text()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_dataWidget->item(2, i * 4 + j)->text().replace(" ", ""));
|
|
||||||
if(result.indexOf("isOk:01") == -1)
|
|
||||||
{
|
|
||||||
result = util->execCMDWithOutput("hf mf wrbl "
|
|
||||||
+ QString::number(i * 4 + j)
|
|
||||||
+ " B "
|
|
||||||
+ ui->MF_keyWidget->item(i, 2)->text()
|
|
||||||
+ " "
|
|
||||||
+ ui->MF_dataWidget->item(2, i * 4 + j)->text().replace(" ", ""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ************************************************
|
// ************************************************
|
||||||
@ -392,21 +205,7 @@ void MainWindow::on_MF_RW_writeAllButton_clicked()
|
|||||||
|
|
||||||
// ******************** other ********************
|
// ******************** other ********************
|
||||||
|
|
||||||
void MainWindow::refreshOutput(const QString& output)
|
void MainWindow::sendMSG() // send command when pressing Enter
|
||||||
{
|
|
||||||
qDebug()<<"MainWindow::refresh:" << output;
|
|
||||||
ui->Raw_outputEdit->insertPlainText(output);
|
|
||||||
ui->Raw_outputEdit->moveCursor(QTextCursor::End);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::refreshCMD(const QString& cmd)
|
|
||||||
{
|
|
||||||
ui->Raw_CMDEdit->setText(cmd);
|
|
||||||
if(cmd!=""&&(ui->Raw_CMDHistoryWidget->count() == 0 || ui->Raw_CMDHistoryWidget->item(ui->Raw_CMDHistoryWidget->count() - 1)->text() != cmd))
|
|
||||||
ui->Raw_CMDHistoryWidget->addItem(cmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::sendMSG()
|
|
||||||
{
|
{
|
||||||
if(ui->Raw_CMDEdit->hasFocus())
|
if(ui->Raw_CMDEdit->hasFocus())
|
||||||
on_Raw_sendCMDButton_clicked();
|
on_Raw_sendCMDButton_clicked();
|
||||||
|
@ -13,10 +13,11 @@
|
|||||||
#include "common/pm3process.h"
|
#include "common/pm3process.h"
|
||||||
#include "module/mifare.h"
|
#include "module/mifare.h"
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
#include "ui/mf_attack_hardnesteddialog.h"
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
namespace Ui { class MainWindow; }
|
namespace Ui {
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
class MainWindow : public QMainWindow
|
||||||
|
Loading…
x
Reference in New Issue
Block a user