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 @@
-
+
-
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -352,7 +382,7 @@ It could make the whole sector blocked irreversibly!
-
+
@@ -411,11 +441,6 @@ It could make the whole sector blocked irreversibly!
-
-
-
-
-
@@ -556,6 +581,11 @@ It could make the whole sector blocked irreversibly!
+
+
+
+
+
@@ -739,7 +769,7 @@ or "-p <port> -f"
-
+
@@ -934,54 +964,54 @@ or "-p <port> -f"
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -989,56 +1019,56 @@ or "-p <port> -f"
Mifare
-
+
-
-
-
+
+
-
-
-
+
+
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
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 @@
模拟
-
+
-
+
4或7字节的UID,如果不指定,则使用模拟器内存中的4字节UID
-
+
+
+
+
+
+
+
+ 指定ATQA(2个字节)
+
+
+
+
+
+
+
+
+
+ 指定SAK(1个字节)
+
+
+
-
+
在读卡器读取<n>个块后自动退出模拟,n为0或不指定时永远不退出
-
+
-
+
交互模式,勾选后PM3客户端将在模拟完成或者模拟中断后才可继续使用
-
+
-
+
破解,对读卡器进行攻击,通过nr/ar攻击来钓出密码(无卡嗅探)
-
+
-
-
- 在获得密码后自动将密码写入模拟器内存(自动勾选x和i)
+
+
+ 在获得密码后自动将密码写入模拟器内存(自动勾选x(--crack)和i)
-
+
+
+
+
+
+
+
+ 更多输出内容
+
+
+
-
+
从<filename.txt>当中获取用于破解读卡器的UID(批量模拟)(自动勾选x和i)
-
+
-
+
生成随机nonce而不是顺序的nonce,这种情况下PM3将不对读卡器进行标准攻击,只进行moebius攻击
@@ -356,7 +386,7 @@ It could make the whole sector blocked irreversibly!
-
+
数据
@@ -415,11 +445,6 @@ It could make the whole sector blocked irreversibly!
密钥类型:
-
-
-
- 嗅探(Snoop)
-
@@ -560,6 +585,11 @@ It could make the whole sector blocked irreversibly!
嗅探
+
+
+
+ 嗅探(14a)
+
@@ -747,7 +777,7 @@ or "-p <port> -f"
-
+
未连接
@@ -942,54 +972,54 @@ or "-p <port> -f"
Trace文件(*.trc)
-
-
+
+
空闲
-
+
停止
-
-
+
+
扇区
-
+
块
-
+
密钥A
-
+
密钥B
-
+
固件版本:
-
+
连接状态:
-
+
运行状态:
-
+
正在运行
@@ -997,34 +1027,34 @@ or "-p <port> -f"
Mifare
-
+
成功!
-
-
-
+
+
-
-
-
+
+
+
+
信息
-
+
请至少提供一个已知密码
-
-
+
+
失败!
-
+
@@ -1033,22 +1063,22 @@ Continue to write?
确定要写入吗?
-
+
成功!
-
+
写入以下块失败:
-
+
选中这些块?
-
+
读卡失败。
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