Merge branch 'dev'

pull/33/head
wh201906 2 years ago
commit d60f636881

74
.gitignore vendored

@ -1,72 +1,2 @@
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe
/build*
/data

@ -55,12 +55,9 @@ Great thanks to him.
sudo apt-get install qt5-default libqt5serialport5 libqt5serialport5-dev
git clone https://github.com/wh201906/Proxmark3GUI.git --depth=1
cd Proxmark3GUI
mkdir build
cd build
qmake ../
make
make clean
cp -r ../lang ./
mkdir build && cd build
qmake ../src
make -j4 && make clean
cp -r ../config ./
./Proxmark3GUI
@ -73,6 +70,9 @@ Great thanks to him.
## Update Log:
### V0.2.4
+ Clone EM410x card to T55xx card
### V0.2.3
+ Fix bug [#27](https://github.com/wh201906/Proxmark3GUI/issues/27)
+ Try to support Non-ASCII path

@ -191,5 +191,15 @@
"cmd": "lf config q <divisor> b <bits per sample> d <decimation> a <averaging> t <trigger threshold> s <samples to skip>",
"divisor cmd": "hw setlfdivisor <divisor>"
}
},
"t55xx":{
"clone em410x":{
"read":"lf search",
"successful read flag":"Valid EM410x ID",
"pattern":"EM TAG ID\\s*:\\s\\K[0-9a-fA-F]{10}",
"clone cmd":"lf em 410xwrite <id> <type>",
"t5555 flag":"0",
"t55x7 flag":"1"
}
}
}

@ -199,5 +199,15 @@
"cmd": "lf config --divisor <divisor> --bps <bits per sample> --dec <decimation> --avg <averaging> --trig <trigger threshold> --skip <samples to skip>",
"divisor cmd": "hw setlfdivisor -d <divisor>"
}
},
"t55xx":{
"clone em410x":{
"read":"lf em 410x reader",
"successful read flag":"EM 410x ID",
"pattern":"EM 410x ID\\s*\\K[0-9a-fA-F]{10}",
"clone cmd":"lf em 410x clone --id <id> <type>",
"t5555 flag":"--q5",
"t55x7 flag":""
}
}
}

