Merge pull request #3 from wh201906/dev

V0.1.1
pull/5/head
wh201906 5 years ago committed by GitHub
commit 5cccb7b8bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -20,6 +20,7 @@ SOURCES += \
common/pm3process.cpp \ common/pm3process.cpp \
common/util.cpp \ common/util.cpp \
module/mifare.cpp \ module/mifare.cpp \
ui/mf_sim_simdialog.cpp \
ui/mf_uid_parameterdialog.cpp \ ui/mf_uid_parameterdialog.cpp \
ui/mainwindow.cpp \ ui/mainwindow.cpp \
ui/mf_attack_hardnesteddialog.cpp \ ui/mf_attack_hardnesteddialog.cpp \
@ -28,11 +29,13 @@ HEADERS += \
common/pm3process.h \ common/pm3process.h \
common/util.h \ common/util.h \
module/mifare.h \ module/mifare.h \
ui/mf_sim_simdialog.h \
ui/mf_uid_parameterdialog.h \ ui/mf_uid_parameterdialog.h \
ui/mainwindow.h \ ui/mainwindow.h \
ui/mf_attack_hardnesteddialog.h \ ui/mf_attack_hardnesteddialog.h \
FORMS += \ FORMS += \
ui/mf_sim_simdialog.ui \
ui/mf_uid_parameterdialog.ui \ ui/mf_uid_parameterdialog.ui \
ui/mainwindow.ui \ ui/mainwindow.ui \
ui/mf_attack_hardnesteddialog.ui ui/mf_attack_hardnesteddialog.ui
@ -46,7 +49,7 @@ qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target !isEmpty(target.path): INSTALLS += target
VERSION = 0.1 VERSION = 0.1.1
QMAKE_TARGET_PRODUCT = "Proxmark3GUI" QMAKE_TARGET_PRODUCT = "Proxmark3GUI"
QMAKE_TARGET_DESCRIPTION = "Proxmark3GUI" QMAKE_TARGET_DESCRIPTION = "Proxmark3GUI"
QMAKE_TARGET_COMPANY = "wh201906" QMAKE_TARGET_COMPANY = "wh201906"

