mirror of
https://github.com/wh201906/Proxmark3GUI.git
synced 2025-03-14 18:44:41 +08:00
Support hardnested(), darkside(), readblk(),
readsec() in latest Iceman repo
This commit is contained in:
parent
6baa09221e
commit
24a6e1869b
@ -1,11 +1,12 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
Util::ClientType Util::clientType = CLIENTTYPE_OFFICIAL;
|
||||||
|
|
||||||
Util::Util(QObject *parent) : QObject(parent)
|
Util::Util(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
isRequiringOutput = false;
|
isRequiringOutput = false;
|
||||||
requiredOutput = new QString();
|
requiredOutput = new QString();
|
||||||
timeStamp = QTime::currentTime();
|
timeStamp = QTime::currentTime();
|
||||||
this->clientType = CLIENTTYPE_OFFICIAL;
|
|
||||||
qRegisterMetaType<Util::ClientType>("Util::ClientType");
|
qRegisterMetaType<Util::ClientType>("Util::ClientType");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,14 +80,15 @@ void Util::delay(unsigned int msec)
|
|||||||
while(QTime::currentTime() < timer)
|
while(QTime::currentTime() < timer)
|
||||||
QApplication::processEvents(QEventLoop::AllEvents, 100);
|
QApplication::processEvents(QEventLoop::AllEvents, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
Util::ClientType Util::getClientType()
|
Util::ClientType Util::getClientType()
|
||||||
{
|
{
|
||||||
return this->clientType;
|
return Util::clientType;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Util::setClientType(Util::ClientType clientType)
|
void Util::setClientType(Util::ClientType clientType)
|
||||||
{
|
{
|
||||||
this->clientType = clientType;
|
Util::clientType = clientType;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Util::setRunningState(bool st)
|
void Util::setRunningState(bool st)
|
||||||
|
@ -52,12 +52,12 @@ public:
|
|||||||
void execCMD(const QString& cmd);
|
void execCMD(const QString& cmd);
|
||||||
QString execCMDWithOutput(const QString& cmd, ReturnTrigger trigger = 10000);
|
QString execCMDWithOutput(const QString& cmd, ReturnTrigger trigger = 10000);
|
||||||
void delay(unsigned int msec);
|
void delay(unsigned int msec);
|
||||||
ClientType getClientType();
|
static ClientType getClientType();
|
||||||
static const int rawTabIndex = 1;
|
static const int rawTabIndex = 1;
|
||||||
static bool chooseLanguage(QSettings *guiSettings, QMainWindow *window);
|
static bool chooseLanguage(QSettings *guiSettings, QMainWindow *window);
|
||||||
public slots:
|
public slots:
|
||||||
void processOutput(const QString& output);
|
void processOutput(const QString& output);
|
||||||
void setClientType(Util::ClientType clientType);
|
static void setClientType(Util::ClientType clientType);
|
||||||
void setRunningState(bool st);
|
void setRunningState(bool st);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -65,7 +65,7 @@ private:
|
|||||||
bool isRunning;
|
bool isRunning;
|
||||||
QString* requiredOutput;
|
QString* requiredOutput;
|
||||||
QTime timeStamp;
|
QTime timeStamp;
|
||||||
ClientType clientType;
|
static ClientType clientType;
|
||||||
signals:
|
signals:
|
||||||
void refreshOutput(const QString& output);
|
void refreshOutput(const QString& output);
|
||||||
void write(QString data); // connected to PM3Process::write(QString data);
|
void write(QString data); // connected to PM3Process::write(QString data);
|
||||||
|
@ -989,56 +989,56 @@ or "-p <port> -f"</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>Mifare</name>
|
<name>Mifare</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="613"/>
|
<location filename="../module/mifare.cpp" line="617"/>
|
||||||
<source>Success!</source>
|
<source>Success!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="225"/>
|
<location filename="../module/mifare.cpp" line="229"/>
|
||||||
<location filename="../module/mifare.cpp" line="613"/>
|
|
||||||
<location filename="../module/mifare.cpp" line="617"/>
|
<location filename="../module/mifare.cpp" line="617"/>
|
||||||
<location filename="../module/mifare.cpp" line="641"/>
|
<location filename="../module/mifare.cpp" line="621"/>
|
||||||
<location filename="../module/mifare.cpp" line="680"/>
|
<location filename="../module/mifare.cpp" line="645"/>
|
||||||
<location filename="../module/mifare.cpp" line="693"/>
|
<location filename="../module/mifare.cpp" line="684"/>
|
||||||
<location filename="../module/mifare.cpp" line="739"/>
|
<location filename="../module/mifare.cpp" line="697"/>
|
||||||
|
<location filename="../module/mifare.cpp" line="743"/>
|
||||||
<source>Info</source>
|
<source>Info</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="225"/>
|
<location filename="../module/mifare.cpp" line="229"/>
|
||||||
<source>Plz provide at least one known key</source>
|
<source>Plz provide at least one known key</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="464"/>
|
<location filename="../module/mifare.cpp" line="468"/>
|
||||||
<location filename="../module/mifare.cpp" line="617"/>
|
<location filename="../module/mifare.cpp" line="621"/>
|
||||||
<source>Failed!</source>
|
<source>Failed!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="642"/>
|
<location filename="../module/mifare.cpp" line="646"/>
|
||||||
<source>The Access Bits is invalid!
|
<source>The Access Bits is invalid!
|
||||||
It could make the whole sector blocked irreversibly!
|
It could make the whole sector blocked irreversibly!
|
||||||
Continue to write?</source>
|
Continue to write?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="680"/>
|
<location filename="../module/mifare.cpp" line="684"/>
|
||||||
<source>Successful!</source>
|
<source>Successful!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="693"/>
|
<location filename="../module/mifare.cpp" line="697"/>
|
||||||
<source>Failed to write to these blocks:</source>
|
<source>Failed to write to these blocks:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="697"/>
|
<location filename="../module/mifare.cpp" line="701"/>
|
||||||
<source>Select them?</source>
|
<source>Select them?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="739"/>
|
<location filename="../module/mifare.cpp" line="743"/>
|
||||||
<source>Failed to read card.</source>
|
<source>Failed to read card.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -532,13 +532,13 @@ It could make the whole sector blocked irreversibly!</source>
|
|||||||
<location filename="../ui/mainwindow.ui" line="757"/>
|
<location filename="../ui/mainwindow.ui" line="757"/>
|
||||||
<location filename="../ui/mainwindow.ui" line="891"/>
|
<location filename="../ui/mainwindow.ui" line="891"/>
|
||||||
<source>Read One</source>
|
<source>Read One</source>
|
||||||
<translation>读取单个区</translation>
|
<translation>读取单个块</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/mainwindow.ui" line="770"/>
|
<location filename="../ui/mainwindow.ui" line="770"/>
|
||||||
<location filename="../ui/mainwindow.ui" line="904"/>
|
<location filename="../ui/mainwindow.ui" line="904"/>
|
||||||
<source>Write One</source>
|
<source>Write One</source>
|
||||||
<translation>写入单个区</translation>
|
<translation>写入单个块</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/mainwindow.ui" line="783"/>
|
<location filename="../ui/mainwindow.ui" line="783"/>
|
||||||
@ -997,34 +997,34 @@ or "-p <port> -f"</source>
|
|||||||
<context>
|
<context>
|
||||||
<name>Mifare</name>
|
<name>Mifare</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="613"/>
|
<location filename="../module/mifare.cpp" line="617"/>
|
||||||
<source>Success!</source>
|
<source>Success!</source>
|
||||||
<translation>成功!</translation>
|
<translation>成功!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="225"/>
|
<location filename="../module/mifare.cpp" line="229"/>
|
||||||
<location filename="../module/mifare.cpp" line="613"/>
|
|
||||||
<location filename="../module/mifare.cpp" line="617"/>
|
<location filename="../module/mifare.cpp" line="617"/>
|
||||||
<location filename="../module/mifare.cpp" line="641"/>
|
<location filename="../module/mifare.cpp" line="621"/>
|
||||||
<location filename="../module/mifare.cpp" line="680"/>
|
<location filename="../module/mifare.cpp" line="645"/>
|
||||||
<location filename="../module/mifare.cpp" line="693"/>
|
<location filename="../module/mifare.cpp" line="684"/>
|
||||||
<location filename="../module/mifare.cpp" line="739"/>
|
<location filename="../module/mifare.cpp" line="697"/>
|
||||||
|
<location filename="../module/mifare.cpp" line="743"/>
|
||||||
<source>Info</source>
|
<source>Info</source>
|
||||||
<translation>信息</translation>
|
<translation>信息</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="225"/>
|
<location filename="../module/mifare.cpp" line="229"/>
|
||||||
<source>Plz provide at least one known key</source>
|
<source>Plz provide at least one known key</source>
|
||||||
<translation>请至少提供一个已知密码</translation>
|
<translation>请至少提供一个已知密码</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="464"/>
|
<location filename="../module/mifare.cpp" line="468"/>
|
||||||
<location filename="../module/mifare.cpp" line="617"/>
|
<location filename="../module/mifare.cpp" line="621"/>
|
||||||
<source>Failed!</source>
|
<source>Failed!</source>
|
||||||
<translation>失败!</translation>
|
<translation>失败!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="642"/>
|
<location filename="../module/mifare.cpp" line="646"/>
|
||||||
<source>The Access Bits is invalid!
|
<source>The Access Bits is invalid!
|
||||||
It could make the whole sector blocked irreversibly!
|
It could make the whole sector blocked irreversibly!
|
||||||
Continue to write?</source>
|
Continue to write?</source>
|
||||||
@ -1033,22 +1033,22 @@ Continue to write?</source>
|
|||||||
确定要写入吗?</translation>
|
确定要写入吗?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="680"/>
|
<location filename="../module/mifare.cpp" line="684"/>
|
||||||
<source>Successful!</source>
|
<source>Successful!</source>
|
||||||
<translation>成功!</translation>
|
<translation>成功!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="693"/>
|
<location filename="../module/mifare.cpp" line="697"/>
|
||||||
<source>Failed to write to these blocks:</source>
|
<source>Failed to write to these blocks:</source>
|
||||||
<translation>写入以下块失败:</translation>
|
<translation>写入以下块失败:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="697"/>
|
<location filename="../module/mifare.cpp" line="701"/>
|
||||||
<source>Select them?</source>
|
<source>Select them?</source>
|
||||||
<translation>选中这些块?</translation>
|
<translation>选中这些块?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../module/mifare.cpp" line="739"/>
|
<location filename="../module/mifare.cpp" line="743"/>
|
||||||
<source>Failed to read card.</source>
|
<source>Failed to read card.</source>
|
||||||
<translation>读卡失败。</translation>
|
<translation>读卡失败。</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -298,6 +298,7 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe
|
|||||||
{
|
{
|
||||||
QString data;
|
QString data;
|
||||||
QString result;
|
QString result;
|
||||||
|
QRegularExpressionMatch currMatch;
|
||||||
bool isTrailerBlock = (blockId < 128 && ((blockId + 1) % 4 == 0)) || ((blockId + 1) % 16 == 0);
|
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)
|
||||||
@ -317,9 +318,10 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe
|
|||||||
+ " "
|
+ " "
|
||||||
+ key,
|
+ key,
|
||||||
waitTime);
|
waitTime);
|
||||||
if(result.indexOf("isOk:01") != -1)
|
currMatch = dataPattern->match(result);
|
||||||
|
if(currMatch.hasMatch())
|
||||||
{
|
{
|
||||||
data = dataPattern->match(result).captured().toUpper();
|
data = currMatch.captured().toUpper();
|
||||||
data.remove(" ");
|
data.remove(" ");
|
||||||
// when the target block is a key block and the given key type is KeyA, try to check whether the KeyB is valid(by Access Bits)
|
// when the target block is a key block and the given key type is KeyA, try to check whether the KeyB is valid(by Access Bits)
|
||||||
// if the given key type is KeyB, it will never get the KeyA from the key block
|
// if the given key type is KeyB, it will never get the KeyA from the key block
|
||||||
@ -347,15 +349,19 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe
|
|||||||
"hf mf cgetblk "
|
"hf mf cgetblk "
|
||||||
+ QString::number(blockId),
|
+ QString::number(blockId),
|
||||||
waitTime);
|
waitTime);
|
||||||
if(result.indexOf("Chinese magic") != -1)
|
currMatch = dataPattern->match(result);
|
||||||
|
if(currMatch.hasMatch())
|
||||||
{
|
{
|
||||||
data = dataPattern->match(result).captured().toUpper();
|
data = currMatch.captured().toUpper();
|
||||||
data.remove(" ");
|
data.remove(" ");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
data = "";
|
data = "";
|
||||||
}
|
}
|
||||||
else if(targetType == TARGET_EMULATOR)
|
}
|
||||||
|
if(util->getClientType() == Util::CLIENTTYPE_OFFICIAL)
|
||||||
|
{
|
||||||
|
if(targetType == TARGET_EMULATOR)
|
||||||
{
|
{
|
||||||
result = util->execCMDWithOutput(
|
result = util->execCMDWithOutput(
|
||||||
"hf mf eget "
|
"hf mf eget "
|
||||||
@ -365,6 +371,18 @@ QString Mifare::_readblk(int blockId, KeyType keyType, const QString& key, Targe
|
|||||||
data.remove(" ");
|
data.remove(" ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(util->getClientType() == Util::CLIENTTYPE_ICEMAN)
|
||||||
|
{
|
||||||
|
if(targetType == TARGET_EMULATOR)
|
||||||
|
{
|
||||||
|
result = util->execCMDWithOutput(
|
||||||
|
"hf mf egetblk "
|
||||||
|
+ QString::number(blockId),
|
||||||
|
150);
|
||||||
|
data = dataPattern->match(result).captured().toUpper();
|
||||||
|
data.remove(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,7 +391,7 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key,
|
|||||||
QStringList data;
|
QStringList data;
|
||||||
QString result, tmp;
|
QString result, tmp;
|
||||||
QRegularExpressionMatch reMatch;
|
QRegularExpressionMatch reMatch;
|
||||||
int offset = -1;
|
int offset = -1; // for targetType == TARGET_EMULATOR
|
||||||
|
|
||||||
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
||||||
{
|
{
|
||||||
@ -397,7 +415,7 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key,
|
|||||||
+ " "
|
+ " "
|
||||||
+ key,
|
+ key,
|
||||||
waitTime);
|
waitTime);
|
||||||
offset = result.indexOf("isOk:01");
|
offset = result.indexOf("isOk:01"); // find successful flag
|
||||||
}
|
}
|
||||||
else if(targetType == TARGET_UID)
|
else if(targetType == TARGET_UID)
|
||||||
{
|
{
|
||||||
@ -405,7 +423,7 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key,
|
|||||||
"hf mf cgetsc "
|
"hf mf cgetsc "
|
||||||
+ QString::number(sectorId),
|
+ QString::number(sectorId),
|
||||||
waitTime);
|
waitTime);
|
||||||
offset = result.indexOf("Chinese magic");
|
offset = result.indexOf("error") == -1 ? 0 : -1; // find failed flag
|
||||||
}
|
}
|
||||||
if(offset != -1)
|
if(offset != -1)
|
||||||
{
|
{
|
||||||
@ -424,7 +442,7 @@ QStringList Mifare::_readsec(int sectorId, KeyType keyType, const QString& key,
|
|||||||
}
|
}
|
||||||
// if failed, try to read them seperately.
|
// if failed, try to read them seperately.
|
||||||
// (when one of the block cannot be read, the rdsc will return nothing, so you need to read the rest of blocks manually)
|
// (when one of the block cannot be read, the rdsc will return nothing, so you need to read the rest of blocks manually)
|
||||||
else if(targetType != TARGET_UID) // if the targetType is Chinese Magic Card, then the result implies the backdoor command is invalid.
|
else if(targetType == TARGET_UID || targetType == TARGET_EMULATOR) // if the targetType is Chinese Magic Card, then the result implies the backdoor command is invalid.
|
||||||
{
|
{
|
||||||
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
for(int i = 0; i < cardType.blk[sectorId]; i++)
|
||||||
data[i] = _readblk(cardType.blks[sectorId] + i, keyType, key, targetType, waitTime);
|
data[i] = _readblk(cardType.blks[sectorId] + i, keyType, key, targetType, waitTime);
|
||||||
|
@ -21,14 +21,26 @@ MF_Attack_hardnestedDialog::~MF_Attack_hardnestedDialog()
|
|||||||
|
|
||||||
void MF_Attack_hardnestedDialog::on_buttonBox_accepted()
|
void MF_Attack_hardnestedDialog::on_buttonBox_accepted()
|
||||||
{
|
{
|
||||||
emit sendCMD("hf mf hardnested "
|
if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL)
|
||||||
+ ui->knownKeySectorBox->currentText()
|
emit sendCMD("hf mf hardnested "
|
||||||
+ " "
|
+ ui->knownKeySectorBox->currentText()
|
||||||
+ ui->knownKeyTypeBox->currentText()
|
+ " "
|
||||||
+ " "
|
+ ui->knownKeyTypeBox->currentText()
|
||||||
+ ui->knownKeyBox->text()
|
+ " "
|
||||||
+ " "
|
+ ui->knownKeyBox->text()
|
||||||
+ ui->targetKeySectorBox->currentText()
|
+ " "
|
||||||
+ " "
|
+ ui->targetKeySectorBox->currentText()
|
||||||
+ ui->targetKeyTypeBox->currentText());
|
+ " "
|
||||||
|
+ ui->targetKeyTypeBox->currentText());
|
||||||
|
else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN) // same format in v4.9237
|
||||||
|
emit sendCMD("hf mf hardnested "
|
||||||
|
+ ui->knownKeySectorBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->knownKeyTypeBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->knownKeyBox->text()
|
||||||
|
+ " "
|
||||||
|
+ ui->targetKeySectorBox->currentText()
|
||||||
|
+ " "
|
||||||
|
+ ui->targetKeyTypeBox->currentText());
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define MF_ATTACK_HARDNESTEDDIALOG_H
|
#define MF_ATTACK_HARDNESTEDDIALOG_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include "common/util.h"
|
||||||
|
|
||||||
namespace Ui
|
namespace Ui
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user