mirror of
https://github.com/wh201906/Proxmark3GUI.git
synced 2025-03-14 18:44:41 +08:00
Support write selected blocks and fix a bug
This commit is contained in:
parent
4dba7882e5
commit
41bbcd2c4a
@ -273,7 +273,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, int w
|
|||||||
{
|
{
|
||||||
QString data;
|
QString data;
|
||||||
QString result;
|
QString result;
|
||||||
bool isKeyBlock = (blockId < 128 && ((blockId + 1) % 4 == 0)) || ((blockId + 1) % 8 == 0);
|
bool isKeyBlock = (blockId < 128 && ((blockId + 1) % 4 == 0)) || ((blockId + 1) % 16 == 0);
|
||||||
|
|
||||||
if(!data_isKeyValid(key))
|
if(!data_isKeyValid(key))
|
||||||
{
|
{
|
||||||
@ -397,7 +397,7 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key,
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::read()
|
void Mifare::readOne()
|
||||||
{
|
{
|
||||||
int blockId = ui->MF_RW_blockBox->currentText().toInt();
|
int blockId = ui->MF_RW_blockBox->currentText().toInt();
|
||||||
Mifare::KeyType keyType = (Mifare::KeyType)(ui->MF_RW_keyTypeBox->currentData().toInt());
|
Mifare::KeyType keyType = (Mifare::KeyType)(ui->MF_RW_keyTypeBox->currentData().toInt());
|
||||||
@ -424,7 +424,7 @@ void Mifare::readSelected(const QList<int>& selectedBlocks)
|
|||||||
}
|
}
|
||||||
for(int item : selectedBlocks)
|
for(int item : selectedBlocks)
|
||||||
{
|
{
|
||||||
selectedSectors[item / 4] = true;
|
selectedSectors[data_b2s(item)] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
for(int i = 0; i < cardType.sector_size; i++)
|
||||||
@ -514,7 +514,7 @@ bool Mifare::_writeblk(int blockId, KeyType keyType, const QString& key, const Q
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::write()
|
void Mifare::writeOne()
|
||||||
{
|
{
|
||||||
int blockId = ui->MF_RW_blockBox->currentText().toInt();
|
int blockId = ui->MF_RW_blockBox->currentText().toInt();
|
||||||
Mifare::KeyType keyType = (Mifare::KeyType)(ui->MF_RW_keyTypeBox->currentData().toInt());
|
Mifare::KeyType keyType = (Mifare::KeyType)(ui->MF_RW_keyTypeBox->currentData().toInt());
|
||||||
@ -529,22 +529,19 @@ void Mifare::write()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mifare::writeAll()
|
void Mifare::writeSelected(const QList<int>& selectedBlocks)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < cardType.sector_size; i++)
|
for(int item : selectedBlocks)
|
||||||
{
|
{
|
||||||
for(int j = 0; j < cardType.blk[i]; j++)
|
bool result = false;
|
||||||
|
result = _writeblk(item, KEY_A, keyAList->at(data_b2s(item)), dataList->at(item));
|
||||||
|
if(!result)
|
||||||
{
|
{
|
||||||
bool result = false;
|
result = _writeblk(item, KEY_B, keyBList->at(data_b2s(item)), dataList->at(item));
|
||||||
result = _writeblk(cardType.blks[i] + j, KEY_A, keyAList->at(i), dataList->at(cardType.blks[i] + j));
|
}
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
result = _writeblk(cardType.blks[i] + j, KEY_B, keyBList->at(i), dataList->at(cardType.blks[i] + j));
|
result = _writeblk(item, KEY_A, "FFFFFFFFFFFF", dataList->at(item));
|
||||||
}
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
result = _writeblk(cardType.blks[i] + j, KEY_A, "FFFFFFFFFFFF", dataList->at(cardType.blks[i] + j));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1190,6 +1187,16 @@ void Mifare::data_fillKeys()
|
|||||||
data_syncWithKeyWidget();
|
data_syncWithKeyWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Mifare::data_b2s(int block)
|
||||||
|
{
|
||||||
|
if(block >= 0 && block < 128)
|
||||||
|
return block / 4;
|
||||||
|
else if(block < 256)
|
||||||
|
return (block - 128) / 16 + 32;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
QList<quint8> Mifare::data_getACBits(const QString& text) //return empty QList if the text is invalid
|
QList<quint8> Mifare::data_getACBits(const QString& text) //return empty QList if the text is invalid
|
||||||
{
|
{
|
||||||
QString input = text;
|
QString input = text;
|
||||||
|
@ -24,10 +24,10 @@ public:
|
|||||||
void sniff();
|
void sniff();
|
||||||
void snoop();
|
void snoop();
|
||||||
void list();
|
void list();
|
||||||
void read();
|
void readOne();
|
||||||
void readSelected(const QList<int>& selectedBlocks);
|
void readSelected(const QList<int>& selectedBlocks);
|
||||||
void write();
|
void writeOne();
|
||||||
void writeAll();
|
void writeSelected(const QList<int>& selectedBlocks);
|
||||||
void dump();
|
void dump();
|
||||||
void restore();
|
void restore();
|
||||||
|
|
||||||
@ -106,6 +106,7 @@ public:
|
|||||||
void data_fillKeys();
|
void data_fillKeys();
|
||||||
|
|
||||||
static QList<quint8> data_getACBits(const QString &text);
|
static QList<quint8> data_getACBits(const QString &text);
|
||||||
|
static int data_b2s(int block);
|
||||||
public slots:
|
public slots:
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
|
@ -263,7 +263,7 @@ void MainWindow::on_MF_dataWidget_itemChanged(QTableWidgetItem *item)
|
|||||||
if(item->column() == 0)
|
if(item->column() == 0)
|
||||||
{
|
{
|
||||||
int selectedSectors = 0;
|
int selectedSectors = 0;
|
||||||
for(int i = 0; i < mifare->cardType.blk[item->row() / 4]; i++)
|
for(int i = 0; i < mifare->cardType.blk[Mifare::data_b2s(item->row())]; i++)
|
||||||
{
|
{
|
||||||
ui->MF_dataWidget->item(i + item->row(), 1)->setCheckState(item->checkState());
|
ui->MF_dataWidget->item(i + item->row(), 1)->setCheckState(item->checkState());
|
||||||
qDebug() << i << mifare->cardType.blk[item->row()] << i + item->row() << ui->MF_dataWidget->item(i + item->row(), 1)->text();
|
qDebug() << i << mifare->cardType.blk[item->row()] << i + item->row() << ui->MF_dataWidget->item(i + item->row(), 1)->text();
|
||||||
@ -300,9 +300,9 @@ void MainWindow::on_MF_dataWidget_itemChanged(QTableWidgetItem *item)
|
|||||||
selectedBlocks++;
|
selectedBlocks++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(int i = 0; i < mifare->cardType.blk[item->row() / 4]; i++)
|
for(int i = 0; i < mifare->cardType.blk[Mifare::data_b2s(item->row())]; i++)
|
||||||
{
|
{
|
||||||
if(ui->MF_dataWidget->item(i + mifare->cardType.blks[item->row() / 4], 1)->checkState() == Qt::Checked)
|
if(ui->MF_dataWidget->item(i + mifare->cardType.blks[Mifare::data_b2s(item->row())], 1)->checkState() == Qt::Checked)
|
||||||
{
|
{
|
||||||
selectedSubBlocks++;
|
selectedSubBlocks++;
|
||||||
}
|
}
|
||||||
@ -321,15 +321,15 @@ void MainWindow::on_MF_dataWidget_itemChanged(QTableWidgetItem *item)
|
|||||||
}
|
}
|
||||||
if(selectedSubBlocks == 0)
|
if(selectedSubBlocks == 0)
|
||||||
{
|
{
|
||||||
ui->MF_dataWidget->item(mifare->cardType.blks[item->row() / 4], 0)->setCheckState(Qt::Unchecked);
|
ui->MF_dataWidget->item(mifare->cardType.blks[Mifare::data_b2s(item->row())], 0)->setCheckState(Qt::Unchecked);
|
||||||
}
|
}
|
||||||
else if(selectedSubBlocks == mifare->cardType.blk[item->row() / 4])
|
else if(selectedSubBlocks == mifare->cardType.blk[Mifare::data_b2s(item->row())])
|
||||||
{
|
{
|
||||||
ui->MF_dataWidget->item(mifare->cardType.blks[item->row() / 4], 0)->setCheckState(Qt::Checked);
|
ui->MF_dataWidget->item(mifare->cardType.blks[Mifare::data_b2s(item->row())], 0)->setCheckState(Qt::Checked);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->MF_dataWidget->item(mifare->cardType.blks[item->row() / 4], 0)->setCheckState(Qt::PartiallyChecked);
|
ui->MF_dataWidget->item(mifare->cardType.blks[Mifare::data_b2s(item->row())], 0)->setCheckState(Qt::PartiallyChecked);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(item->column() == 2)
|
else if(item->column() == 2)
|
||||||
@ -502,21 +502,27 @@ void MainWindow::on_MF_RW_readSelectedButton_clicked()
|
|||||||
void MainWindow::on_MF_RW_readBlockButton_clicked()
|
void MainWindow::on_MF_RW_readBlockButton_clicked()
|
||||||
{
|
{
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->read();
|
mifare->readOne();
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_RW_writeBlockButton_clicked()
|
void MainWindow::on_MF_RW_writeBlockButton_clicked()
|
||||||
{
|
{
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->write();
|
mifare->writeOne();
|
||||||
setState(true);
|
setState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_MF_RW_writeAllButton_clicked()
|
void MainWindow::on_MF_RW_writeSelectedButton_clicked()
|
||||||
{
|
{
|
||||||
setState(false);
|
setState(false);
|
||||||
mifare->writeAll();
|
QList<int> selectedBlocks;
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ private slots:
|
|||||||
|
|
||||||
void on_MF_Attack_infoButton_clicked();
|
void on_MF_Attack_infoButton_clicked();
|
||||||
|
|
||||||
void on_MF_RW_writeAllButton_clicked();
|
void on_MF_RW_writeSelectedButton_clicked();
|
||||||
|
|
||||||
|
|
||||||
void on_MF_RW_dumpButton_clicked();
|
void on_MF_RW_dumpButton_clicked();
|
||||||
|
@ -638,7 +638,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QPushButton" name="MF_RW_writeAllButton">
|
<widget class="QPushButton" name="MF_RW_writeSelectedButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Write Selected</string>
|
<string>Write Selected</string>
|
||||||
</property>
|
</property>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user