@ -28,6 +28,9 @@ A GUI for [Proxmark3](https://github.com/Proxmark/proxmark3) client
## Update Log: ## Update Log:
### V0.1.1
+ Complete Mifare module(support simulate and sniff)
### V0.1 ### V0.1
+ Able to deal with Mifare card and related files + Able to deal with Mifare card and related files

@ -28,6 +28,9 @@
## 更新日志: ## 更新日志:
### V0.1.1
+ 完成整个Mifare模块支持模拟卡和嗅探功能
### V0.1 ### V0.1
+ 支持处理Mifare卡片及相关数据文件 + 支持处理Mifare卡片及相关数据文件

@ -37,6 +37,84 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>MF_Sim_simDialog</name>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="14"/>
<source>Simulate</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="37"/>
<source>u</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="66"/>
<source>UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="87"/>
<source>n</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="116"/>
<source>Automatically exit simulation after &lt;numreads&gt; blocks have been read by reader. 0 = infinite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="137"/>
<source>i</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="150"/>
<source>Interactive, means that console will not be returned until simulation finishes or is aborted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="171"/>
<source>x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="184"/>
<source>Crack, performs the &apos;reader attack&apos;, nr/ar attack against a legitimate reader, fishes out the key(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="205"/>
<source>e</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="218"/>
<source>set keys found from &apos;reader attack&apos; to emulator memory (implies x and i)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="239"/>
<source>f</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="268"/>
<source>get UIDs to use for &apos;reader attack&apos; from file &apos;f &lt;filename.txt&gt;&apos; (implies x and i)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="289"/>
<source>r</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="302"/>
<source>Generate random nonces instead of sequential nonces. Standard reader attack won&apos;t work with this option, only moebius attack works</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>MF_UID_parameterDialog</name> <name>MF_UID_parameterDialog</name>
<message> <message>
@ -88,250 +166,255 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="113"/> <location filename="../ui/mainwindow.ui" line="110"/>
<source>Mifare</source> <source>Mifare</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="206"/> <location filename="../ui/mainwindow.ui" line="203"/>
<source>&gt;&gt;</source> <source>&gt;&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="231"/> <location filename="../ui/mainwindow.ui" line="228"/>
<source>&lt;&lt;</source> <source>&lt;&lt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="263"/> <location filename="../ui/mainwindow.ui" line="260"/>
<source>F</source> <source>F</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="320"/> <location filename="../ui/mainwindow.ui" line="317"/>
<source>Card Type</source> <source>Card Type</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="335"/> <location filename="../ui/mainwindow.ui" line="332"/>
<source>MINI</source> <source>MINI</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="342"/> <location filename="../ui/mainwindow.ui" line="339"/>
<source>1K</source> <source>1K</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="352"/> <location filename="../ui/mainwindow.ui" line="349"/>
<source>2K</source> <source>2K</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="359"/> <location filename="../ui/mainwindow.ui" line="356"/>
<source>4K</source> <source>4K</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="369"/> <location filename="../ui/mainwindow.ui" line="366"/>
<source>File</source> <source>File</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="387"/> <location filename="../ui/mainwindow.ui" line="384"/>
<location filename="../ui/mainwindow.ui" line="944"/> <location filename="../ui/mainwindow.ui" line="948"/>
<source>Load</source> <source>Load</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="400"/> <location filename="../ui/mainwindow.ui" line="397"/>
<location filename="../ui/mainwindow.ui" line="957"/> <location filename="../ui/mainwindow.ui" line="961"/>
<source>Save</source> <source>Save</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="420"/> <location filename="../ui/mainwindow.ui" line="417"/>
<location filename="../ui/mainwindow.cpp" line="534"/> <location filename="../ui/mainwindow.cpp" line="602"/>
<source>Data</source> <source>Data</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="430"/> <location filename="../ui/mainwindow.ui" line="427"/>
<source>Key</source> <source>Key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="440"/> <location filename="../ui/mainwindow.ui" line="437"/>
<source>Attack</source> <source>Attack</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="465"/> <location filename="../ui/mainwindow.ui" line="462"/>
<source>Card Info</source> <source>Card Info</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="478"/> <location filename="../ui/mainwindow.ui" line="475"/>
<source>Check Default</source> <source>Check Default</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="491"/> <location filename="../ui/mainwindow.ui" line="488"/>
<source>Nested</source> <source>Nested</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="498"/> <location filename="../ui/mainwindow.ui" line="495"/>
<source>Hardnested</source> <source>Hardnested</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="523"/> <location filename="../ui/mainwindow.ui" line="520"/>
<source>Read/Write</source> <source>Read/Write</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="533"/> <location filename="../ui/mainwindow.ui" line="530"/>
<source>Block:</source> <source>Block:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="565"/> <location filename="../ui/mainwindow.ui" line="562"/>
<source>Key:</source> <source>Key:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="584"/> <location filename="../ui/mainwindow.ui" line="581"/>
<source>Key Type:</source> <source>Key Type:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="604"/> <location filename="../ui/mainwindow.ui" line="601"/>
<source>A</source> <source>A</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="609"/> <location filename="../ui/mainwindow.ui" line="606"/>
<source>B</source> <source>B</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="632"/> <location filename="../ui/mainwindow.ui" line="614"/>
<source>Data:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="636"/>
<source>Normal(Require Password)</source> <source>Normal(Require Password)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="647"/> <location filename="../ui/mainwindow.ui" line="651"/>
<location filename="../ui/mainwindow.ui" line="736"/> <location filename="../ui/mainwindow.ui" line="740"/>
<source>Read Block</source> <source>Read Block</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="654"/> <location filename="../ui/mainwindow.ui" line="658"/>
<location filename="../ui/mainwindow.ui" line="743"/> <location filename="../ui/mainwindow.ui" line="747"/>
<source>Write Block</source> <source>Write Block</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="661"/> <location filename="../ui/mainwindow.ui" line="665"/>
<location filename="../ui/mainwindow.ui" line="750"/> <location filename="../ui/mainwindow.ui" line="754"/>
<location filename="../ui/mainwindow.ui" line="850"/> <location filename="../ui/mainwindow.ui" line="854"/>
<source>Read All</source> <source>Read All</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="668"/> <location filename="../ui/mainwindow.ui" line="672"/>
<location filename="../ui/mainwindow.ui" line="757"/> <location filename="../ui/mainwindow.ui" line="761"/>
<source>Write All</source> <source>Write All</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="687"/> <location filename="../ui/mainwindow.ui" line="691"/>
<source>Dump</source> <source>Dump</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="700"/> <location filename="../ui/mainwindow.ui" line="704"/>
<source>Restore</source> <source>Restore</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="710"/> <location filename="../ui/mainwindow.ui" line="714"/>
<source>Chinese Magic Card(Without Password)</source> <source>Chinese Magic Card(Without Password)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="722"/> <location filename="../ui/mainwindow.ui" line="726"/>
<source>Lock UFUID Card</source> <source>Lock UFUID Card</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="729"/> <location filename="../ui/mainwindow.ui" line="733"/>
<location filename="../ui/mainwindow.cpp" line="461"/> <location filename="../ui/mainwindow.cpp" line="461"/>
<source>About UID Card</source> <source>About UID Card</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="770"/> <location filename="../ui/mainwindow.ui" line="774"/>
<source>Set Parameter</source> <source>Set Parameter</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="789"/> <location filename="../ui/mainwindow.ui" line="793"/>
<source>Wipe</source> <source>Wipe</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="815"/> <location filename="../ui/mainwindow.ui" line="819"/>
<location filename="../ui/mainwindow.ui" line="870"/> <location filename="../ui/mainwindow.ui" line="874"/>
<source>Simulate</source> <source>Simulate</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="843"/> <location filename="../ui/mainwindow.ui" line="847"/>
<source>Load from data above</source> <source>Load from data above</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="413"/> <location filename="../ui/mainwindow.ui" line="410"/>
<location filename="../ui/mainwindow.ui" line="863"/> <location filename="../ui/mainwindow.ui" line="867"/>
<source>Clear</source> <source>Clear</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="893"/> <location filename="../ui/mainwindow.ui" line="897"/>
<location filename="../ui/mainwindow.ui" line="924"/> <location filename="../ui/mainwindow.ui" line="928"/>
<source>Sniff</source> <source>Sniff</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="931"/> <location filename="../ui/mainwindow.ui" line="935"/>
<source>List Sniff Data</source> <source>List Sniff Data</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="983"/> <location filename="../ui/mainwindow.ui" line="987"/>
<source>RawCommand</source> <source>RawCommand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1030"/> <location filename="../ui/mainwindow.ui" line="1034"/>
<location filename="../ui/mainwindow.cpp" line="143"/> <location filename="../ui/mainwindow.cpp" line="143"/>
<source>History:</source> <source>History:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1062"/> <location filename="../ui/mainwindow.ui" line="1066"/>
<source>ClearHistory</source> <source>ClearHistory</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1081"/> <location filename="../ui/mainwindow.ui" line="1085"/>
<source>Send</source> <source>Send</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1088"/> <location filename="../ui/mainwindow.ui" line="1092"/>
<source>ClearOutput</source> <source>ClearOutput</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -345,6 +428,8 @@
<location filename="../ui/mainwindow.cpp" line="291"/> <location filename="../ui/mainwindow.cpp" line="291"/>
<location filename="../ui/mainwindow.cpp" line="314"/> <location filename="../ui/mainwindow.cpp" line="314"/>
<location filename="../ui/mainwindow.cpp" line="327"/> <location filename="../ui/mainwindow.cpp" line="327"/>
<location filename="../ui/mainwindow.cpp" line="518"/>
<location filename="../ui/mainwindow.cpp" line="537"/>
<source>Info</source> <source>Info</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -361,7 +446,7 @@
<message> <message>
<location filename="../ui/mainwindow.cpp" line="95"/> <location filename="../ui/mainwindow.cpp" line="95"/>
<location filename="../ui/mainwindow.cpp" line="105"/> <location filename="../ui/mainwindow.cpp" line="105"/>
<location filename="../ui/mainwindow.cpp" line="524"/> <location filename="../ui/mainwindow.cpp" line="592"/>
<source>Not Connected</source> <source>Not Connected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -373,6 +458,7 @@
<message> <message>
<location filename="../ui/mainwindow.cpp" line="278"/> <location filename="../ui/mainwindow.cpp" line="278"/>
<location filename="../ui/mainwindow.cpp" line="291"/> <location filename="../ui/mainwindow.cpp" line="291"/>
<location filename="../ui/mainwindow.cpp" line="518"/>
<source>Failed to open</source> <source>Failed to open</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -430,6 +516,7 @@
<message> <message>
<location filename="../ui/mainwindow.cpp" line="314"/> <location filename="../ui/mainwindow.cpp" line="314"/>
<location filename="../ui/mainwindow.cpp" line="327"/> <location filename="../ui/mainwindow.cpp" line="327"/>
<location filename="../ui/mainwindow.cpp" line="537"/>
<source>Failed to save to</source> <source>Failed to save to</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -529,49 +616,69 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="525"/> <location filename="../ui/mainwindow.cpp" line="505"/>
<location filename="../ui/mainwindow.cpp" line="642"/> <source>Plz select the trace file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="506"/>
<source>Trace Files(*.trc);;All Files(*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="528"/>
<source>Plz select the location to save trace file:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="529"/>
<source>Trace Files(*.trc)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="593"/>
<location filename="../ui/mainwindow.cpp" line="710"/>
<source>Idle</source> <source>Idle</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="532"/> <location filename="../ui/mainwindow.cpp" line="600"/>
<location filename="../ui/mainwindow.cpp" line="541"/> <location filename="../ui/mainwindow.cpp" line="609"/>
<source>Sec</source> <source>Sec</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="533"/> <location filename="../ui/mainwindow.cpp" line="601"/>
<source>Blk</source> <source>Blk</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="542"/> <location filename="../ui/mainwindow.cpp" line="610"/>
<source>KeyA</source> <source>KeyA</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="543"/> <location filename="../ui/mainwindow.cpp" line="611"/>
<source>KeyB</source> <source>KeyB</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="579"/> <location filename="../ui/mainwindow.cpp" line="647"/>
<source>HW Version:</source> <source>HW Version:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="581"/> <location filename="../ui/mainwindow.cpp" line="649"/>
<source>PM3:</source> <source>PM3:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="583"/> <location filename="../ui/mainwindow.cpp" line="651"/>
<source>State:</source> <source>State:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="638"/> <location filename="../ui/mainwindow.cpp" line="706"/>
<source>Running</source> <source>Running</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -579,28 +686,28 @@
<context> <context>
<name>Mifare</name> <name>Mifare</name>
<message> <message>
<location filename="../module/mifare.cpp" line="289"/> <location filename="../module/mifare.cpp" line="310"/>
<location filename="../module/mifare.cpp" line="386"/> <location filename="../module/mifare.cpp" line="419"/>
<source>Success!</source> <source>Success!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="289"/> <location filename="../module/mifare.cpp" line="310"/>
<location filename="../module/mifare.cpp" line="293"/> <location filename="../module/mifare.cpp" line="314"/>
<location filename="../module/mifare.cpp" line="386"/> <location filename="../module/mifare.cpp" line="419"/>
<location filename="../module/mifare.cpp" line="390"/> <location filename="../module/mifare.cpp" line="423"/>
<location filename="../module/mifare.cpp" line="425"/> <location filename="../module/mifare.cpp" line="473"/>
<source>Info</source> <source>Info</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="293"/> <location filename="../module/mifare.cpp" line="314"/>
<location filename="../module/mifare.cpp" line="390"/> <location filename="../module/mifare.cpp" line="423"/>
<source>Failed!</source> <source>Failed!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="425"/> <location filename="../module/mifare.cpp" line="473"/>
<source>Failed to read card.</source> <source>Failed to read card.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

@ -45,6 +45,92 @@
<translation type="vanished"></translation> <translation type="vanished"></translation>
</message> </message>
</context> </context>
<context>
<name>MF_Sim_simDialog</name>
<message>
<source>Dialog</source>
<translation type="obsolete"></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="14"/>
<source>Simulate</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="37"/>
<source>u</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="66"/>
<source>UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used</source>
<translation>47UID使4UID</translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="87"/>
<source>n</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="116"/>
<source>Automatically exit simulation after &lt;numreads&gt; blocks have been read by reader. 0 = infinite</source>
<translation>&lt;n&gt;退n0退</translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="137"/>
<source>i</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="150"/>
<source>Interactive, means that console will not be returned until simulation finishes or is aborted</source>
<translation>PM3使</translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="171"/>
<source>x</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="184"/>
<source>Crack, performs the &apos;reader attack&apos;, nr/ar attack against a legitimate reader, fishes out the key(s)</source>
<translation>nr/ar()</translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="205"/>
<source>e</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="218"/>
<source>set keys found from &apos;reader attack&apos; to emulator memory (implies x and i)</source>
<translation>xi</translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="239"/>
<source>f</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="268"/>
<source>get UIDs to use for &apos;reader attack&apos; from file &apos;f &lt;filename.txt&gt;&apos; (implies x and i)</source>
<translation>&lt;filename.txt&gt;UIDxi</translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="289"/>
<source>r</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mf_sim_simdialog.ui" line="302"/>
<source>Generate random nonces instead of sequential nonces. Standard reader attack won&apos;t work with this option, only moebius attack works</source>
<translation>noncenoncePM3moebius</translation>
</message>
<message>
<source> Generate random nonces instead of sequential nonces. Standard reader attack won&apos;t work with this option, only moebius attack works.</source>
<translation type="vanished">noncenoncePM3moebius</translation>
</message>
</context>
<context> <context>
<name>MF_UID_parameterDialog</name> <name>MF_UID_parameterDialog</name>
<message> <message>
@ -104,250 +190,255 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="113"/> <location filename="../ui/mainwindow.ui" line="110"/>
<source>Mifare</source> <source>Mifare</source>
<translation>Mifare(IC)</translation> <translation>Mifare(IC)</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="206"/> <location filename="../ui/mainwindow.ui" line="203"/>
<source>&gt;&gt;</source> <source>&gt;&gt;</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="231"/> <location filename="../ui/mainwindow.ui" line="228"/>
<source>&lt;&lt;</source> <source>&lt;&lt;</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="263"/> <location filename="../ui/mainwindow.ui" line="260"/>
<source>F</source> <source>F</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="320"/> <location filename="../ui/mainwindow.ui" line="317"/>
<source>Card Type</source> <source>Card Type</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="335"/> <location filename="../ui/mainwindow.ui" line="332"/>
<source>MINI</source> <source>MINI</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="342"/> <location filename="../ui/mainwindow.ui" line="339"/>
<source>1K</source> <source>1K</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="352"/> <location filename="../ui/mainwindow.ui" line="349"/>
<source>2K</source> <source>2K</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="359"/> <location filename="../ui/mainwindow.ui" line="356"/>
<source>4K</source> <source>4K</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="369"/> <location filename="../ui/mainwindow.ui" line="366"/>
<source>File</source> <source>File</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="387"/> <location filename="../ui/mainwindow.ui" line="384"/>
<location filename="../ui/mainwindow.ui" line="944"/> <location filename="../ui/mainwindow.ui" line="948"/>
<source>Load</source> <source>Load</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="400"/> <location filename="../ui/mainwindow.ui" line="397"/>
<location filename="../ui/mainwindow.ui" line="957"/> <location filename="../ui/mainwindow.ui" line="961"/>
<source>Save</source> <source>Save</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="420"/> <location filename="../ui/mainwindow.ui" line="417"/>
<location filename="../ui/mainwindow.cpp" line="534"/> <location filename="../ui/mainwindow.cpp" line="602"/>
<source>Data</source> <source>Data</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="430"/> <location filename="../ui/mainwindow.ui" line="427"/>
<source>Key</source> <source>Key</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="440"/> <location filename="../ui/mainwindow.ui" line="437"/>
<source>Attack</source> <source>Attack</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="465"/> <location filename="../ui/mainwindow.ui" line="462"/>
<source>Card Info</source> <source>Card Info</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="478"/> <location filename="../ui/mainwindow.ui" line="475"/>
<source>Check Default</source> <source>Check Default</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="491"/> <location filename="../ui/mainwindow.ui" line="488"/>
<source>Nested</source> <source>Nested</source>
<translation>Nested</translation> <translation>Nested</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="498"/> <location filename="../ui/mainwindow.ui" line="495"/>
<source>Hardnested</source> <source>Hardnested</source>
<translation>Hardested</translation> <translation>Hardested</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="523"/> <location filename="../ui/mainwindow.ui" line="520"/>
<source>Read/Write</source> <source>Read/Write</source>
<translation>/</translation> <translation>/</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="533"/> <location filename="../ui/mainwindow.ui" line="530"/>
<source>Block:</source> <source>Block:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="565"/> <location filename="../ui/mainwindow.ui" line="562"/>
<source>Key:</source> <source>Key:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="584"/> <location filename="../ui/mainwindow.ui" line="581"/>
<source>Key Type:</source> <source>Key Type:</source>
<translation>Key</translation> <translation>Key</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="604"/> <location filename="../ui/mainwindow.ui" line="601"/>
<source>A</source> <source>A</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="609"/> <location filename="../ui/mainwindow.ui" line="606"/>
<source>B</source> <source>B</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="632"/> <location filename="../ui/mainwindow.ui" line="614"/>
<source>Data:</source>
<translation></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="636"/>
<source>Normal(Require Password)</source> <source>Normal(Require Password)</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="647"/> <location filename="../ui/mainwindow.ui" line="651"/>
<location filename="../ui/mainwindow.ui" line="736"/> <location filename="../ui/mainwindow.ui" line="740"/>
<source>Read Block</source> <source>Read Block</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="654"/> <location filename="../ui/mainwindow.ui" line="658"/>
<location filename="../ui/mainwindow.ui" line="743"/> <location filename="../ui/mainwindow.ui" line="747"/>
<source>Write Block</source> <source>Write Block</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="661"/> <location filename="../ui/mainwindow.ui" line="665"/>
<location filename="../ui/mainwindow.ui" line="750"/> <location filename="../ui/mainwindow.ui" line="754"/>
<location filename="../ui/mainwindow.ui" line="850"/> <location filename="../ui/mainwindow.ui" line="854"/>
<source>Read All</source> <source>Read All</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="668"/> <location filename="../ui/mainwindow.ui" line="672"/>
<location filename="../ui/mainwindow.ui" line="757"/> <location filename="../ui/mainwindow.ui" line="761"/>
<source>Write All</source> <source>Write All</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="687"/> <location filename="../ui/mainwindow.ui" line="691"/>
<source>Dump</source> <source>Dump</source>
<translation>Dump</translation> <translation>Dump</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="700"/> <location filename="../ui/mainwindow.ui" line="704"/>
<source>Restore</source> <source>Restore</source>
<translation>Restore</translation> <translation>Restore</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="710"/> <location filename="../ui/mainwindow.ui" line="714"/>
<source>Chinese Magic Card(Without Password)</source> <source>Chinese Magic Card(Without Password)</source>
<translation>UID</translation> <translation>UID</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="722"/> <location filename="../ui/mainwindow.ui" line="726"/>
<source>Lock UFUID Card</source> <source>Lock UFUID Card</source>
<translation>UFUID</translation> <translation>UFUID</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="729"/> <location filename="../ui/mainwindow.ui" line="733"/>
<location filename="../ui/mainwindow.cpp" line="461"/> <location filename="../ui/mainwindow.cpp" line="461"/>
<source>About UID Card</source> <source>About UID Card</source>
<translation>UID</translation> <translation>UID</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="770"/> <location filename="../ui/mainwindow.ui" line="774"/>
<source>Set Parameter</source> <source>Set Parameter</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="789"/> <location filename="../ui/mainwindow.ui" line="793"/>
<source>Wipe</source> <source>Wipe</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="815"/> <location filename="../ui/mainwindow.ui" line="819"/>
<location filename="../ui/mainwindow.ui" line="870"/> <location filename="../ui/mainwindow.ui" line="874"/>
<source>Simulate</source> <source>Simulate</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="843"/> <location filename="../ui/mainwindow.ui" line="847"/>
<source>Load from data above</source> <source>Load from data above</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="413"/> <location filename="../ui/mainwindow.ui" line="410"/>
<location filename="../ui/mainwindow.ui" line="863"/> <location filename="../ui/mainwindow.ui" line="867"/>
<source>Clear</source> <source>Clear</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="893"/> <location filename="../ui/mainwindow.ui" line="897"/>
<location filename="../ui/mainwindow.ui" line="924"/> <location filename="../ui/mainwindow.ui" line="928"/>
<source>Sniff</source> <source>Sniff</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="931"/> <location filename="../ui/mainwindow.ui" line="935"/>
<source>List Sniff Data</source> <source>List Sniff Data</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="983"/> <location filename="../ui/mainwindow.ui" line="987"/>
<source>RawCommand</source> <source>RawCommand</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1030"/> <location filename="../ui/mainwindow.ui" line="1034"/>
<location filename="../ui/mainwindow.cpp" line="143"/> <location filename="../ui/mainwindow.cpp" line="143"/>
<source>History:</source> <source>History:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1062"/> <location filename="../ui/mainwindow.ui" line="1066"/>
<source>ClearHistory</source> <source>ClearHistory</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1081"/> <location filename="../ui/mainwindow.ui" line="1085"/>
<source>Send</source> <source>Send</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.ui" line="1088"/> <location filename="../ui/mainwindow.ui" line="1092"/>
<source>ClearOutput</source> <source>ClearOutput</source>
<translation></translation> <translation></translation>
</message> </message>
@ -361,6 +452,8 @@
<location filename="../ui/mainwindow.cpp" line="291"/> <location filename="../ui/mainwindow.cpp" line="291"/>
<location filename="../ui/mainwindow.cpp" line="314"/> <location filename="../ui/mainwindow.cpp" line="314"/>
<location filename="../ui/mainwindow.cpp" line="327"/> <location filename="../ui/mainwindow.cpp" line="327"/>
<location filename="../ui/mainwindow.cpp" line="518"/>
<location filename="../ui/mainwindow.cpp" line="537"/>
<source>Info</source> <source>Info</source>
<translation></translation> <translation></translation>
</message> </message>
@ -377,7 +470,7 @@
<message> <message>
<location filename="../ui/mainwindow.cpp" line="95"/> <location filename="../ui/mainwindow.cpp" line="95"/>
<location filename="../ui/mainwindow.cpp" line="105"/> <location filename="../ui/mainwindow.cpp" line="105"/>
<location filename="../ui/mainwindow.cpp" line="524"/> <location filename="../ui/mainwindow.cpp" line="592"/>
<source>Not Connected</source> <source>Not Connected</source>
<translation></translation> <translation></translation>
</message> </message>
@ -398,6 +491,7 @@ Continue?</source>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="278"/> <location filename="../ui/mainwindow.cpp" line="278"/>
<location filename="../ui/mainwindow.cpp" line="291"/> <location filename="../ui/mainwindow.cpp" line="291"/>
<location filename="../ui/mainwindow.cpp" line="518"/>
<source>Failed to open</source> <source>Failed to open</source>
<translation></translation> <translation></translation>
</message> </message>
@ -467,6 +561,7 @@ Continue?</source>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="314"/> <location filename="../ui/mainwindow.cpp" line="314"/>
<location filename="../ui/mainwindow.cpp" line="327"/> <location filename="../ui/mainwindow.cpp" line="327"/>
<location filename="../ui/mainwindow.cpp" line="537"/>
<source>Failed to save to</source> <source>Failed to save to</source>
<translation></translation> <translation></translation>
</message> </message>
@ -566,49 +661,69 @@ Continue?</source>
<translation> UIDNested</translation> <translation> UIDNested</translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="525"/> <location filename="../ui/mainwindow.cpp" line="505"/>
<location filename="../ui/mainwindow.cpp" line="642"/> <source>Plz select the trace file:</source>
<translation>trace</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="506"/>
<source>Trace Files(*.trc);;All Files(*.*)</source>
<translation>Trace(*.trc);;(*.*)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="528"/>
<source>Plz select the location to save trace file:</source>
<translation>trace</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="529"/>
<source>Trace Files(*.trc)</source>
<translation>Trace(*.trc)</translation>
</message>
<message>
<location filename="../ui/mainwindow.cpp" line="593"/>
<location filename="../ui/mainwindow.cpp" line="710"/>
<source>Idle</source> <source>Idle</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="532"/> <location filename="../ui/mainwindow.cpp" line="600"/>
<location filename="../ui/mainwindow.cpp" line="541"/> <location filename="../ui/mainwindow.cpp" line="609"/>
<source>Sec</source> <source>Sec</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="533"/> <location filename="../ui/mainwindow.cpp" line="601"/>
<source>Blk</source> <source>Blk</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="542"/> <location filename="../ui/mainwindow.cpp" line="610"/>
<source>KeyA</source> <source>KeyA</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="543"/> <location filename="../ui/mainwindow.cpp" line="611"/>
<source>KeyB</source> <source>KeyB</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="579"/> <location filename="../ui/mainwindow.cpp" line="647"/>
<source>HW Version:</source> <source>HW Version:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="581"/> <location filename="../ui/mainwindow.cpp" line="649"/>
<source>PM3:</source> <source>PM3:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="583"/> <location filename="../ui/mainwindow.cpp" line="651"/>
<source>State:</source> <source>State:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../ui/mainwindow.cpp" line="638"/> <location filename="../ui/mainwindow.cpp" line="706"/>
<source>Running</source> <source>Running</source>
<translation></translation> <translation></translation>
</message> </message>
@ -620,28 +735,28 @@ Continue?</source>
<translation type="vanished"></translation> <translation type="vanished"></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="289"/> <location filename="../module/mifare.cpp" line="310"/>
<location filename="../module/mifare.cpp" line="386"/> <location filename="../module/mifare.cpp" line="419"/>
<source>Success!</source> <source>Success!</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="289"/> <location filename="../module/mifare.cpp" line="310"/>
<location filename="../module/mifare.cpp" line="293"/> <location filename="../module/mifare.cpp" line="314"/>
<location filename="../module/mifare.cpp" line="386"/> <location filename="../module/mifare.cpp" line="419"/>
<location filename="../module/mifare.cpp" line="390"/> <location filename="../module/mifare.cpp" line="423"/>
<location filename="../module/mifare.cpp" line="425"/> <location filename="../module/mifare.cpp" line="473"/>
<source>Info</source> <source>Info</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="293"/> <location filename="../module/mifare.cpp" line="314"/>
<location filename="../module/mifare.cpp" line="390"/> <location filename="../module/mifare.cpp" line="423"/>
<source>Failed!</source> <source>Failed!</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../module/mifare.cpp" line="425"/> <location filename="../module/mifare.cpp" line="473"/>
<source>Failed to read card.</source> <source>Failed to read card.</source>
<translation></translation> <translation></translation>
</message> </message>

@ -1,6 +1,6 @@
#include "mifare.h" #include "mifare.h"
Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QWidget *parent) : QObject(parent) Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QWidget *parent): QObject(parent)
{ {
this->parent = parent; this->parent = parent;
util = addr; util = addr;
@ -16,8 +16,6 @@ Mifare::Mifare(Ui::MainWindow *ui, Util *addr, QWidget *parent) : QObject(parent
nestedKeyPattern = new QRegExp("\\|\\d{3}\\|.+\\|.+\\|.+\\|.+\\|"); nestedKeyPattern = new QRegExp("\\|\\d{3}\\|.+\\|.+\\|.+\\|.+\\|");
} }
QString Mifare::info(bool isRequiringOutput) QString Mifare::info(bool isRequiringOutput)
{ {
if(isRequiringOutput) if(isRequiringOutput)
@ -47,14 +45,19 @@ QString Mifare::info(bool isRequiringOutput)
void Mifare::chk() void Mifare::chk()
{ {
QString result = util->execCMDWithOutput("hf mf chk *" + QString::number(cardType.type) + " ?", 1000 + cardType.type * 1000); QString result = util->execCMDWithOutput(
"hf mf chk *"
+ QString::number(cardType.type)
+ " ?",
1000 + cardType.type * 1000);
qDebug() << result; qDebug() << result;
int offset = 0; int offset = 0;
QString tmp, tmp2; QString tmp, tmp2;
for(int i = 0; i < cardType.sectors; i++) for(int i = 0; i < cardType.sectors; i++)
{ {
offset = result.indexOf(*chkKeyPattern, offset); offset = chkKeyPattern->indexIn(result, offset);
// offset = result.indexOf(*chkKeyPattern, offset);
tmp = result.mid(offset, 39).toUpper(); tmp = result.mid(offset, 39).toUpper();
offset += 39; offset += 39;
qDebug() << tmp << offset; qDebug() << tmp << offset;
@ -70,13 +73,17 @@ void Mifare::chk()
void Mifare::nested() void Mifare::nested()
{ {
QString result = util->execCMDWithOutput("hf mf nested " + QString::number(cardType.type) + " *"); QString result = util->execCMDWithOutput(
"hf mf nested "
+ QString::number(cardType.type)
+ " *");
int offset = 0; int offset = 0;
QString tmp; QString tmp;
for(int i = 0; i < cardType.sectors; i++) for(int i = 0; i < cardType.sectors; i++)
{ {
offset = result.indexOf(*nestedKeyPattern, offset); offset = nestedKeyPattern->indexIn(result, offset);
// offset = result.indexOf(*nestedKeyPattern, offset);
tmp = result.mid(offset, 47).toUpper(); tmp = result.mid(offset, 47).toUpper();
offset += 47; offset += 47;
if(tmp.at(23) == '1') if(tmp.at(23) == '1')
@ -111,15 +118,17 @@ void Mifare::read()
{ {
int waitTime = 300; int waitTime = 300;
int currblk = ui->MF_RW_blockBox->currentText().toInt(); int currblk = ui->MF_RW_blockBox->currentText().toInt();
QString result = util->execCMDWithOutput("hf mf rdbl " QString result = util->execCMDWithOutput(
"hf mf rdbl "
+ QString::number(currblk) + QString::number(currblk)
+ " " + " "
+ ui->MF_RW_keyTypeBox->currentText() + ui->MF_RW_keyTypeBox->currentText()
+ " " + " "
+ ui->MF_RW_keyEdit->text(), waitTime); + ui->MF_RW_keyEdit->text(),
waitTime);
if(result.indexOf("isOk:01") != -1) if(result.indexOf("isOk:01") != -1)
{ {
result = result.mid(result.indexOf(*dataPattern, 0), 47).toUpper(); result = result.mid(dataPattern->indexIn(result), 47).toUpper();
if((currblk < 128 && ((currblk + 1) % 4 == 0)) || ((currblk + 1) % 8 == 0)) // process key block if((currblk < 128 && ((currblk + 1) % 4 == 0)) || ((currblk + 1) % 8 == 0)) // process key block
{ {
if(ui->MF_RW_keyTypeBox->currentText() == "A") if(ui->MF_RW_keyTypeBox->currentText() == "A")
@ -130,10 +139,12 @@ void Mifare::read()
} }
ui->MF_RW_dataEdit->setText(result); ui->MF_RW_dataEdit->setText(result);
QString tmpKey = result.right(18).replace(" ", ""); QString tmpKey = result.right(18).replace(" ", "");
result = util->execCMDWithOutput("hf mf rdbl " result = util->execCMDWithOutput(
"hf mf rdbl "
+ ui->MF_RW_keyTypeBox->currentText() + ui->MF_RW_keyTypeBox->currentText()
+ " B " + " B "
+ tmpKey, waitTime); + tmpKey,
waitTime);
if(result.indexOf("isOk:01") == -1) if(result.indexOf("isOk:01") == -1)
{ {
result = ui->MF_RW_dataEdit->text(); result = ui->MF_RW_dataEdit->text();
@ -145,7 +156,10 @@ void Mifare::read()
{ {
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
{ {
result = result.replace(30 + i * 3, 2, ui->MF_RW_keyEdit->text().mid(i * 2, 2)); result = result.replace(
30 + i * 3,
2,
ui->MF_RW_keyEdit->text().mid(i * 2, 2));
} }
result = result.replace(0, 18, "?? ?? ?? ?? ?? ?? "); result = result.replace(0, 18, "?? ?? ?? ?? ?? ?? ");
ui->MF_RW_dataEdit->setText(result); ui->MF_RW_dataEdit->setText(result);
@ -176,10 +190,12 @@ void Mifare::readAll()
// check keys and read the first block of each sector // check keys and read the first block of each sector
if(data_isKeyValid(keyAList->at(i))) if(data_isKeyValid(keyAList->at(i)))
{ {
result = util->execCMDWithOutput("hf mf rdsc " result = util->execCMDWithOutput(
"hf mf rdsc "
+ QString::number(i) + QString::number(i)
+ " A " + " A "
+ keyAList->at(i), waitTime); + keyAList->at(i),
waitTime);
qDebug() << result; qDebug() << result;
offset = result.indexOf("isOk:01"); offset = result.indexOf("isOk:01");
if(offset != -1) if(offset != -1)
@ -187,7 +203,8 @@ void Mifare::readAll()
isKeyAValid = true; isKeyAValid = true;
for(int j = 0; j < cardType.blk[i]; j++) for(int j = 0; j < cardType.blk[i]; j++)
{ {
offset = result.indexOf(*dataPattern, offset); offset = dataPattern->indexIn(result, offset);
// offset = result.indexOf(*dataPattern, offset);
tmp = result.mid(offset, 47).toUpper(); tmp = result.mid(offset, 47).toUpper();
offset += 47; offset += 47;
qDebug() << tmp; qDebug() << tmp;
@ -199,10 +216,12 @@ void Mifare::readAll()
} }
if(data_isKeyValid(keyBList->at(i))) if(data_isKeyValid(keyBList->at(i)))
{ {
result = util->execCMDWithOutput("hf mf rdsc " result = util->execCMDWithOutput(
"hf mf rdsc "
+ QString::number(i) + QString::number(i)
+ " B " + " B "
+ keyBList->at(i), waitTime); + keyBList->at(i),
waitTime);
qDebug() << result; qDebug() << result;
offset = result.indexOf("isOk:01"); offset = result.indexOf("isOk:01");
if(offset != -1) if(offset != -1)
@ -210,7 +229,8 @@ void Mifare::readAll()
isKeyBValid = true; isKeyBValid = true;
for(int j = 0; j < cardType.blk[i]; j++) for(int j = 0; j < cardType.blk[i]; j++)
{ {
offset = result.indexOf(*dataPattern, offset); offset = dataPattern->indexIn(result, offset);
// offset = result.indexOf(*dataPattern, offset);
tmp = result.mid(offset, 47).toUpper(); tmp = result.mid(offset, 47).toUpper();
offset += 47; offset += 47;
qDebug() << tmp; qDebug() << tmp;
@ -227,7 +247,8 @@ void Mifare::readAll()
// fill the MF_dataWidget with the known valid key // fill the MF_dataWidget with the known valid key
// //
// check whether the MF_dataWidget contains the valid key, // check whether the MF_dataWidget contains the valid key,
// and fill MF_keyWidget(when you only have KeyA but the ReadBlock output contains the KeyB) // and fill MF_keyWidget(when you only have KeyA but the ReadBlock output
// contains the KeyB)
// //
// the structure is not symmetric, since you cannot get KeyA from output // the structure is not symmetric, since you cannot get KeyA from output
// this program will only process the provided KeyA(in MF_keyWidget) // this program will only process the provided KeyA(in MF_keyWidget)
@ -250,11 +271,14 @@ void Mifare::readAll()
} }
else // now isKeyAValid == true, the output might contains the KeyB else // now isKeyAValid == true, the output might contains the KeyB
{ {
QString tmpKey = dataList->at(cardType.blks[i] + cardType.blk[i] - 1).right(12); QString tmpKey =
result = util->execCMDWithOutput("hf mf rdbl " dataList->at(cardType.blks[i] + cardType.blk[i] - 1).right(12);
result = util->execCMDWithOutput(
"hf mf rdbl "
+ QString::number(cardType.blks[i] + cardType.blk[i] - 1) + QString::number(cardType.blks[i] + cardType.blk[i] - 1)
+ " B " + " B "
+ tmpKey, waitTime); + tmpKey,
waitTime);
if(result.indexOf("isOk:01") != -1) if(result.indexOf("isOk:01") != -1)
{ {
keyBList->replace(i, tmpKey); keyBList->replace(i, tmpKey);
@ -265,7 +289,6 @@ void Mifare::readAll()
result = dataList->at(cardType.blks[i] + cardType.blk[i] - 1); result = dataList->at(cardType.blks[i] + cardType.blk[i] - 1);
result = result.replace(20, 12, "????????????"); result = result.replace(20, 12, "????????????");
dataList->replace(cardType.blks[i] + cardType.blk[i] - 1, result); dataList->replace(cardType.blks[i] + cardType.blk[i] - 1, result);
} }
} }
data_syncWithDataWidget(false, cardType.blks[i] + cardType.blk[i] - 1); data_syncWithDataWidget(false, cardType.blks[i] + cardType.blk[i] - 1);
@ -276,14 +299,12 @@ void Mifare::readAll()
void Mifare::write() void Mifare::write()
{ {
int waitTime = 300; int waitTime = 300;
QString result = util->execCMDWithOutput("hf mf wrbl " QString result = util->execCMDWithOutput(
+ ui->MF_RW_blockBox->currentText() "hf mf wrbl " + ui->MF_RW_blockBox->currentText() + " " +
+ " " ui->MF_RW_keyTypeBox->currentText() + " " +
+ ui->MF_RW_keyTypeBox->currentText() ui->MF_RW_keyEdit->text() + " " +
+ " " ui->MF_RW_dataEdit->text().replace(" ", ""),
+ ui->MF_RW_keyEdit->text() waitTime);
+ " "
+ ui->MF_RW_dataEdit->text().replace(" ", ""), waitTime);
if(result.indexOf("isOk:01") != -1) if(result.indexOf("isOk:01") != -1)
{ {
QMessageBox::information(parent, tr("Info"), tr("Success!")); QMessageBox::information(parent, tr("Info"), tr("Success!"));
@ -302,27 +323,32 @@ void Mifare::writeAll()
{ {
for(int j = 0; j < cardType.blk[i]; j++) for(int j = 0; j < cardType.blk[i]; j++)
{ {
result = ""; // if the KeyA is invalid and the result is not empty, the KeyB will not be tested. result = ""; // if the KeyA is invalid and the result is not empty, the
// KeyB will not be tested.
if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?')) if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?'))
continue; continue;
if(data_isKeyValid(keyAList->at(i))) if(data_isKeyValid(keyAList->at(i)))
{ {
result = util->execCMDWithOutput("hf mf wrbl " result = util->execCMDWithOutput(
+ QString::number(cardType.blks[i] + j) "hf mf wrbl " +
QString::number(cardType.blks[i] + j)
+ " A " + " A "
+ keyAList->at(i) + keyAList->at(i)
+ " " + " "
+ dataList->at(cardType.blks[i] + j), waitTime); + dataList->at(cardType.blks[i] + j),
waitTime);
} }
qDebug() << i << j << result.indexOf("isOk:01") << data_isKeyValid(keyBList->at(i)); qDebug() << i << j << result.indexOf("isOk:01") << data_isKeyValid(keyBList->at(i));
if(result.indexOf("isOk:01") == -1 && data_isKeyValid(keyBList->at(i))) if(result.indexOf("isOk:01") == -1 && data_isKeyValid(keyBList->at(i)))
{ {
result = util->execCMDWithOutput("hf mf wrbl " result = util->execCMDWithOutput(
"hf mf wrbl "
+ QString::number(cardType.blks[i] + j) + QString::number(cardType.blks[i] + j)
+ " B " + " B "
+ keyBList->at(i) + keyBList->at(i)
+ " " + " "
+ dataList->at(cardType.blks[i] + j), waitTime); + dataList->at(cardType.blks[i] + j),
waitTime);
} }
} }
} }
@ -332,11 +358,13 @@ void Mifare::readC()
{ {
int waitTime = 300; int waitTime = 300;
int currblk = ui->MF_RW_blockBox->currentText().toInt(); int currblk = ui->MF_RW_blockBox->currentText().toInt();
QString result = util->execCMDWithOutput("hf mf cgetblk " QString result = util->execCMDWithOutput(
+ QString::number(currblk), waitTime); "hf mf cgetblk "
+ QString::number(currblk),
waitTime);
if(result.indexOf("No chinese") == -1) if(result.indexOf("No chinese") == -1)
{ {
result = result.mid(result.indexOf(*dataPattern, 0), 47).toUpper(); result = result.mid(dataPattern->indexIn(result), 47).toUpper();
ui->MF_RW_dataEdit->setText(result); ui->MF_RW_dataEdit->setText(result);
} }
} }
@ -350,15 +378,18 @@ void Mifare::readAllC()
int offset = 0; int offset = 0;
for(int i = 0; i < cardType.sectors; i++) for(int i = 0; i < cardType.sectors; i++)
{ {
result = util->execCMDWithOutput("hf mf cgetsc " result = util->execCMDWithOutput(
+ QString::number(i), waitTime); "hf mf cgetsc "
+ QString::number(i),
waitTime);
qDebug() << result; qDebug() << result;
if(result.indexOf("No chinese") == -1) if(result.indexOf("No chinese") == -1)
{ {
offset = 0; offset = 0;
for(int j = 0; j < cardType.blk[i]; j++) for(int j = 0; j < cardType.blk[i]; j++)
{ {
offset = result.indexOf(*dataPattern, offset); offset = dataPattern->indexIn(result, offset);
// offset = result.indexOf(*dataPattern, offset);
tmp = result.mid(offset, 47).toUpper(); tmp = result.mid(offset, 47).toUpper();
offset += 47; offset += 47;
qDebug() << tmp; qDebug() << tmp;
@ -377,10 +408,12 @@ void Mifare::readAllC()
void Mifare::writeC() void Mifare::writeC()
{ {
int waitTime = 150; int waitTime = 150;
QString result = util->execCMDWithOutput("hf mf csetblk " QString result = util->execCMDWithOutput(
"hf mf csetblk "
+ ui->MF_RW_blockBox->currentText() + ui->MF_RW_blockBox->currentText()
+ " " + " "
+ ui->MF_RW_dataEdit->text().replace(" ", ""), waitTime); + ui->MF_RW_dataEdit->text().replace(" ", ""),
waitTime);
if(result.indexOf("No chinese") == -1) if(result.indexOf("No chinese") == -1)
{ {
QMessageBox::information(parent, tr("Info"), tr("Success!")); QMessageBox::information(parent, tr("Info"), tr("Success!"));
@ -399,20 +432,35 @@ void Mifare::writeAllC()
{ {
for(int j = 0; j < cardType.blk[i]; j++) for(int j = 0; j < cardType.blk[i]; j++)
{ {
result = ""; // if the KeyA is invalid and the result is not empty, the KeyB will not be tested. result = "";
if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?')) if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?'))
continue; continue;
result = util->execCMDWithOutput("hf mf csetblk " result = util->execCMDWithOutput(
"hf mf csetblk "
+ QString::number(cardType.blks[i] + j) + QString::number(cardType.blks[i] + j)
+ " " + " "
+ dataList->at(cardType.blks[i] + j), waitTime); + dataList->at(cardType.blks[i] + j),
waitTime);
} }
} }
} }
void Mifare::dump()
{
util->execCMD("hf mf dump");
ui->funcTab->setCurrentIndex(1);
}
void Mifare::restore()
{
util->execCMD("hf mf restore");
ui->funcTab->setCurrentIndex(1);
}
void Mifare::wipeC() void Mifare::wipeC()
{ {
util->execCMD("hf mf cwipe " util->execCMD(
"hf mf cwipe "
+ QString::number(cardType.type) + QString::number(cardType.type)
+ " f"); + " f");
ui->funcTab->setCurrentIndex(1); ui->funcTab->setCurrentIndex(1);
@ -446,15 +494,91 @@ void Mifare::lockC()
util->execCMD("hf 14a raw 52"); util->execCMD("hf 14a raw 52");
} }
void Mifare::dump() void Mifare::writeAllE()
{ {
util->execCMD("hf mf dump"); const int waitTime = 200;
QString result;
for(int i = 0; i < cardType.sectors; i++)
{
for(int j = 0; j < cardType.blk[i]; j++)
{
result = "";
if(data_isDataValid(dataList->at(cardType.blks[i] + j)) != DATA_NOSPACE || dataList->at(cardType.blks[i] + j).contains('?'))
continue;
result = util->execCMDWithOutput(
"hf mf eset "
+ QString::number(cardType.blks[i] + j)
+ " "
+ dataList->at(cardType.blks[i] + j),
waitTime);
}
}
util->execCMDWithOutput("hf mf eget", waitTime); // to refresh output buffer;
}
void Mifare::readAllE()
{
QString result;
const int waitTime = 200;
QString tmp;
int offset = 0;
for(int i = 0; i < cardType.sectors; i++)
{
offset = 0;
for(int j = 0; j < cardType.blk[i]; j++)
{
qDebug() << "**********" ;
result = util->execCMDWithOutput(
"hf mf eget "
+ QString::number(cardType.blks[i] + j),
waitTime);
qDebug() << result ;
offset = dataPattern->indexIn(result);
// offset = result.indexOf(*dataPattern, offset); // When I find the data position in this way, the Regex might fail to match.
tmp = result.mid(offset, 47).toUpper();
qDebug() << tmp << offset;
qDebug() << "**********" ;
if(offset == -1)
continue;
tmp.replace(" ", "");
dataList->replace(cardType.blks[i] + j, tmp);
data_syncWithDataWidget(false, cardType.blks[i] + j);
}
keyAList->replace(i, dataList->at(cardType.blks[i] + cardType.blk[i] - 1).left(12));
keyBList->replace(i, dataList->at(cardType.blks[i] + cardType.blk[i] - 1).right(12));
data_syncWithKeyWidget(false, i, true);
data_syncWithKeyWidget(false, i, false);
}
}
void Mifare::wipeE()
{
util->execCMD("hf mf eclr");
}
void Mifare::simulate()
{
MF_Sim_simDialog dialog(cardType.type);
connect(&dialog, &MF_Sim_simDialog::sendCMD, util, &Util::execCMD);
if(dialog.exec() == QDialog::Accepted)
ui->funcTab->setCurrentIndex(1); ui->funcTab->setCurrentIndex(1);
} }
void Mifare::restore() void Mifare::loadSniff(const QString& file)
{ {
util->execCMD("hf mf restore"); util->execCMD("hf list mf -l " + file);
ui->funcTab->setCurrentIndex(1);
}
void Mifare::saveSniff(const QString& file)
{
util->execCMD("hf list mf -s " + file);
ui->funcTab->setCurrentIndex(1); ui->funcTab->setCurrentIndex(1);
} }
@ -531,7 +655,7 @@ void Mifare::data_clearKey()
} }
} }
bool Mifare::data_isKeyValid(const QString& key) bool Mifare::data_isKeyValid(const QString &key)
{ {
if(key.length() != 12) if(key.length() != 12)
return false; return false;
@ -543,7 +667,8 @@ bool Mifare::data_isKeyValid(const QString& key)
return true; return true;
} }
Mifare::DataType Mifare::data_isDataValid(QString data) // "?" will not been processd there Mifare::DataType
Mifare::data_isDataValid(QString data) // "?" will not been processd there
{ {
if(data.length() == 47) if(data.length() == 47)
{ {
@ -597,7 +722,7 @@ void Mifare::setCardType(int type)
} }
} }
bool Mifare::data_loadDataFile(const QString& filename) bool Mifare::data_loadDataFile(const QString &filename)
{ {
QFile file(filename, this); QFile file(filename, this);
if(file.open(QIODevice::ReadOnly)) if(file.open(QIODevice::ReadOnly))
@ -607,12 +732,8 @@ bool Mifare::data_loadDataFile(const QString& filename)
bool isBin = false; bool isBin = false;
for(int i = 0; i < cardType.blocks * 16; i++) // Detect the file type for(int i = 0; i < cardType.blocks * 16; i++) // Detect the file type
{ {
// qDebug() << (unsigned char)buff[i]; // qDebug() << (unsigned char)buff[i];
if(!((buff[i] >= 'A' && buff[i] <= 'F') || if(!((buff[i] >= 'A' && buff[i] <= 'F') || (buff[i] >= 'a' && buff[i] <= 'f') || (buff[i] >= '0' && buff[i] <= '9') || buff[i] == '\n' || buff[i] == '\r'))
(buff[i] >= 'a' && buff[i] <= 'f') ||
(buff[i] >= '0' && buff[i] <= '9') ||
buff[i] == '\n' ||
buff[i] == '\r'))
{ {
isBin = true; isBin = true;
break; break;
@ -648,7 +769,7 @@ bool Mifare::data_loadDataFile(const QString& filename)
} }
} }
bool Mifare::data_loadKeyFile(const QString& filename) bool Mifare::data_loadKeyFile(const QString &filename)
{ {
QFile file(filename, this); QFile file(filename, this);
if(file.open(QIODevice::ReadOnly)) if(file.open(QIODevice::ReadOnly))
@ -685,11 +806,13 @@ bool Mifare::data_loadKeyFile(const QString& filename)
} }
} }
QString Mifare::bin2text(const QByteArray& buff, int i, int length) QString Mifare::bin2text(const QByteArray &buff, int i, int length)
{ {
QString ret = ""; QString ret = "";
char LByte, RByte; char LByte, RByte;
char map[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; char map[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
};
for(int j = 0; j < length; j++) for(int j = 0; j < length; j++)
{ {
LByte = map[(unsigned char)buff[i * length + j] >> 4]; LByte = map[(unsigned char)buff[i * length + j] >> 4];
@ -701,7 +824,7 @@ QString Mifare::bin2text(const QByteArray& buff, int i, int length)
return ret; return ret;
} }
bool Mifare::data_saveDataFile(const QString& filename, bool isBin) bool Mifare::data_saveDataFile(const QString &filename, bool isBin)
{ {
QFile file(filename, this); QFile file(filename, this);
if(file.open(QIODevice::WriteOnly)) if(file.open(QIODevice::WriteOnly))
@ -745,7 +868,7 @@ bool Mifare::data_saveDataFile(const QString& filename, bool isBin)
} }
} }
bool Mifare::data_saveKeyFile(const QString& filename, bool isBin) bool Mifare::data_saveKeyFile(const QString &filename, bool isBin)
{ {
QFile file(filename, this); QFile file(filename, this);
if(file.open(QIODevice::WriteOnly)) if(file.open(QIODevice::WriteOnly))
@ -786,7 +909,6 @@ bool Mifare::data_saveKeyFile(const QString& filename, bool isBin)
} }
else else
{ {
} }
bool ret = file.write(buff) != -1; bool ret = file.write(buff) != -1;
file.close(); file.close();
@ -841,12 +963,12 @@ void Mifare::data_data2Key()
} }
} }
void Mifare::data_setData(int block, const QString& data) void Mifare::data_setData(int block, const QString &data)
{ {
dataList->replace(block, data); dataList->replace(block, data);
} }
void Mifare::data_setKey(int sector, bool isKeyA, const QString& key) void Mifare::data_setKey(int sector, bool isKeyA, const QString &key)
{ {
if(isKeyA) if(isKeyA)
keyAList->replace(sector, key); keyAList->replace(sector, key);

@ -5,6 +5,7 @@
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
#include "ui/mf_attack_hardnesteddialog.h" #include "ui/mf_attack_hardnesteddialog.h"
#include "ui/mf_uid_parameterdialog.h" #include "ui/mf_uid_parameterdialog.h"
#include "ui/mf_sim_simdialog.h"
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
@ -105,6 +106,12 @@ public:
void data_setData(int block, const QString &data); void data_setData(int block, const QString &data);
void data_setKey(int sector, bool isKeyA, const QString &key); void data_setKey(int sector, bool isKeyA, const QString &key);
void lockC(); void lockC();
void writeAllE();
void readAllE();
void wipeE();
void simulate();
void loadSniff(const QString& file);
void saveSniff(const QString& file);
public slots: public slots:
signals: signals:

@ -1,15 +1,16 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent):
: QMainWindow(parent) QMainWindow(parent)
, ui(new Ui::MainWindow) , ui(new Ui::MainWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->MF_simGroupBox->setVisible(false); // developing... // ui->MF_simGroupBox->setVisible(false); // developing...
ui->MF_sniffGroupBox->setVisible(false); // developing... // ui->MF_sniffGroupBox->setVisible(false); // developing...
myInfo = new QAction("wh201906", this); myInfo = new QAction("wh201906", this);
connect(myInfo, &QAction::triggered, [ = ]() { connect(myInfo, &QAction::triggered, [ = ]()
{
QDesktopServices::openUrl(QUrl("https://github.com/wh201906")); QDesktopServices::openUrl(QUrl("https://github.com/wh201906"));
}); });
this->addAction(myInfo); this->addAction(myInfo);
@ -49,7 +50,6 @@ void MainWindow::initUI() // will be called by main.app
void MainWindow::on_PM3_refreshPortButton_clicked() void MainWindow::on_PM3_refreshPortButton_clicked()
{ {
ui->PM3_portBox->clear(); ui->PM3_portBox->clear();
ui->PM3_portBox->addItem("");
QSerialPort serial; QSerialPort serial;
QStringList serialList; QStringList serialList;
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
@ -473,6 +473,74 @@ void MainWindow::on_MF_UID_lockButton_clicked()
mifare->lockC(); mifare->lockC();
} }
void MainWindow::on_MF_Sim_loadDataButton_clicked()
{
setState(false);
mifare->writeAllE();
setState(true);
}
void MainWindow::on_MF_Sim_writeAllButton_clicked()
{
setState(false);
mifare->readAllE();
setState(true);
}
void MainWindow::on_MF_Sim_clearButton_clicked()
{
mifare->wipeE();
}
void MainWindow::on_MF_Sim_simButton_clicked()
{
mifare->simulate();
}
void MainWindow::on_MF_Sniff_loadButton_clicked() // use a tmp file to support complicated path
{
QString title = "";
QString filename = "";
title = tr("Plz select the trace file:");
filename = QFileDialog::getOpenFileName(this, title, "./", tr("Trace Files(*.trc);;All Files(*.*)"));
qDebug() << filename;
if(filename != "")
{
QString tmpFile = "tmp" + QString::number(QDateTime::currentDateTime().toTime_t()) + ".trc";
if(QFile::copy(filename, "./" + tmpFile))
{
mifare->loadSniff(tmpFile);
QFile::remove("./" + tmpFile);
}
else
{
QMessageBox::information(this, tr("Info"), tr("Failed to open") + "\n" + filename);
}
}
}
void MainWindow::on_MF_Sniff_saveButton_clicked()
{
QString title = "";
QString filename = "";
title = tr("Plz select the location to save trace file:");
filename = QFileDialog::getSaveFileName(this, title, "./", tr("Trace Files(*.trc)"));
qDebug() << filename;
if(filename != "")
{
QString tmpFile = "tmp" + QString::number(QDateTime::currentDateTime().toTime_t()) + ".trc";
mifare->saveSniff(tmpFile);
if(!QFile::copy("./" + tmpFile, filename))
{
QMessageBox::information(this, tr("Info"), tr("Failed to save to") + "\n" + filename);
}
QFile::remove("./" + tmpFile);
}
}
void MainWindow::on_MF_Sniff_sniffButton_clicked() void MainWindow::on_MF_Sniff_sniffButton_clicked()
{ {
setState(false); setState(false);
@ -651,3 +719,7 @@ void MainWindow::setState(bool st)
} }
// *********************************************** // ***********************************************

@ -22,7 +22,8 @@
#include "common/util.h" #include "common/util.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { namespace Ui
{
class MainWindow; class MainWindow;
} }
QT_END_NAMESPACE QT_END_NAMESPACE
@ -119,6 +120,18 @@ private slots:
void on_MF_UID_lockButton_clicked(); void on_MF_UID_lockButton_clicked();
void on_MF_Sim_loadDataButton_clicked();
void on_MF_Sim_writeAllButton_clicked();
void on_MF_Sim_clearButton_clicked();
void on_MF_Sim_simButton_clicked();
void on_MF_Sniff_loadButton_clicked();
void on_MF_Sniff_saveButton_clicked();
private: private:
Ui::MainWindow* ui; Ui::MainWindow* ui;
QButtonGroup* typeBtnGroup; QButtonGroup* typeBtnGroup;

@ -105,9 +105,6 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="mifareTab"> <widget class="QWidget" name="mifareTab">
<attribute name="title"> <attribute name="title">
<string>Mifare</string> <string>Mifare</string>
@ -611,6 +608,13 @@
</item> </item>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Data:</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>

@ -0,0 +1,66 @@
#include "mf_sim_simdialog.h"
#include "ui_mf_sim_simdialog.h"
MF_Sim_simDialog::MF_Sim_simDialog(int cardType, QWidget *parent) :
QDialog(parent),
ui(new Ui::MF_Sim_simDialog)
{
ui->setupUi(this);
this->cardType = cardType;
}
MF_Sim_simDialog::~MF_Sim_simDialog()
{
delete ui;
}
void MF_Sim_simDialog::on_eBox_clicked(bool checked)
{
if(checked)
{
ui->iBox->setChecked(true);
ui->xBox->setChecked(true);
}
if(!ui->eBox->isChecked() && !ui->fBox->isChecked())
{
ui->iBox->setEnabled(true);
ui->xBox->setEnabled(true);
}
else
{
ui->iBox->setEnabled(false);
ui->xBox->setEnabled(false);
}
}
void MF_Sim_simDialog::on_fBox_clicked(bool checked)
{
if(checked)
{
ui->iBox->setChecked(true);
ui->xBox->setChecked(true);
}
if(!ui->eBox->isChecked() && !ui->fBox->isChecked())
{
ui->iBox->setEnabled(true);
ui->xBox->setEnabled(true);
}
else
{
ui->iBox->setEnabled(false);
ui->xBox->setEnabled(false);
}
}
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());
}

@ -0,0 +1,34 @@
#ifndef MF_SIM_SIMDIALOG_H
#define MF_SIM_SIMDIALOG_H
#include <QDialog>
#include <QDebug>
namespace Ui
{
class MF_Sim_simDialog;
}
class MF_Sim_simDialog : public QDialog
{
Q_OBJECT
public:
explicit MF_Sim_simDialog(int cardType, QWidget *parent = nullptr);
~MF_Sim_simDialog();
private slots:
void on_eBox_clicked(bool checked);
void on_fBox_clicked(bool checked);
private:
Ui::MF_Sim_simDialog *ui;
int cardType;
signals:
void sendCMD(QString cmd);
private slots:
void on_buttonBox_accepted();
};
#endif // MF_SIM_SIMDIALOG_H

@ -0,0 +1,378 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MF_Sim_simDialog</class>
<widget class="QDialog" name="MF_Sim_simDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>461</width>
<height>456</height>
</rect>
</property>
<property name="windowTitle">
<string>Simulate</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>5</number>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="uBox">
<property name="text">
<string>u</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="uEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>UID 4 or 7 bytes. If not specified, the UID 4B from emulator memory will be used</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="nBox">
<property name="text">
<string>n</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="nEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Automatically exit simulation after &lt;numreads&gt; blocks have been read by reader. 0 = infinite</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="iBox">
<property name="text">
<string>i</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Interactive, means that console will not be returned until simulation finishes or is aborted</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QCheckBox" name="xBox">
<property name="text">
<string>x</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Crack, performs the 'reader attack', nr/ar attack against a legitimate reader, fishes out the key(s)</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QCheckBox" name="eBox">
<property name="text">
<string>e</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>set keys found from 'reader attack' to emulator memory (implies x and i)</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="fBox">
<property name="text">
<string>f</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="fEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>get UIDs to use for 'reader attack' from file 'f &lt;filename.txt&gt;' (implies x and i)</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QCheckBox" name="rBox">
<property name="text">
<string>r</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Generate random nonces instead of sequential nonces. Standard reader attack won't work with this option, only moebius attack works</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</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>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>MF_Sim_simDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>MF_Sim_simDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>
Loading…
Cancel
Save