diff --git a/.gitignore b/.gitignore index 1358d83..fb50266 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ *.so.* *_pch.h.cpp *_resource.rc -*.qm .#* *.*# core diff --git a/lang/en_US.qm b/lang/en_US.qm new file mode 100644 index 0000000..9dad8df Binary files /dev/null and b/lang/en_US.qm differ diff --git a/lang/en_US.ts b/lang/en_US.ts index 0df4a6c..f73b0da 100644 --- a/lang/en_US.ts +++ b/lang/en_US.ts @@ -45,72 +45,102 @@ - + u - + UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used - - n + + --atqa - - Automatically exit simulation after <numreads> blocks have been read by reader. 0 = infinite + + Provide explicit ATQA (2 bytes) - - i - - - - - Interactive, means that console will not be returned until simulation finishes or is aborted - - - - - x - - - - - Crack, performs the 'reader attack', nr/ar attack against a legitimate reader, fishes out the key(s) - - - - - e - - - - - set keys found from 'reader attack' to emulator memory (implies x and i) + + --sak - f + n + Automatically exit simulation after <numreads> blocks have been read by reader. 0 = infinite + + + + + i + + + + + Interactive, means that console will not be returned until simulation finishes or is aborted + + + + + x + + + + + Crack, performs the 'reader attack', nr/ar attack against a legitimate reader, fishes out the key(s) + + + + + e + + + + + set keys found from 'reader attack' to emulator memory (implies x(--crack) and i) + + + + + -v + + + + + verbose output + + + + + f + + + + + Provide explicit SAK (1 byte) + + + + get UIDs to use for 'reader attack' from file 'f <filename.txt>' (implies x and i) - + r - + Generate random nonces instead of sequential nonces. Standard reader attack won't work with this option, only moebius attack works @@ -352,7 +382,7 @@ It could make the whole sector blocked irreversibly! - + Data @@ -411,11 +441,6 @@ It could make the whole sector blocked irreversibly! Key Type: - - - Snoop - - List Data @@ -556,6 +581,11 @@ It could make the whole sector blocked irreversibly! Sniff + + + Sniff(14a) + + LF/Data @@ -739,7 +769,7 @@ or "-p <port> -f" - + Not Connected @@ -934,54 +964,54 @@ or "-p <port> -f" - - + + Idle - + Stop - - + + Sec - + Blk - + KeyA - + KeyB - + HW Version: - + PM3: - + State: - + Running @@ -989,56 +1019,56 @@ or "-p <port> -f" Mifare - + Success! - - - + + - - - + + + + Info - + Plz provide at least one known key - - + + Failed! - + The Access Bits is invalid! It could make the whole sector blocked irreversibly! Continue to write? - + Successful! - + Failed to write to these blocks: - + Select them? - + Failed to read card. diff --git a/lang/zh_CN.qm b/lang/zh_CN.qm new file mode 100644 index 0000000..3edc62a Binary files /dev/null and b/lang/zh_CN.qm differ diff --git a/lang/zh_CN.ts b/lang/zh_CN.ts index 3ff7b4f..3efde9e 100644 --- a/lang/zh_CN.ts +++ b/lang/zh_CN.ts @@ -45,72 +45,102 @@ 模拟 - + u - + UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used 4或7字节的UID,如果不指定,则使用模拟器内存中的4字节UID - + + --atqa + + + + + Provide explicit ATQA (2 bytes) + 指定ATQA(2个字节) + + + + --sak + + + + + Provide explicit SAK (1 byte) + 指定SAK(1个字节) + + + n - + Automatically exit simulation after <numreads> blocks have been read by reader. 0 = infinite 在读卡器读取<n>个块后自动退出模拟,n为0或不指定时永远不退出 - + i - + Interactive, means that console will not be returned until simulation finishes or is aborted 交互模式,勾选后PM3客户端将在模拟完成或者模拟中断后才可继续使用 - + x - + Crack, performs the 'reader attack', nr/ar attack against a legitimate reader, fishes out the key(s) 破解,对读卡器进行攻击,通过nr/ar攻击来钓出密码(无卡嗅探) - + e - - set keys found from 'reader attack' to emulator memory (implies x and i) - 在获得密码后自动将密码写入模拟器内存(自动勾选x和i) + + set keys found from 'reader attack' to emulator memory (implies x(--crack) and i) + 在获得密码后自动将密码写入模拟器内存(自动勾选x(--crack)和i) - + + -v + + + + + verbose output + 更多输出内容 + + + f - + get UIDs to use for 'reader attack' from file 'f <filename.txt>' (implies x and i) 从<filename.txt>当中获取用于破解读卡器的UID(批量模拟)(自动勾选x和i) - + r - + Generate random nonces instead of sequential nonces. Standard reader attack won't work with this option, only moebius attack works 生成随机nonce而不是顺序的nonce,这种情况下PM3将不对读卡器进行标准攻击,只进行moebius攻击 @@ -356,7 +386,7 @@ It could make the whole sector blocked irreversibly! - + Data 数据 @@ -415,11 +445,6 @@ It could make the whole sector blocked irreversibly! Key Type: 密钥类型: - - - Snoop - 嗅探(Snoop) - List Data @@ -560,6 +585,11 @@ It could make the whole sector blocked irreversibly! Sniff 嗅探 + + + Sniff(14a) + 嗅探(14a) + LF/Data @@ -747,7 +777,7 @@ or "-p <port> -f" - + Not Connected 未连接 @@ -942,54 +972,54 @@ or "-p <port> -f" Trace文件(*.trc) - - + + Idle 空闲 - + Stop 停止 - - + + Sec 扇区 - + Blk - + KeyA 密钥A - + KeyB 密钥B - + HW Version: 固件版本: - + PM3: 连接状态: - + State: 运行状态: - + Running 正在运行 @@ -997,34 +1027,34 @@ or "-p <port> -f" Mifare - + Success! 成功! - - - + + - - - + + + + Info 信息 - + Plz provide at least one known key 请至少提供一个已知密码 - - + + Failed! 失败! - + The Access Bits is invalid! It could make the whole sector blocked irreversibly! Continue to write? @@ -1033,22 +1063,22 @@ Continue to write? 确定要写入吗? - + Successful! 成功! - + Failed to write to these blocks: 写入以下块失败: - + Select them? 选中这些块? - + Failed to read card. 读卡失败。 diff --git a/module/mifare.cpp b/module/mifare.cpp index 5cb6f38..064a9ae 100644 --- a/module/mifare.cpp +++ b/module/mifare.cpp @@ -89,7 +89,7 @@ Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QWidget *parent): QObject(parent) QString Mifare::info(bool isRequiringOutput) { - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { if(isRequiringOutput) { @@ -120,7 +120,7 @@ void Mifare::chk() QString result; int offset = 0; QString data; - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) { result = util->execCMDWithOutput( "hf mf chk *" @@ -148,7 +148,7 @@ void Mifare::chk() } } } - else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { result = util->execCMDWithOutput( "hf mf chk --" @@ -185,7 +185,7 @@ void Mifare::nested() QString result; int offset = 0; QString data; - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) { result = util->execCMDWithOutput( "hf mf nested " @@ -193,7 +193,7 @@ void Mifare::nested() + " *", Util::ReturnTrigger(15000, {"Can't found", "\\|000\\|"})); } - else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { QString knownKeyInfo = ""; for(int i = 0; i < cardType.sector_size; i++) @@ -262,34 +262,41 @@ void Mifare::hardnested() void Mifare::darkside() { - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) - { + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) util->execCMD("hf mf mifare"); - ui->funcTab->setCurrentIndex(Util::rawTabIndex); - } - else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) - { + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) util->execCMD("hf mf darkside"); - ui->funcTab->setCurrentIndex(Util::rawTabIndex); - } + ui->funcTab->setCurrentIndex(Util::rawTabIndex); } void Mifare::sniff() { - util->execCMD("hf mf sniff"); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + util->execCMD("hf mf sniff"); + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("hf sniff"); + ui->funcTab->setCurrentIndex(Util::rawTabIndex); } -void Mifare::snoop() +void Mifare::sniff14a() { - util->execCMD("hf 14a snoop"); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + util->execCMD("hf 14a snoop"); + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("hf 14a sniff"); + ui->funcTab->setCurrentIndex(Util::rawTabIndex); } void Mifare::list() { - util->execCMD("hf list mf"); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + util->execCMD("hf list mf"); + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("trace list -t mf"); + ui->funcTab->setCurrentIndex(Util::rawTabIndex); } @@ -300,7 +307,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe QRegularExpressionMatch currMatch; bool isTrailerBlock = (blockId < 128 && ((blockId + 1) % 4 == 0)) || ((blockId + 1) % 16 == 0); - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { if(targetType == TARGET_MIFARE) { @@ -358,7 +365,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe data = ""; } } - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) { if(targetType == TARGET_EMULATOR) { @@ -370,7 +377,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe data.remove(" "); } } - else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { if(targetType == TARGET_EMULATOR) { @@ -397,7 +404,7 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key, data.append(""); } - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { // try to read all blocks together if(targetType == TARGET_MIFARE) @@ -583,7 +590,7 @@ bool Mifare::_writeblk(int blockId, KeyType keyType, const QString& key, const Q if(data_isDataValid(input) != DATA_NOSPACE) return false; - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL || util->getClientType() == Util::CLIENTTYPE_ICEMAN) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { if(targetType == TARGET_MIFARE) { @@ -734,26 +741,28 @@ void Mifare::writeSelected(TargetType targetType) void Mifare::dump() { - util->execCMD("hf mf dump"); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("hf mf dump"); ui->funcTab->setCurrentIndex(Util::rawTabIndex); } void Mifare::restore() { - util->execCMD("hf mf restore"); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("hf mf restore"); ui->funcTab->setCurrentIndex(Util::rawTabIndex); } void Mifare::wipeC() { - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) { util->execCMD( "hf mf cwipe " + QString::number(cardType.type) + " f"); } - else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { util->execCMD("hf mf cwipe"); } @@ -784,7 +793,7 @@ void Mifare::setParameterC() void Mifare::lockC() { - if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL) + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) { util->execCMD("hf 14a raw -pa -b7 40"); util->execCMD("hf 14a raw -pa 43"); @@ -793,7 +802,7 @@ void Mifare::lockC() util->execCMD("hf 14a raw -pa 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 18 47"); util->execCMD("hf 14a raw -a 52"); } - else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN) + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) { util->execCMD("hf 14a raw -ak -b 7 40"); util->execCMD("hf 14a raw -ak 43"); @@ -806,12 +815,13 @@ void Mifare::lockC() void Mifare::wipeE() { - util->execCMD("hf mf eclr"); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL || Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("hf mf eclr"); } void Mifare::simulate() { - MF_Sim_simDialog dialog(cardType.type); + MF_Sim_simDialog dialog(cardType.type, cardType.typeText); connect(&dialog, &MF_Sim_simDialog::sendCMD, util, &Util::execCMD); if(dialog.exec() == QDialog::Accepted) ui->funcTab->setCurrentIndex(Util::rawTabIndex); @@ -819,13 +829,24 @@ void Mifare::simulate() void Mifare::loadSniff(const QString& file) { - util->execCMD("hf list mf -l " + file); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + util->execCMD("hf list mf -l " + file); + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + { + if(util->execCMDWithOutput("trace load -f " + file, Util::ReturnTrigger({"loaded"})) != "") + util->execCMD("trace list -t mf"); + } + ui->funcTab->setCurrentIndex(Util::rawTabIndex); } void Mifare::saveSniff(const QString& file) { - util->execCMD("hf list mf -s " + file); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + util->execCMD("hf list mf -s " + file); + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + util->execCMD("trace save -f " + file); + ui->funcTab->setCurrentIndex(Util::rawTabIndex); } diff --git a/module/mifare.h b/module/mifare.h index 869d992..b50ff33 100644 --- a/module/mifare.h +++ b/module/mifare.h @@ -70,7 +70,7 @@ public: void darkside(); void hardnested(); void sniff(); - void snoop(); + void sniff14a(); void list(); void readOne(TargetType targetType = TARGET_MIFARE); void readSelected(TargetType targetType = TARGET_MIFARE); diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index 297520e..673acdc 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -836,10 +836,10 @@ void MainWindow::on_MF_Sniff_sniffButton_clicked() setState(true); } -void MainWindow::on_MF_Sniff_snoopButton_clicked() +void MainWindow::on_MF_14aSniff_snoopButton_clicked() { setState(false); - mifare->snoop(); + mifare->sniff14a(); setState(true); } @@ -852,6 +852,7 @@ void MainWindow::MF_widgetReset() { int secs = mifare->cardType.sector_size; int blks = mifare->cardType.block_size; + QBrush trailerItemForeColor = QBrush(QColor(0, 160, 255)); ui->MF_RW_blockBox->clear(); ui->MF_keyWidget->setRowCount(secs); ui->MF_dataWidget->setRowCount(blks); @@ -876,8 +877,10 @@ void MainWindow::MF_widgetReset() setTableItem(ui->MF_keyWidget, i, 1, ""); setTableItem(ui->MF_keyWidget, i, 2, ""); setTableItem(ui->MF_dataWidget, mifare->cardType.blks[i], 0, QString::number(i)); + ui->MF_dataWidget->item(mifare->cardType.blks[i] + mifare->cardType.blk[i] - 1, 2)->setForeground(trailerItemForeColor); ui->MF_dataWidget->item(mifare->cardType.blks[i], 0)->setCheckState(Qt::Checked); } + ui->MF_dataWidget->item(0, 2)->setForeground(QBrush(QColor(255, 160, 0))); ui->MF_selectAllBox->setCheckState(Qt::Checked); ui->MF_selectTrailerBox->setCheckState(Qt::Checked); diff --git a/ui/mainwindow.h b/ui/mainwindow.h index 862adf2..b2747c9 100644 --- a/ui/mainwindow.h +++ b/ui/mainwindow.h @@ -149,7 +149,7 @@ private slots: void on_MF_fillKeysButton_clicked(); - void on_MF_Sniff_snoopButton_clicked(); + void on_MF_14aSniff_snoopButton_clicked(); void on_MF_trailerDecoderButton_clicked(); diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index d1fa6d4..5143dba 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -1129,7 +1129,7 @@ - + 40 @@ -1137,7 +1137,7 @@ - Snoop + Sniff(14a) diff --git a/ui/mf_sim_simdialog.cpp b/ui/mf_sim_simdialog.cpp index c0ba180..2db9c19 100644 --- a/ui/mf_sim_simdialog.cpp +++ b/ui/mf_sim_simdialog.cpp @@ -1,12 +1,34 @@ #include "mf_sim_simdialog.h" #include "ui_mf_sim_simdialog.h" -MF_Sim_simDialog::MF_Sim_simDialog(int cardType, QWidget *parent) : +MF_Sim_simDialog::MF_Sim_simDialog(int cardType, QString cardTypeText, QWidget *parent) : QDialog(parent), ui(new Ui::MF_Sim_simDialog) { ui->setupUi(this); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + { + ui->atqaGroupBox->setVisible(false); + ui->atqaLine->setVisible(false); + ui->sakGroupBox->setVisible(false); + ui->sakLine->setVisible(false); + ui->vGroupBox->setVisible(false); + ui->vLine->setVisible(false); + } + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + { + ui->fGroupBox->setVisible(false); + ui->fLine->setVisible(false); + ui->rGroupBox->setVisible(false); + ui->rLine->setVisible(false); + ui->uBox->setText("-u"); + ui->nBox->setText("-n"); + ui->iBox->setText("-i"); + ui->xBox->setText("--crack"); + ui->eBox->setText("-e"); + } this->cardType = cardType; + this->cardTypeText = cardTypeText; } MF_Sim_simDialog::~MF_Sim_simDialog() @@ -55,12 +77,27 @@ void MF_Sim_simDialog::on_fBox_clicked(bool checked) void MF_Sim_simDialog::on_buttonBox_accepted() { QString paras; - paras += (ui->uBox->isChecked() ? "u " + ui->uEdit->text() + " " : ""); - paras += (ui->nBox->isChecked() ? "n " + ui->nEdit->text() + " " : ""); - paras += (ui->iBox->isChecked() ? "i " : ""); - paras += (ui->xBox->isChecked() ? "x " : ""); - paras += (ui->eBox->isChecked() ? "e " : ""); - paras += (ui->fBox->isChecked() ? "f " + ui->fEdit->text() + " " : ""); - paras += (ui->rBox->isChecked() ? "r " : ""); - emit sendCMD(QString("hf mf sim ") + "*" + QString::number(cardType) + " " + paras.trimmed()); + if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL) + { + paras += (ui->uBox->isChecked() ? "u " + ui->uEdit->text() + " " : ""); + paras += (ui->nBox->isChecked() ? "n " + ui->nEdit->text() + " " : ""); + paras += (ui->iBox->isChecked() ? "i " : ""); + paras += (ui->xBox->isChecked() ? "x " : ""); + paras += (ui->eBox->isChecked() ? "e " : ""); + paras += (ui->fBox->isChecked() ? "f " + ui->fEdit->text() + " " : ""); + paras += (ui->rBox->isChecked() ? "r " : ""); + emit sendCMD(QString("hf mf sim ") + "*" + QString::number(cardType) + " " + paras.trimmed()); + } + else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) + { + paras += (ui->uBox->isChecked() ? "-u " + ui->uEdit->text() + " " : ""); + paras += (ui->atqaBox->isChecked() ? "--atqa " + ui->atqaEdit->text() + " " : ""); + paras += (ui->sakBox->isChecked() ? "--sak " + ui->sakEdit->text() + " " : ""); + paras += (ui->nBox->isChecked() ? "-n " + ui->nEdit->text() + " " : ""); + paras += (ui->iBox->isChecked() ? "-i " : ""); + paras += (ui->xBox->isChecked() ? "--crack " : ""); + paras += (ui->eBox->isChecked() ? "-e " : ""); + paras += (ui->vBox->isChecked() ? "-v " : ""); + emit sendCMD(QString("hf mf sim --") + cardTypeText + " " + paras.trimmed()); + } } diff --git a/ui/mf_sim_simdialog.h b/ui/mf_sim_simdialog.h index 49c9ba2..34a455b 100644 --- a/ui/mf_sim_simdialog.h +++ b/ui/mf_sim_simdialog.h @@ -3,6 +3,7 @@ #include #include +#include "common/util.h" namespace Ui { @@ -14,7 +15,7 @@ class MF_Sim_simDialog : public QDialog Q_OBJECT public: - explicit MF_Sim_simDialog(int cardType, QWidget *parent = nullptr); + explicit MF_Sim_simDialog(int cardType, QString cardTypeText, QWidget *parent = nullptr); ~MF_Sim_simDialog(); private slots: @@ -25,6 +26,7 @@ private slots: private: Ui::MF_Sim_simDialog *ui; int cardType; + QString cardTypeText; signals: void sendCMD(const QString& cmd); private slots: diff --git a/ui/mf_sim_simdialog.ui b/ui/mf_sim_simdialog.ui index 1a9c15a..2fcbf31 100644 --- a/ui/mf_sim_simdialog.ui +++ b/ui/mf_sim_simdialog.ui @@ -7,309 +7,598 @@ 0 0 461 - 456 + 524 Simulate - - 5 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - u - - - - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - - - - - - 0 - 0 - - - - UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + u + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + + + + + + 0 + 0 + + + + UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used + + + true + + + + + - + Qt::Horizontal - - - - - n - - - - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - - - - - - 0 - 0 - - - - Automatically exit simulation after <numreads> blocks have been read by reader. 0 = infinite - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + --atqa + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + + + + + + 0 + 0 + + + + Provide explicit ATQA (2 bytes) + + + true + + + + + - + Qt::Horizontal - - - - - i - - - - - - - - 0 - 0 - - - - Interactive, means that console will not be returned until simulation finishes or is aborted - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + --sak + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + + + + + + 0 + 0 + + + + Provide explicit SAK (1 byte) + + + true + + + + + - + Qt::Horizontal - - - - - x - - - - - - - - 0 - 0 - - - - Crack, performs the 'reader attack', nr/ar attack against a legitimate reader, fishes out the key(s) - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + n + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + + + + + + 0 + 0 + + + + Automatically exit simulation after <numreads> blocks have been read by reader. 0 = infinite + + + true + + + + + - + Qt::Horizontal - - - - - e - - - - - - - - 0 - 0 - - - - set keys found from 'reader attack' to emulator memory (implies x and i) - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + i + + + + + + + + 0 + 0 + + + + Interactive, means that console will not be returned until simulation finishes or is aborted + + + true + + + + + - + Qt::Horizontal - - - - - f - - - - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - - - - - - 0 - 0 - - - - get UIDs to use for 'reader attack' from file 'f <filename.txt>' (implies x and i) - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + x + + + + + + + + 0 + 0 + + + + Crack, performs the 'reader attack', nr/ar attack against a legitimate reader, fishes out the key(s) + + + true + + + + + - + Qt::Horizontal - - - - - r - - - - - - - - 0 - 0 - - - - Generate random nonces instead of sequential nonces. Standard reader attack won't work with this option, only moebius attack works - - - true - - - - + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + e + + + + + + + + 0 + 0 + + + + set keys found from 'reader attack' to emulator memory (implies x(--crack) and i) + + + true + + + + + - + + + Qt::Horizontal + + + + + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + f + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + + + + + + 0 + 0 + + + + get UIDs to use for 'reader attack' from file 'f <filename.txt>' (implies x and i) + + + true + + + + + + + + + + Qt::Horizontal + + + + + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + r + + + + + + + + 0 + 0 + + + + Generate random nonces instead of sequential nonces. Standard reader attack won't work with this option, only moebius attack works + + + true + + + + + + + + + + Qt::Horizontal + + + + + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + -v + + + + + + + + 0 + 0 + + + + verbose output + + + true + + + + + + + + Qt::Horizontal