From 6fae3b7b0e4d7aa9ddcdea76f82e53999968be93 Mon Sep 17 00:00:00 2001 From: Ray Lee Date: Sat, 7 Aug 2021 22:19:08 +0800 Subject: [PATCH] add new standalone mode MFCSIM --- armsrc/Standalone/Makefile.hal | 7 +- armsrc/Standalone/Makefile.inc | 4 ++ armsrc/Standalone/hf_mfcsim.c | 116 +++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 armsrc/Standalone/hf_mfcsim.c diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index f82a11cf7..d6bba3965 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -83,13 +83,16 @@ define KNOWN_STANDALONE_DEFINITIONS | HF_YOUNG | Mifare sniff/simulation | | | - Craig Young | +----------------------------------------------------------+ +| HF_MFCSIM | Mifare Classic simulation | +| | - Ray Lee | ++----------------------------------------------------------+ endef STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RWC LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN LF_THAREXDE LF_NEXID -STANDALONE_MODES += HF_14ASNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY +STANDALONE_MODES += HF_14ASNIFF HF_AVEFUL HF_BOG HF_COLIN HF_CRAFTBYTE HF_ICECLASS HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY HF_MFCSIM STANDALONE_MODES_REQ_BT := HF_REBLAY STANDALONE_MODES_REQ_SMARTCARD := -STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_14ASNIFF HF_BOG HF_COLIN HF_ICECLASS +STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_14ASNIFF HF_BOG HF_COLIN HF_ICECLASS HF_MFCSIM ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES)),) STANDALONE_PLATFORM_DEFS += -DWITH_STANDALONE_$(STANDALONE) ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES_REQ_SMARTCARD)),) diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index cd742ae9c..f79bb8925 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -97,3 +97,7 @@ endif ifneq (,$(findstring WITH_STANDALONE_HF_REBLAY,$(APP_CFLAGS))) SRC_STANDALONE = hf_reblay.c endif + # WITH_STANDALONE_HF_MFCSIM +ifneq (,$(findstring WITH_STANDALONE_HF_MFCSIM,$(APP_CFLAGS))) + SRC_STANDALONE = hf_mfcsim.c +endif diff --git a/armsrc/Standalone/hf_mfcsim.c b/armsrc/Standalone/hf_mfcsim.c new file mode 100644 index 000000000..3fc321916 --- /dev/null +++ b/armsrc/Standalone/hf_mfcsim.c @@ -0,0 +1,116 @@ +//----------------------------------------------------------------------------- +// RayCN, 2021 +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// main code for mifare classic simulator aka MFCSIM +//----------------------------------------------------------------------------- +#include +#include "ticks.h" +#include "proxmark3_arm.h" +#include "BigBuf.h" +#include "commonutil.h" +#include "fpgaloader.h" +#include "util.h" +#include "dbprint.h" +#include "spiffs.h" +#include "standalone.h" // standalone definitions +#include "appmain.h" +#include "string.h" +#include "iso14443a.h" +#include "mifarecmd.h" +#include "crc16.h" +#include "mifaresim.h" // mifare1ksim +#include "mifareutil.h" + +/* + * `hf_mfcsim` simulates mifare classic 1k dumps uploaded to flash. + * It requires RDV4 hardware (for flash and battery). + * + * On entering stand-alone mode, this module will start simulating. + * Data is read from bin dump file uploaded to flash memory (hf_mfcsim_dump_1.bin). + * Only support mifare classic 1k + * + * LEDs: + * - LED A: initializing + * - LED B: simulating + * - LED C blinking: data transmiting + * + * To upload input file (eml format) to flash: + * - mem spiffs upload -s -d hf_mfcsim_dump_1.bin + * To delete the input file from flash: + * - mem spiffs remove -f hf_mfcsim_dump_1.bin + * + */ + +#define HF_MFCSIM_INPUTFILE_SIM "hf_mfcsim_dump_1.bin" +#define DUMP_SIZE 1024 + +static uint8_t uid[10]; + +static bool ecfill_from_file(char *inputfile) { + + if (exists_in_spiffs(inputfile)) { + + uint32_t size = size_in_spiffs(inputfile); + uint8_t *mem = BigBuf_malloc(size); + if (!mem) { + Dbprintf(_RED_("No memory!")); + } + + Dbprintf(_YELLOW_("Found dump file %s"), inputfile); + rdv40_spiffs_read_as_filetype(inputfile, mem, size, RDV40_SPIFFS_SAFETY_SAFE); + + Dbprintf(_YELLOW_("File size is %d"), size); + if (size != DUMP_SIZE) { + Dbprintf(_RED_("Only support Mifare Classic 1K! Please check the dumpfile")); + } + + Dbprintf(_YELLOW_("Read card data from input file")); + emlSetMem(mem, 0, MIFARE_1K_MAXBLOCK); + Dbprintf(_YELLOW_("Uploaded to emulator memory")); + + } else { + Dbprintf(_RED_("no input file %s"), inputfile); + return false; + } + BigBuf_free(); + return true; +} + +void ModInfo(void) { + DbpString(_YELLOW_(" HF Mifare Classic simulation mode") " - a.k.a MFCSIM"); +} + +void RunMod(void) { + StandAloneMode(); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + Dbprintf(_YELLOW_("Standalone mode MFCSIM started!")); + + LED_A_ON(); + emlClearMem(); + Dbprintf(_YELLOW_("Emulator memory initialized")); + rdv40_spiffs_lazy_mount(); + if (!ecfill_from_file(HF_MFCSIM_INPUTFILE_SIM)) { + Dbprintf(_RED_("Load data failed!")); + return; + } + Dbprintf(_YELLOW_("Emulator memory filled, simulation ready to start.")); + Dbprintf(_YELLOW_("Press button to abort simulation at anytime.")); + + SpinOff(1000); + + LED_B_ON(); + Dbprintf(_YELLOW_("Simulation start!")); + uint16_t simflags = FLAG_UID_IN_EMUL | FLAG_MF_1K; + Mifare1ksim(simflags, 0, uid, 0, 0); + + Dbprintf(_YELLOW_("Simulation end!")); + LEDsoff(); +} + + + +