@ -54,12 +54,9 @@ release页面中有含客户端的GUI。这个GUI也可以搭配你自己的客
sudo apt-get install qt5-default libqt5serialport5 libqt5serialport5-dev
git clone https://github.com/wh201906/Proxmark3GUI.git --depth=1
cd Proxmark3GUI
mkdir build
cd build
qmake ../
make
make clean
cp -r ../lang ./
mkdir build && cd build
qmake ../src
make -j4 && make clean
cp -r ../config ./
./Proxmark3GUI
@ -70,6 +67,9 @@ release页面中有含客户端的GUI。这个GUI也可以搭配你自己的客
***
## 更新日志:
### V0.2.4
+ 复制EM410x卡一种常见的低频ID卡
### V0.2.3
+ 修复 [#27](https://github.com/wh201906/Proxmark3GUI/issues/27)
+ 尝试支持中文启动路径

@ -1,3 +0,0 @@
[Languages]
en_US=English
zh_CN=简体中文

72
src/.gitignore vendored

@ -0,0 +1,72 @@
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe

@ -22,6 +22,7 @@ SOURCES += \
common/util.cpp \
module/lf.cpp \
module/mifare.cpp \
module/t55xxtab.cpp \
ui/mf_trailerdecoderdialog.cpp \
ui/mf_sim_simdialog.cpp \
ui/mf_uid_parameterdialog.cpp \
@ -34,6 +35,7 @@ HEADERS += \
common/util.h \
module/lf.h \
module/mifare.h \
module/t55xxtab.h \
ui/mf_trailerdecoderdialog.h \
ui/mf_sim_simdialog.h \
ui/mf_uid_parameterdialog.h \
@ -41,6 +43,7 @@ HEADERS += \
ui/mf_attack_hardnesteddialog.h \
FORMS += \
ui/t55xxtab.ui \
ui/mf_trailerdecoderdialog.ui \
ui/mf_sim_simdialog.ui \
ui/mf_uid_parameterdialog.ui \
@ -48,15 +51,18 @@ FORMS += \
ui/mf_attack_hardnesteddialog.ui
TRANSLATIONS += \
lang/zh_CN.ts \
lang/en_US.ts
i18n/zh_CN.ts \
i18n/en_US.ts
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
VERSION = 0.2.3
VERSION = 0.2.4
QMAKE_TARGET_PRODUCT = "Proxmark3GUI"
QMAKE_TARGET_DESCRIPTION = "Proxmark3GUI"
QMAKE_TARGET_COMPANY = "wh201906"
RESOURCES += \
i18n/language.qrc

@ -78,7 +78,13 @@ QString Util::execCMDWithOutput(const QString& cmd, ReturnTrigger trigger, bool
}
}
isRequiringOutput = false;
return (isResultFound || trigger.expectedOutputs.isEmpty() || rawOutput ? *requiredOutput : "");
// For functions without expected outputs in the return trigger, the result is the raw output.
// For functions with expected outputs in the return trigger,
// if rawOutput=true, the result is the raw output,
// otherwise, if the raw output contains one of the expected outputs, the result is the raw output,
// otherwise, the result is empty(as a failed flag).
return (trigger.expectedOutputs.isEmpty() || isResultFound || rawOutput ? *requiredOutput : "");
}
void Util::delay(unsigned int msec)
@ -106,7 +112,7 @@ void Util::setRunningState(bool st)
bool Util::chooseLanguage(QSettings* guiSettings, QMainWindow* window)
{
// make sure the GUISettings is not in any group
QSettings* langSettings = new QSettings("lang/languages.ini", QSettings::IniFormat);
QSettings* langSettings = new QSettings(":/i18n/languages.ini", QSettings::IniFormat);
QMap<QString, QString> langMap;
langSettings->setIniCodec("UTF-8");
langSettings->beginGroup("Languages");

@ -536,7 +536,7 @@ It could make the whole sector blocked irreversibly!</source>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="914"/>
<location filename="../ui/mainwindow.cpp" line="835"/>
<location filename="../ui/mainwindow.cpp" line="838"/>
<source>About UID Card</source>
<translation type="unfinished"></translation>
</message>
@ -738,6 +738,7 @@ or the communication between a tag and a reader.</source>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="1883"/>
<location filename="../ui/mainwindow.cpp" line="44"/>
<source>T55xx</source>
<translation type="unfinished"></translation>
</message>
@ -939,7 +940,7 @@ or the communication between a tag and a reader.</source>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="2570"/>
<location filename="../ui/mainwindow.cpp" line="267"/>
<location filename="../ui/mainwindow.cpp" line="270"/>
<source>History:</source>
<translation type="unfinished"></translation>
</message>
@ -1054,46 +1055,46 @@ or the communication between a tag and a reader.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="80"/>
<location filename="../ui/mainwindow.cpp" line="129"/>
<location filename="../ui/mainwindow.cpp" line="370"/>
<location filename="../ui/mainwindow.cpp" line="596"/>
<location filename="../ui/mainwindow.cpp" line="616"/>
<location filename="../ui/mainwindow.cpp" line="629"/>
<location filename="../ui/mainwindow.cpp" line="648"/>
<location filename="../ui/mainwindow.cpp" line="661"/>
<location filename="../ui/mainwindow.cpp" line="688"/>
<location filename="../ui/mainwindow.cpp" line="701"/>
<location filename="../ui/mainwindow.cpp" line="893"/>
<location filename="../ui/mainwindow.cpp" line="918"/>
<location filename="../ui/mainwindow.cpp" line="83"/>
<location filename="../ui/mainwindow.cpp" line="132"/>
<location filename="../ui/mainwindow.cpp" line="373"/>
<location filename="../ui/mainwindow.cpp" line="599"/>
<location filename="../ui/mainwindow.cpp" line="619"/>
<location filename="../ui/mainwindow.cpp" line="632"/>
<location filename="../ui/mainwindow.cpp" line="651"/>
<location filename="../ui/mainwindow.cpp" line="664"/>
<location filename="../ui/mainwindow.cpp" line="691"/>
<location filename="../ui/mainwindow.cpp" line="704"/>
<location filename="../ui/mainwindow.cpp" line="896"/>
<location filename="../ui/mainwindow.cpp" line="921"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="129"/>
<location filename="../ui/mainwindow.cpp" line="132"/>
<source>Plz choose a port first</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="201"/>
<location filename="../ui/mainwindow.cpp" line="204"/>
<source>Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="207"/>
<location filename="../ui/mainwindow.cpp" line="1003"/>
<location filename="../ui/mainwindow.cpp" line="210"/>
<location filename="../ui/mainwindow.cpp" line="1006"/>
<source>Not Connected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="648"/>
<location filename="../ui/mainwindow.cpp" line="661"/>
<location filename="../ui/mainwindow.cpp" line="893"/>
<location filename="../ui/mainwindow.cpp" line="651"/>
<location filename="../ui/mainwindow.cpp" line="664"/>
<location filename="../ui/mainwindow.cpp" line="896"/>
<source>Failed to open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="370"/>
<location filename="../ui/mainwindow.cpp" line="373"/>
<source>Continue?</source>
<translation type="unfinished"></translation>
</message>
@ -1113,194 +1114,194 @@ or the communication between a tag and a reader.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="80"/>
<location filename="../ui/mainwindow.cpp" line="83"/>
<source>Failed to load config file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="370"/>
<location filename="../ui/mainwindow.cpp" line="373"/>
<source>Some of the data and key will be cleared.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="483"/>
<location filename="../ui/mainwindow.cpp" line="486"/>
<source>Plz select the font of data widget and key widget</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="596"/>
<location filename="../ui/mainwindow.cpp" line="599"/>
<source>Data must consists of 32 Hex symbols(Whitespace is allowed)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="616"/>
<location filename="../ui/mainwindow.cpp" line="629"/>
<location filename="../ui/mainwindow.cpp" line="619"/>
<location filename="../ui/mainwindow.cpp" line="632"/>
<source>Key must consists of 12 Hex symbols(Whitespace is allowed)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="641"/>
<location filename="../ui/mainwindow.cpp" line="644"/>
<source>Plz select the data file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="642"/>
<location filename="../ui/mainwindow.cpp" line="682"/>
<location filename="../ui/mainwindow.cpp" line="686"/>
<location filename="../ui/mainwindow.cpp" line="645"/>
<location filename="../ui/mainwindow.cpp" line="685"/>
<location filename="../ui/mainwindow.cpp" line="689"/>
<source>Binary Data Files(*.bin *.dump)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="642"/>
<location filename="../ui/mainwindow.cpp" line="655"/>
<location filename="../ui/mainwindow.cpp" line="880"/>
<location filename="../ui/mainwindow.cpp" line="645"/>
<location filename="../ui/mainwindow.cpp" line="658"/>
<location filename="../ui/mainwindow.cpp" line="883"/>
<source>All Files(*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="654"/>
<location filename="../ui/mainwindow.cpp" line="657"/>
<source>Plz select the key file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="681"/>
<location filename="../ui/mainwindow.cpp" line="684"/>
<source>Plz select the location to save data file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="688"/>
<location filename="../ui/mainwindow.cpp" line="701"/>
<location filename="../ui/mainwindow.cpp" line="918"/>
<location filename="../ui/mainwindow.cpp" line="691"/>
<location filename="../ui/mainwindow.cpp" line="704"/>
<location filename="../ui/mainwindow.cpp" line="921"/>
<source>Failed to save to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="694"/>
<location filename="../ui/mainwindow.cpp" line="697"/>
<source>Plz select the location to save key file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="655"/>
<location filename="../ui/mainwindow.cpp" line="695"/>
<location filename="../ui/mainwindow.cpp" line="699"/>
<location filename="../ui/mainwindow.cpp" line="658"/>
<location filename="../ui/mainwindow.cpp" line="698"/>
<location filename="../ui/mainwindow.cpp" line="702"/>
<source>Binary Key Files(*.bin *.dump)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="642"/>
<location filename="../ui/mainwindow.cpp" line="682"/>
<location filename="../ui/mainwindow.cpp" line="645"/>
<location filename="../ui/mainwindow.cpp" line="685"/>
<source>Text Data Files(*.txt *.eml)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="820"/>
<location filename="../ui/mainwindow.cpp" line="823"/>
<source> Normally, the Block 0 of a typical Mifare card, which contains the UID, is locked during the manufacture. Users cannot write anything to Block 0 or set a new UID to a normal Mifare card.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="821"/>
<location filename="../ui/mainwindow.cpp" line="824"/>
<source> Chinese Magic Cards(aka UID Cards) are some special cards whose Block 0 are writeable. And you can change UID by writing to it.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="823"/>
<location filename="../ui/mainwindow.cpp" line="826"/>
<source>There are two versions of Chinese Magic Cards, the Gen1 and the Gen2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="824"/>
<location filename="../ui/mainwindow.cpp" line="827"/>
<source> Gen1:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="824"/>
<location filename="../ui/mainwindow.cpp" line="827"/>
<source> also called UID card in China. It responses to some backdoor commands so you can access any blocks without password. The Proxmark3 has a bunch of related commands(csetblk, cgetblk, ...) to deal with this type of card, and my GUI also support these commands.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="825"/>
<location filename="../ui/mainwindow.cpp" line="828"/>
<source> Gen2:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="825"/>
<location filename="../ui/mainwindow.cpp" line="828"/>
<source> doesn&apos;t response to the backdoor commands, which means that a reader cannot detect whether it is a Chinese Magic Card or not by sending backdoor commands.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="827"/>
<location filename="../ui/mainwindow.cpp" line="830"/>
<source>There are some types of Chinese Magic Card Gen2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="828"/>
<location filename="../ui/mainwindow.cpp" line="831"/>
<source> CUID Card:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="828"/>
<location filename="../ui/mainwindow.cpp" line="831"/>
<source> the Block 0 is writeable, you can write to this block repeatedly by normal wrbl command.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="829"/>
<location filename="../ui/mainwindow.cpp" line="832"/>
<source> (hf mf wrbl 0 A FFFFFFFFFFFF &lt;the data you want to write&gt;)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="830"/>
<location filename="../ui/mainwindow.cpp" line="833"/>
<source> FUID Card:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="830"/>
<location filename="../ui/mainwindow.cpp" line="833"/>
<source> you can only write to Block 0 once. After that, it seems like a typical Mifare card(Block 0 cannot be written to).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="831"/>
<location filename="../ui/mainwindow.cpp" line="834"/>
<source> (some readers might try changing the Block 0, which could detect the CUID Card. In that case, you should use FUID card.)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="832"/>
<location filename="../ui/mainwindow.cpp" line="835"/>
<source> UFUID Card:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="832"/>
<location filename="../ui/mainwindow.cpp" line="835"/>
<source> It behaves like a CUID card(or UID card? I&apos;m not sure) before you send some special command to lock it. Once it is locked, you cannot change its Block 0(just like a typical Mifare card).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="834"/>
<location filename="../ui/mainwindow.cpp" line="837"/>
<source> Seemingly, these Chinese Magic Cards are more easily to be compromised by Nested Attack(it takes little time to get an unknown key).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="879"/>
<location filename="../ui/mainwindow.cpp" line="882"/>
<source>Plz select the trace file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="903"/>
<location filename="../ui/mainwindow.cpp" line="906"/>
<source>Plz select the location to save trace file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="880"/>
<location filename="../ui/mainwindow.cpp" line="904"/>
<location filename="../ui/mainwindow.cpp" line="883"/>
<location filename="../ui/mainwindow.cpp" line="907"/>
<source>Trace Files(*.trc)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1004"/>
<location filename="../ui/mainwindow.cpp" line="1176"/>
<location filename="../ui/mainwindow.cpp" line="1007"/>
<location filename="../ui/mainwindow.cpp" line="1179"/>
<source>Idle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1006"/>
<location filename="../ui/mainwindow.cpp" line="1009"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
@ -1326,27 +1327,27 @@ or the communication between a tag and a reader.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1113"/>
<location filename="../ui/mainwindow.cpp" line="1116"/>
<source>HW Version:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1115"/>
<location filename="../ui/mainwindow.cpp" line="1118"/>
<source>PM3:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1117"/>
<location filename="../ui/mainwindow.cpp" line="1120"/>
<source>State:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1172"/>
<location filename="../ui/mainwindow.cpp" line="1175"/>
<source>Running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1299"/>
<location filename="../ui/mainwindow.cpp" line="1302"/>
<source>Actural Freq: </source>
<translation type="unfinished"></translation>
</message>
@ -1354,58 +1355,96 @@ or the communication between a tag and a reader.</source>
<context>
<name>Mifare</name>
<message>
<location filename="../module/mifare.cpp" line="643"/>
<location filename="../module/mifare.cpp" line="642"/>
<source>Success!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="209"/>
<location filename="../module/mifare.cpp" line="643"/>
<location filename="../module/mifare.cpp" line="647"/>
<location filename="../module/mifare.cpp" line="671"/>
<location filename="../module/mifare.cpp" line="710"/>
<location filename="../module/mifare.cpp" line="723"/>
<location filename="../module/mifare.cpp" line="774"/>
<location filename="../module/mifare.cpp" line="208"/>
<location filename="../module/mifare.cpp" line="642"/>
<location filename="../module/mifare.cpp" line="646"/>
<location filename="../module/mifare.cpp" line="670"/>
<location filename="../module/mifare.cpp" line="709"/>
<location filename="../module/mifare.cpp" line="722"/>
<location filename="../module/mifare.cpp" line="773"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="209"/>
<location filename="../module/mifare.cpp" line="208"/>
<source>Plz provide at least one known key</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="468"/>
<location filename="../module/mifare.cpp" line="647"/>
<location filename="../module/mifare.cpp" line="467"/>
<location filename="../module/mifare.cpp" line="646"/>
<source>Failed!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="672"/>
<location filename="../module/mifare.cpp" line="671"/>
<source>The Access Bits is invalid!
It could make the whole sector blocked irreversibly!
Continue to write?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="710"/>
<location filename="../module/mifare.cpp" line="709"/>
<source>Successful!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="723"/>
<location filename="../module/mifare.cpp" line="722"/>
<source>Failed to write to these blocks:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="727"/>
<location filename="../module/mifare.cpp" line="726"/>
<source>Select them?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="774"/>
<location filename="../module/mifare.cpp" line="773"/>
<source>Failed to read card.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>T55xxTab</name>
<message>
<location filename="../ui/t55xxtab.ui" line="17"/>
<source>Clone to T55xx</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="25"/>
<source>Target Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="32"/>
<source>T5555</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="39"/>
<source>T55x7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="64"/>
<source>EM410x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="70"/>
<source>Read</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="80"/>
<source>Clone</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

@ -0,0 +1,7 @@
<RCC>
<qresource prefix="/i18n">
<file>en_US.qm</file>
<file>languages.ini</file>
<file>zh_CN.qm</file>
</qresource>
</RCC>

@ -0,0 +1,4 @@
[Languages]
en_US=English
zh_CN=简体中文
ext=Load from external file

@ -500,7 +500,7 @@ It could make the whole sector blocked irreversibly!</source>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="914"/>
<location filename="../ui/mainwindow.cpp" line="835"/>
<location filename="../ui/mainwindow.cpp" line="838"/>
<source>About UID Card</source>
<translation>UID</translation>
</message>
@ -694,7 +694,7 @@ Use this to get raw data from a tag.</source>
If the antenna voltage has a obvious drop after putting card on the antenna, it is likely that the tag is a LF tag.
On Iceman/RRG repo, press the button on PM3 to stop measuring</source>
<translation>线
线
线
PM3</translation>
</message>
<message>
@ -708,6 +708,7 @@ or the communication between a tag and a reader.</source>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="1883"/>
<location filename="../ui/mainwindow.cpp" line="44"/>
<source>T55xx</source>
<translation></translation>
</message>
@ -909,7 +910,7 @@ or the communication between a tag and a reader.</source>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="2570"/>
<location filename="../ui/mainwindow.cpp" line="267"/>
<location filename="../ui/mainwindow.cpp" line="270"/>
<source>History:</source>
<translation></translation>
</message>
@ -1064,46 +1065,46 @@ or the communication between a tag and a reader.</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="80"/>
<location filename="../ui/mainwindow.cpp" line="129"/>
<location filename="../ui/mainwindow.cpp" line="370"/>
<location filename="../ui/mainwindow.cpp" line="596"/>
<location filename="../ui/mainwindow.cpp" line="616"/>
<location filename="../ui/mainwindow.cpp" line="629"/>
<location filename="../ui/mainwindow.cpp" line="648"/>
<location filename="../ui/mainwindow.cpp" line="661"/>
<location filename="../ui/mainwindow.cpp" line="688"/>
<location filename="../ui/mainwindow.cpp" line="701"/>
<location filename="../ui/mainwindow.cpp" line="893"/>
<location filename="../ui/mainwindow.cpp" line="918"/>
<location filename="../ui/mainwindow.cpp" line="83"/>
<location filename="../ui/mainwindow.cpp" line="132"/>
<location filename="../ui/mainwindow.cpp" line="373"/>
<location filename="../ui/mainwindow.cpp" line="599"/>
<location filename="../ui/mainwindow.cpp" line="619"/>
<location filename="../ui/mainwindow.cpp" line="632"/>
<location filename="../ui/mainwindow.cpp" line="651"/>
<location filename="../ui/mainwindow.cpp" line="664"/>
<location filename="../ui/mainwindow.cpp" line="691"/>
<location filename="../ui/mainwindow.cpp" line="704"/>
<location filename="../ui/mainwindow.cpp" line="896"/>
<location filename="../ui/mainwindow.cpp" line="921"/>
<source>Info</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="129"/>
<location filename="../ui/mainwindow.cpp" line="132"/>
<source>Plz choose a port first</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="201"/>
<location filename="../ui/mainwindow.cpp" line="204"/>
<source>Connected</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="207"/>
<location filename="../ui/mainwindow.cpp" line="1003"/>
<location filename="../ui/mainwindow.cpp" line="210"/>
<location filename="../ui/mainwindow.cpp" line="1006"/>
<source>Not Connected</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="648"/>
<location filename="../ui/mainwindow.cpp" line="661"/>
<location filename="../ui/mainwindow.cpp" line="893"/>
<location filename="../ui/mainwindow.cpp" line="651"/>
<location filename="../ui/mainwindow.cpp" line="664"/>
<location filename="../ui/mainwindow.cpp" line="896"/>
<source>Failed to open</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="370"/>
<location filename="../ui/mainwindow.cpp" line="373"/>
<source>Continue?</source>
<translation></translation>
</message>
@ -1123,82 +1124,82 @@ or the communication between a tag and a reader.</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="80"/>
<location filename="../ui/mainwindow.cpp" line="83"/>
<source>Failed to load config file</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="370"/>
<location filename="../ui/mainwindow.cpp" line="373"/>
<source>Some of the data and key will be cleared.</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="483"/>
<location filename="../ui/mainwindow.cpp" line="486"/>
<source>Plz select the font of data widget and key widget</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="596"/>
<location filename="../ui/mainwindow.cpp" line="599"/>
<source>Data must consists of 32 Hex symbols(Whitespace is allowed)</source>
<translation>32</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="616"/>
<location filename="../ui/mainwindow.cpp" line="629"/>
<location filename="../ui/mainwindow.cpp" line="619"/>
<location filename="../ui/mainwindow.cpp" line="632"/>
<source>Key must consists of 12 Hex symbols(Whitespace is allowed)</source>
<translation>12</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="641"/>
<location filename="../ui/mainwindow.cpp" line="644"/>
<source>Plz select the data file:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="642"/>
<location filename="../ui/mainwindow.cpp" line="682"/>
<location filename="../ui/mainwindow.cpp" line="686"/>
<location filename="../ui/mainwindow.cpp" line="645"/>
<location filename="../ui/mainwindow.cpp" line="685"/>
<location filename="../ui/mainwindow.cpp" line="689"/>
<source>Binary Data Files(*.bin *.dump)</source>
<translation>(*.bin *.dump)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="642"/>
<location filename="../ui/mainwindow.cpp" line="655"/>
<location filename="../ui/mainwindow.cpp" line="880"/>
<location filename="../ui/mainwindow.cpp" line="645"/>
<location filename="../ui/mainwindow.cpp" line="658"/>
<location filename="../ui/mainwindow.cpp" line="883"/>
<source>All Files(*.*)</source>
<translation>(*.*)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="654"/>
<location filename="../ui/mainwindow.cpp" line="657"/>
<source>Plz select the key file:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="681"/>
<location filename="../ui/mainwindow.cpp" line="684"/>
<source>Plz select the location to save data file:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="688"/>
<location filename="../ui/mainwindow.cpp" line="701"/>
<location filename="../ui/mainwindow.cpp" line="918"/>
<location filename="../ui/mainwindow.cpp" line="691"/>
<location filename="../ui/mainwindow.cpp" line="704"/>
<location filename="../ui/mainwindow.cpp" line="921"/>
<source>Failed to save to</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="694"/>
<location filename="../ui/mainwindow.cpp" line="697"/>
<source>Plz select the location to save key file:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="655"/>
<location filename="../ui/mainwindow.cpp" line="695"/>
<location filename="../ui/mainwindow.cpp" line="699"/>
<location filename="../ui/mainwindow.cpp" line="658"/>
<location filename="../ui/mainwindow.cpp" line="698"/>
<location filename="../ui/mainwindow.cpp" line="702"/>
<source>Binary Key Files(*.bin *.dump)</source>
<translation>(*.bin *.dump)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="642"/>
<location filename="../ui/mainwindow.cpp" line="682"/>
<location filename="../ui/mainwindow.cpp" line="645"/>
<location filename="../ui/mainwindow.cpp" line="685"/>
<source>Text Data Files(*.txt *.eml)</source>
<translation>(*.txt *.eml)</translation>
</message>
@ -1207,114 +1208,114 @@ or the communication between a tag and a reader.</source>
<translation type="vanished">(*.txt *.eml)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="820"/>
<location filename="../ui/mainwindow.cpp" line="823"/>
<source> Normally, the Block 0 of a typical Mifare card, which contains the UID, is locked during the manufacture. Users cannot write anything to Block 0 or set a new UID to a normal Mifare card.</source>
<translation> Mifare0</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="821"/>
<location filename="../ui/mainwindow.cpp" line="824"/>
<source> Chinese Magic Cards(aka UID Cards) are some special cards whose Block 0 are writeable. And you can change UID by writing to it.</source>
<translation> UIDChinese Magic Card0</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="823"/>
<location filename="../ui/mainwindow.cpp" line="826"/>
<source>There are two versions of Chinese Magic Cards, the Gen1 and the Gen2.</source>
<translation>UIDChinese Magic Card Gen1Gen2</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="824"/>
<location filename="../ui/mainwindow.cpp" line="827"/>
<source> Gen1:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="824"/>
<location filename="../ui/mainwindow.cpp" line="827"/>
<source> also called UID card in China. It responses to some backdoor commands so you can access any blocks without password. The Proxmark3 has a bunch of related commands(csetblk, cgetblk, ...) to deal with this type of card, and my GUI also support these commands.</source>
<translation> UIDPM3GUI</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="825"/>
<location filename="../ui/mainwindow.cpp" line="828"/>
<source> Gen2:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="825"/>
<location filename="../ui/mainwindow.cpp" line="828"/>
<source> doesn&apos;t response to the backdoor commands, which means that a reader cannot detect whether it is a Chinese Magic Card or not by sending backdoor commands.</source>
<translation> CUID/FUID/UFUID</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="827"/>
<location filename="../ui/mainwindow.cpp" line="830"/>
<source>There are some types of Chinese Magic Card Gen2.</source>
<translation>Gen2</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="828"/>
<location filename="../ui/mainwindow.cpp" line="831"/>
<source> CUID Card:</source>
<translation> CUID</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="828"/>
<location filename="../ui/mainwindow.cpp" line="831"/>
<source> the Block 0 is writeable, you can write to this block repeatedly by normal wrbl command.</source>
<translation> 0</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="829"/>
<location filename="../ui/mainwindow.cpp" line="832"/>
<source> (hf mf wrbl 0 A FFFFFFFFFFFF &lt;the data you want to write&gt;)</source>
<translation> (hf mf wrbl 0 A FFFFFFFFFFFF &lt;&gt;)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="830"/>
<location filename="../ui/mainwindow.cpp" line="833"/>
<source> FUID Card:</source>
<translation> FUID</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="830"/>
<location filename="../ui/mainwindow.cpp" line="833"/>
<source> you can only write to Block 0 once. After that, it seems like a typical Mifare card(Block 0 cannot be written to).</source>
<translation> 0</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="831"/>
<location filename="../ui/mainwindow.cpp" line="834"/>
<source> (some readers might try changing the Block 0, which could detect the CUID Card. In that case, you should use FUID card.)</source>
<translation> (穿CUID)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="832"/>
<location filename="../ui/mainwindow.cpp" line="835"/>
<source> UFUID Card:</source>
<translation> UFUID</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="832"/>
<location filename="../ui/mainwindow.cpp" line="835"/>
<source> It behaves like a CUID card(or UID card? I&apos;m not sure) before you send some special command to lock it. Once it is locked, you cannot change its Block 0(just like a typical Mifare card).</source>
<translation> UID/CUID0FUID</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="834"/>
<location filename="../ui/mainwindow.cpp" line="837"/>
<source> Seemingly, these Chinese Magic Cards are more easily to be compromised by Nested Attack(it takes little time to get an unknown key).</source>
<translation> UIDNested</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="879"/>
<location filename="../ui/mainwindow.cpp" line="882"/>
<source>Plz select the trace file:</source>
<translation>trace</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="903"/>
<location filename="../ui/mainwindow.cpp" line="906"/>
<source>Plz select the location to save trace file:</source>
<translation>trace</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="880"/>
<location filename="../ui/mainwindow.cpp" line="904"/>
<location filename="../ui/mainwindow.cpp" line="883"/>
<location filename="../ui/mainwindow.cpp" line="907"/>
<source>Trace Files(*.trc)</source>
<translation>Trace(*.trc)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1004"/>
<location filename="../ui/mainwindow.cpp" line="1176"/>
<location filename="../ui/mainwindow.cpp" line="1007"/>
<location filename="../ui/mainwindow.cpp" line="1179"/>
<source>Idle</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1006"/>
<location filename="../ui/mainwindow.cpp" line="1009"/>
<source>Stop</source>
<translation></translation>
</message>
@ -1340,27 +1341,27 @@ or the communication between a tag and a reader.</source>
<translation>B</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1113"/>
<location filename="../ui/mainwindow.cpp" line="1116"/>
<source>HW Version:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1115"/>
<location filename="../ui/mainwindow.cpp" line="1118"/>
<source>PM3:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1117"/>
<location filename="../ui/mainwindow.cpp" line="1120"/>
<source>State:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1172"/>
<location filename="../ui/mainwindow.cpp" line="1175"/>
<source>Running</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="1299"/>
<location filename="../ui/mainwindow.cpp" line="1302"/>
<source>Actural Freq: </source>
<translation> </translation>
</message>
@ -1368,34 +1369,34 @@ or the communication between a tag and a reader.</source>
<context>
<name>Mifare</name>
<message>
<location filename="../module/mifare.cpp" line="643"/>
<location filename="../module/mifare.cpp" line="642"/>
<source>Success!</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="209"/>
<location filename="../module/mifare.cpp" line="643"/>
<location filename="../module/mifare.cpp" line="647"/>
<location filename="../module/mifare.cpp" line="671"/>
<location filename="../module/mifare.cpp" line="710"/>
<location filename="../module/mifare.cpp" line="723"/>
<location filename="../module/mifare.cpp" line="774"/>
<location filename="../module/mifare.cpp" line="208"/>
<location filename="../module/mifare.cpp" line="642"/>
<location filename="../module/mifare.cpp" line="646"/>
<location filename="../module/mifare.cpp" line="670"/>
<location filename="../module/mifare.cpp" line="709"/>
<location filename="../module/mifare.cpp" line="722"/>
<location filename="../module/mifare.cpp" line="773"/>
<source>Info</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="209"/>
<location filename="../module/mifare.cpp" line="208"/>
<source>Plz provide at least one known key</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="468"/>
<location filename="../module/mifare.cpp" line="647"/>
<location filename="../module/mifare.cpp" line="467"/>
<location filename="../module/mifare.cpp" line="646"/>
<source>Failed!</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="672"/>
<location filename="../module/mifare.cpp" line="671"/>
<source>The Access Bits is invalid!
It could make the whole sector blocked irreversibly!
Continue to write?</source>
@ -1404,24 +1405,62 @@ Continue to write?</source>
</translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="710"/>
<location filename="../module/mifare.cpp" line="709"/>
<source>Successful!</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="723"/>
<location filename="../module/mifare.cpp" line="722"/>
<source>Failed to write to these blocks:</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="727"/>
<location filename="../module/mifare.cpp" line="726"/>
<source>Select them?</source>
<translation></translation>
</message>
<message>
<location filename="../module/mifare.cpp" line="774"/>
<location filename="../module/mifare.cpp" line="773"/>
<source>Failed to read card.</source>
<translation></translation>
</message>
</context>
<context>
<name>T55xxTab</name>
<message>
<location filename="../ui/t55xxtab.ui" line="17"/>
<source>Clone to T55xx</source>
<translation>T55xx</translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="25"/>
<source>Target Type:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="32"/>
<source>T5555</source>
<translation></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="39"/>
<source>T55x7</source>
<translation></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="64"/>
<source>EM410x</source>
<translation></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="70"/>
<source>Read</source>
<translation></translation>
</message>
<message>
<location filename="../ui/t55xxtab.ui" line="80"/>
<source>Clone</source>
<translation></translation>
</message>
</context>
</TS>

@ -1,63 +1,63 @@
#include "ui/mainwindow.h"
#include <QApplication>
#include <QSettings>
#include <QTranslator>
#include <QMessageBox>
#include <QTextCodec>
#include <QDir>
int main(int argc, char *argv[])
{
// A trick to handle non-ascii path
// The application cannot find the plugins when the path contains non ascii characters.
// However, the plugins will be load after creating MainWindow(or QApplication?).
// QDir will handle the path correctly.
QDir* pluginDir = new QDir;
if(pluginDir->cd("plugins")) // has plugins folder
{
qputenv("QT_PLUGIN_PATH", pluginDir->absolutePath().toLocal8Bit());
}
delete pluginDir;
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QDir *langPath = new QDir();
QApplication a(argc, argv);
MainWindow w;
QSettings* settings = new QSettings("GUIsettings.ini", QSettings::IniFormat);
settings->setIniCodec("UTF-8");
settings->beginGroup("lang");
QString currLang = settings->value("language", "").toString();
settings->endGroup();
if(currLang == "")
{
if(Util::chooseLanguage(settings, &w))
{
settings->beginGroup("lang");
currLang = settings->value("language", "").toString();
settings->endGroup();
}
else
currLang = "en_US";
}
currLang += ".qm";
langPath->cd("lang");
QTranslator* translator = new QTranslator(&w);
if(translator->load(currLang, langPath->absolutePath()))
{
a.installTranslator(translator);
}
else
{
QMessageBox::information(&w, "Error", "Can't load " + currLang + " as translation file.");
}
delete settings;
delete langPath;
w.initUI();
w.show();
return a.exec();
}
#include "ui/mainwindow.h"
#include <QApplication>
#include <QSettings>
#include <QTranslator>
#include <QMessageBox>
#include <QTextCodec>
#include <QDir>
int main(int argc, char *argv[])
{
// A trick to handle non-ascii path
// The application cannot find the plugins when the path contains non ascii characters.
// However, the plugins will be load after creating MainWindow(or QApplication?).
// QDir will handle the path correctly.
QDir* pluginDir = new QDir;
if(pluginDir->cd("plugins")) // has plugins folder
{
qputenv("QT_PLUGIN_PATH", pluginDir->absolutePath().toLocal8Bit());
}
delete pluginDir;
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QApplication a(argc, argv);
MainWindow w;
QSettings* settings = new QSettings("GUIsettings.ini", QSettings::IniFormat);
settings->setIniCodec("UTF-8");
settings->beginGroup("lang");
QString currLang = settings->value("language", "").toString();
settings->endGroup();
if(currLang == "")
{
if(Util::chooseLanguage(settings, &w))
{
settings->beginGroup("lang");
currLang = settings->value("language", "").toString();
settings->endGroup();
}
else
currLang = "en_US";
}
if(currLang == "ext")
currLang = QFileDialog::getOpenFileName(nullptr, "Select the translation file:");
else
currLang = ":/i18n/" + currLang + ".qm";
QTranslator* translator = new QTranslator(&w);
if(translator->load(currLang))
{
a.installTranslator(translator);
}
else
{
QMessageBox::information(&w, "Error", "Can't load " + currLang + " as translation file.");
}
delete settings;
w.initUI();
w.show();
return a.exec();
}

@ -154,5 +154,4 @@ void LF::syncWithUI()
void LF::setConfigMap(const QVariantMap& configMap)
{
this->configMap = configMap;
qDebug() << configMap;
}

@ -91,7 +91,6 @@ Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QWidget *parent): QObject(parent)
void Mifare::setConfigMap(const QVariantMap& configMap)
{
this->configMap = configMap;
qDebug() << configMap;
}
QMap<QString, QString> Mifare::info(bool isRequiringOutput)

@ -0,0 +1,68 @@
#include "t55xxtab.h"
#include "ui_t55xxtab.h"
T55xxTab::T55xxTab(Util *addr, QWidget *parent) :
QWidget(parent),
ui(new Ui::T55xxTab)
{
ui->setupUi(this);
util = addr;
}
T55xxTab::~T55xxTab()
{
delete ui;
}
void T55xxTab::setConfigMap(const QVariantMap &configMap)
{
this->configMap = configMap;
}
void T55xxTab::setGUIState(bool st)
{
ui->cloneGroupBox->setEnabled(st);
emit setParentGUIState(st);
}
void T55xxTab::on_Clone_EM410xReadButton_clicked()
{
setGUIState(false);
QVariantMap config = configMap["clone em410x"].toMap();
QString result;
QRegularExpressionMatch reMatch;
result = util->execCMDWithOutput(
config["read"].toString(),
Util::ReturnTrigger(6000, {config["successful read flag"].toString()}));
if(result.isEmpty())
{
setGUIState(true);
return;
}
reMatch = QRegularExpression(config["pattern"].toString()).match(result);
ui->Clone_EM410xIDEdit->setText(reMatch.captured());
setGUIState(true);
}
void T55xxTab::on_Clone_EM410xCloneButton_clicked()
{
if(ui->Clone_EM410xIDEdit->text().isEmpty())
return;
setGUIState(false);
QVariantMap config = configMap["clone em410x"].toMap();
QString cmd = config["clone cmd"].toString();
cmd.replace("<id>", ui->Clone_EM410xIDEdit->text());
if(ui->Clone_T5555Button->isChecked())
cmd.replace("<type>", config["t5555 flag"].toString());
else
cmd.replace("<type>", config["t55x7 flag"].toString());
util->execCMD(cmd);
Util::gotoRawTab();
setGUIState(true);
}

@ -0,0 +1,36 @@
#ifndef T55XXTAB_H
#define T55XXTAB_H
#include "common/util.h"
#include <QWidget>
namespace Ui
{
class T55xxTab;
}
class T55xxTab : public QWidget
{
Q_OBJECT
public:
explicit T55xxTab(Util *addr, QWidget *parent = nullptr);
~T55xxTab();
void setConfigMap(const QVariantMap& configMap);
private slots:
void on_Clone_EM410xReadButton_clicked();
void on_Clone_EM410xCloneButton_clicked();
private:
Ui::T55xxTab *ui;
Util* util;
QVariantMap configMap;
void setGUIState(bool st);
signals:
void setParentGUIState(bool st);
};
#endif // T55XXTAB_H

@ -39,13 +39,16 @@ MainWindow::MainWindow(QWidget *parent):
Util::setUI(ui);
mifare = new Mifare(ui, util, this);
lf = new LF(ui, util, this);
t55xxTab = new T55xxTab(util);
connect(t55xxTab, &T55xxTab::setParentGUIState, this, &MainWindow::setState);
ui->funcTab->insertTab(2, t55xxTab, tr("T55xx"));
keyEventFilter = new MyEventFilter(QEvent::KeyPress);
resizeEventFilter = new MyEventFilter(QEvent::Resize);
// hide unused tabs
// ui->funcTab->removeTab(1);
ui->funcTab->removeTab(2);
ui->funcTab->removeTab(3);
portSearchTimer = new QTimer(this);
portSearchTimer->setInterval(2000);
@ -85,7 +88,7 @@ void MainWindow::loadConfig()
QJsonDocument configJson(QJsonDocument::fromJson(configData));
mifare->setConfigMap(configJson.object()["mifare classic"].toObject().toVariantMap());
lf->setConfigMap(configJson.object()["lf"].toObject().toVariantMap());
t55xxTab->setConfigMap(configJson.object()["t55xx"].toObject().toVariantMap());
}
void MainWindow::initUI() // will be called by main.app
@ -636,7 +639,7 @@ void MainWindow::on_MF_File_loadButton_clicked()
{
QString title = "";
QString filename = "";
if(ui->MF_File_dataBox->isChecked())
if(ui->MF_File_dataButton->isChecked())
{
title = tr("Plz select the data file:");
filename = QFileDialog::getOpenFileName(this, title, "./", tr("Binary Data Files(*.bin *.dump)") + ";;" + tr("Text Data Files(*.txt *.eml)") + ";;" + tr("All Files(*.*)"));
@ -649,7 +652,7 @@ void MainWindow::on_MF_File_loadButton_clicked()
}
}
}
else if(ui->MF_File_keyBox->isChecked())
else if(ui->MF_File_keyButton->isChecked())
{
title = tr("Plz select the key file:");
filename = QFileDialog::getOpenFileName(this, title, "./", tr("Binary Key Files(*.bin *.dump)") + ";;" + tr("All Files(*.*)"));
@ -676,7 +679,7 @@ void MainWindow::on_MF_File_saveButton_clicked()
defaultName += "_";
defaultName += QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss");
if(ui->MF_File_dataBox->isChecked())
if(ui->MF_File_dataButton->isChecked())
{
title = tr("Plz select the location to save data file:");
filename = QFileDialog::getSaveFileName(this, title, "./data_" + defaultName, tr("Binary Data Files(*.bin *.dump)") + ";;" + tr("Text Data Files(*.txt *.eml)"), &selectedType);
@ -689,7 +692,7 @@ void MainWindow::on_MF_File_saveButton_clicked()
}
}
}
else if(ui->MF_File_keyBox->isChecked())
else if(ui->MF_File_keyButton->isChecked())
{
title = tr("Plz select the location to save key file:");
filename = QFileDialog::getSaveFileName(this, title, "./key_" + defaultName, tr("Binary Key Files(*.bin *.dump)"), &selectedType);
@ -707,12 +710,12 @@ void MainWindow::on_MF_File_saveButton_clicked()
void MainWindow::on_MF_File_clearButton_clicked()
{
if(ui->MF_File_keyBox->isChecked())
if(ui->MF_File_keyButton->isChecked())
{
mifare->data_clearKey();
mifare->data_syncWithKeyWidget();
}
else if(ui->MF_File_dataBox->isChecked())
else if(ui->MF_File_keyButton->isChecked())
{
mifare->data_clearData();
mifare->data_syncWithDataWidget();

@ -31,6 +31,7 @@
#include "common/pm3process.h"
#include "module/mifare.h"
#include "module/lf.h"
#include "module/t55xxtab.h"
#include "common/util.h"
#include "ui/mf_trailerdecoderdialog.h"
@ -205,6 +206,7 @@ private slots:
void on_Set_Client_configPathEdit_editingFinished();
void setState(bool st);
private:
Ui::MainWindow* ui;
QButtonGroup* MFCardTypeBtnGroup;
@ -235,6 +237,7 @@ private:
QStringList clientEnv;
QDir* clientWorkingDir;
T55xxTab* t55xxTab;
Mifare* mifare;
LF* lf;
Util* util;
@ -247,7 +250,6 @@ private:
void signalInit();
void MF_widgetReset();
void setTableItem(QTableWidget *widget, int row, int column, const QString& text);
void setState(bool st);
void saveClientPath(const QString& path);
void onLFfreqConfChanged(int value, bool isCustomized);
void dockInit();

@ -21,7 +21,7 @@
</property>
<widget class="QWidget" name="centralwidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -524,7 +524,7 @@
</widget>
</item>
<item>
<widget class="QRadioButton" name="MF_File_dataBox">
<widget class="QRadioButton" name="MF_File_dataButton">
<property name="text">
<string>Data</string>
</property>
@ -534,7 +534,7 @@
</widget>
</item>
<item>
<widget class="QRadioButton" name="MF_File_keyBox">
<widget class="QRadioButton" name="MF_File_keyButton">
<property name="text">
<string>Key</string>
</property>

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>T55xxTab</class>
<widget class="QWidget" name="T55xxTab">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<layout class="QVBoxLayout">
<item>
<widget class="QGroupBox" name="cloneGroupBox">
<property name="title">
<string>Clone to T55xx</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Target Type:</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="Clone_T5555Button">
<property name="text">
<string>T5555</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="Clone_T55x7Button">
<property name="text">
<string>T55x7</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="Clone_EM410xGroupBox">
<property name="title">
<string>EM410x</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="Clone_EM410xReadButton">
<property name="text">
<string>Read</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="Clone_EM410xIDEdit"/>
</item>
<item>
<widget class="QPushButton" name="Clone_EM410xCloneButton">
<property name="text">
<string>Clone</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Loading…
Cancel
Save