mirror of
				https://github.com/wh201906/Proxmark3GUI.git
				synced 2025-11-04 08:13:22 +08:00 
			
		
		
		
	Support editing data and key manually
This commit is contained in:
		
							parent
							
								
									c74cdee924
								
							
						
					
					
						commit
						383eaff2a5
					
				@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -6,14 +6,14 @@
 | 
			
		||||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
    <y>0</y>
 | 
			
		||||
    <width>820</width>
 | 
			
		||||
    <width>859</width>
 | 
			
		||||
    <height>770</height>
 | 
			
		||||
   </rect>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="minimumSize">
 | 
			
		||||
   <size>
 | 
			
		||||
    <width>800</width>
 | 
			
		||||
    <height>550</height>
 | 
			
		||||
    <width>820</width>
 | 
			
		||||
    <height>770</height>
 | 
			
		||||
   </size>
 | 
			
		||||
  </property>
 | 
			
		||||
  <property name="windowTitle">
 | 
			
		||||
@ -42,7 +42,7 @@
 | 
			
		||||
      <item>
 | 
			
		||||
       <widget class="QLineEdit" name="PM3_pathEdit">
 | 
			
		||||
        <property name="text">
 | 
			
		||||
         <string notr="true">E:\Documents\source\qt\pm3\win64\proxmark3</string>
 | 
			
		||||
         <string notr="true">../pm3/win64/proxmark3</string>
 | 
			
		||||
        </property>
 | 
			
		||||
       </widget>
 | 
			
		||||
      </item>
 | 
			
		||||
@ -322,6 +322,19 @@
 | 
			
		||||
               </property>
 | 
			
		||||
              </widget>
 | 
			
		||||
             </item>
 | 
			
		||||
             <item>
 | 
			
		||||
              <widget class="QPushButton" name="MF_File_clearButton">
 | 
			
		||||
               <property name="minimumSize">
 | 
			
		||||
                <size>
 | 
			
		||||
                 <width>40</width>
 | 
			
		||||
                 <height>0</height>
 | 
			
		||||
                </size>
 | 
			
		||||
               </property>
 | 
			
		||||
               <property name="text">
 | 
			
		||||
                <string>Clear</string>
 | 
			
		||||
               </property>
 | 
			
		||||
              </widget>
 | 
			
		||||
             </item>
 | 
			
		||||
             <item>
 | 
			
		||||
              <widget class="QRadioButton" name="MF_File_dataBox">
 | 
			
		||||
               <property name="text">
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user