diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index c9debeef8..737209e29 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -65,7 +65,8 @@ define KNOWN_STANDALONE_DEFINITIONS | HF_14ASNIFF | 14a sniff to flashmem | | (RDV4 only) | | +----------------------------------------------------------+ -| HF_14BSNIFF | 14b sniff | +| HF_14BSNIFF | 14b sniff to flashmem (rdv4) or ram | +| | | +----------------------------------------------------------+ | HF_15SNIFF | 15693 sniff to flashmem (rdv4) or ram | | | | diff --git a/armsrc/Standalone/hf_14bsniff.c b/armsrc/Standalone/hf_14bsniff.c index 22a0c1ee8..d342afa93 100755 --- a/armsrc/Standalone/hf_14bsniff.c +++ b/armsrc/Standalone/hf_14bsniff.c @@ -12,6 +12,7 @@ * - LED1: sniffing * - LED2: sniffed tag command, turns off when finished sniffing reader command * - LED3: sniffed reader command, turns off when finished sniffing tag command + * - LED4: unmounting/sync'ing flash (normally < 100ms) * * This module emits debug strings during normal operation -- so try it out in * the lab connected to PM3 client before taking it into the field. @@ -27,25 +28,75 @@ #include "proxmark3_arm.h" #include "iso14443b.h" #include "util.h" +#include "spiffs.h" #include "appmain.h" #include "dbprint.h" #include "ticks.h" #include "BigBuf.h" +#define HF_14BSNIFF_LOGFILE "hf_14bsniff.trace" + +static void DownloadTraceInstructions(void) { + Dbprintf(""); + Dbprintf("To get the trace from flash and display it:"); + Dbprintf("1. mem spiffs dump -s "HF_14BSNIFF_LOGFILE" -d hf_14bsniff.trace"); + Dbprintf("2. trace load -f hf_14bsniff.trace"); + Dbprintf("3. trace list -t 14b -1"); +} + void ModInfo(void) { DbpString(" HF 14B SNIFF, a ISO14443b sniffer"); + DownloadTraceInstructions(); } void RunMod(void) { StandAloneMode(); Dbprintf(_YELLOW_("HF 14B SNIFF started")); +#ifdef WITH_FLASH + rdv40_spiffs_lazy_mount(); +#endif SniffIso14443b(); Dbprintf("Stopped sniffing"); SpinDelay(200); + uint32_t trace_len = BigBuf_get_traceLen(); +#ifndef WITH_FLASH + // Keep stuff in BigBuf for USB/BT dumping + if (trace_len > 0) + Dbprintf("[!] Trace length (bytes) = %u", trace_len); +#else + // Write stuff to spiffs logfile + if (trace_len > 0) { + Dbprintf("[!] Trace length (bytes) = %u", trace_len); + + uint8_t *trace_buffer = BigBuf_get_addr(); + if (!exists_in_spiffs(HF_14BSNIFF_LOGFILE)) { + rdv40_spiffs_write( + HF_14BSNIFF_LOGFILE, trace_buffer, trace_len, RDV40_SPIFFS_SAFETY_SAFE); + Dbprintf("[!] Wrote trace to "HF_14BSNIFF_LOGFILE); + } else { + rdv40_spiffs_append( + HF_14BSNIFF_LOGFILE, trace_buffer, trace_len, RDV40_SPIFFS_SAFETY_SAFE); + Dbprintf("[!] Appended trace to "HF_14BSNIFF_LOGFILE); + } + } else { + Dbprintf("[!] Trace buffer is empty, nothing to write!"); + } + + LED_D_ON(); + rdv40_spiffs_lazy_unmount(); + LED_D_OFF(); + + SpinErr(LED_A, 200, 5); + SpinDelay(100); +#endif + Dbprintf("-=[ exit ]=-"); LEDsoff(); +#ifdef WITH_FLASH + DownloadTraceInstructions(); +#endif }