mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 04:50:12 -07:00
Added standalone mode that can load multiple different modes
This commit is contained in:
parent
8dc169cd5a
commit
315e58dac4
6 changed files with 214 additions and 1 deletions
|
@ -35,6 +35,7 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac
|
||||||
- Fixed `hf mfdes` - increase response buffer length (@merlokk)
|
- Fixed `hf mfdes` - increase response buffer length (@merlokk)
|
||||||
- Fixed `SimulateTagLowFrequencyEx` ignoring the `ledcontrol` argument (@zabszk)
|
- Fixed `SimulateTagLowFrequencyEx` ignoring the `ledcontrol` argument (@zabszk)
|
||||||
- Added ledcontrol argument to LF operations (@zabszk)
|
- Added ledcontrol argument to LF operations (@zabszk)
|
||||||
|
- Added new standalone mode `dankarmulti` - select and run multiple standalone modes (@dankar)
|
||||||
|
|
||||||
## [crimson.4.14434][2021-09-18]
|
## [crimson.4.14434][2021-09-18]
|
||||||
- Fixed `hf mf staticnested` - flashmem / non loop now works (@horrordash)
|
- Fixed `hf mf staticnested` - flashmem / non loop now works (@horrordash)
|
||||||
|
|
|
@ -86,10 +86,13 @@ define KNOWN_STANDALONE_DEFINITIONS
|
||||||
| HF_YOUNG | Mifare sniff/simulation |
|
| HF_YOUNG | Mifare sniff/simulation |
|
||||||
| | - Craig Young |
|
| | - Craig Young |
|
||||||
+----------------------------------------------------------+
|
+----------------------------------------------------------+
|
||||||
|
| DANKARMULTI | Load multiple standalone modes. |
|
||||||
|
| | - Daniel Karling |
|
||||||
|
+----------------------------------------------------------+
|
||||||
endef
|
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 := 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_MFCSIM 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_MFCSIM HF_MSDSAL HF_TCPRST HF_TMUDFORD HF_YOUNG HF_REBLAY DANKARMULTI
|
||||||
STANDALONE_MODES_REQ_BT := HF_REBLAY
|
STANDALONE_MODES_REQ_BT := HF_REBLAY
|
||||||
STANDALONE_MODES_REQ_SMARTCARD :=
|
STANDALONE_MODES_REQ_SMARTCARD :=
|
||||||
STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_14ASNIFF HF_BOG HF_COLIN HF_ICECLASS HF_MFCSIM
|
STANDALONE_MODES_REQ_FLASH := LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_14ASNIFF HF_BOG HF_COLIN HF_ICECLASS HF_MFCSIM
|
||||||
|
|
|
@ -101,3 +101,7 @@ endif
|
||||||
ifneq (,$(findstring WITH_STANDALONE_HF_MFCSIM,$(APP_CFLAGS)))
|
ifneq (,$(findstring WITH_STANDALONE_HF_MFCSIM,$(APP_CFLAGS)))
|
||||||
SRC_STANDALONE = hf_mfcsim.c
|
SRC_STANDALONE = hf_mfcsim.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq (,$(findstring WITH_STANDALONE_DANKARMULTI,$(APP_CFLAGS)))
|
||||||
|
SRC_STANDALONE = dankarmulti.c
|
||||||
|
endif
|
||||||
|
|
138
armsrc/Standalone/dankarmulti.c
Normal file
138
armsrc/Standalone/dankarmulti.c
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// Daniel Karling, 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 Multi Loader
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
#include "standalone.h" // standalone definitions
|
||||||
|
#include "proxmark3_arm.h"
|
||||||
|
#include "appmain.h"
|
||||||
|
#include "fpgaloader.h"
|
||||||
|
#include "ticks.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "dbprint.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This mode will allow you to access multiple different standalone
|
||||||
|
* modes at the same time. The below section defines which modes are
|
||||||
|
* available. Modes are added to the mode list according to the
|
||||||
|
* following:
|
||||||
|
*
|
||||||
|
* 1) Include "dankarmulti.h"
|
||||||
|
* 2) Define MODE_NAME and MODE_FILE for a mode (MODE_NAME can
|
||||||
|
* of your choosing, but must be a valid C token. I.e. pretend
|
||||||
|
* that you are naming a variable)
|
||||||
|
* 3) Include "dankarmulti.h" again
|
||||||
|
* 4) Repeat steps 2 and 3 for additional modes.
|
||||||
|
* 5) Use the macros START_MODE_LIST, ADD_MODE and END_MODE_LIST
|
||||||
|
* to create the list of modes. You need to use the same names
|
||||||
|
* here as defined earlier.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* Single press to cycle between the modes.
|
||||||
|
* The LEDs will show the currently selected mode.
|
||||||
|
* Hold button to start the selected mode.
|
||||||
|
*
|
||||||
|
* How many modes can you have at the same time? Depends on memory,
|
||||||
|
* but the LEDs will overflow after 15.
|
||||||
|
*
|
||||||
|
* I don't know if this works with all the different standalone modes.
|
||||||
|
* I would imagine that it doesn't. If two modes are included with
|
||||||
|
* functions that collide (name-wise) there will be issues.
|
||||||
|
*
|
||||||
|
* NOTE: You will have to keep track of if the included modes require
|
||||||
|
* external memory or bluetooth yourself. The mode selection in
|
||||||
|
* the Makefiles is not able to do it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************
|
||||||
|
* Begin mode list *
|
||||||
|
*******************/
|
||||||
|
|
||||||
|
#include "dankarmulti.h"
|
||||||
|
|
||||||
|
#define MODE_NAME sniff14a
|
||||||
|
#define MODE_FILE "hf_14asniff.c"
|
||||||
|
#include "dankarmulti.h"
|
||||||
|
#define MODE_NAME em4100
|
||||||
|
#define MODE_FILE "lf_em4100rswb.c"
|
||||||
|
#include "dankarmulti.h"
|
||||||
|
#define MODE_NAME icehid
|
||||||
|
#define MODE_FILE "lf_icehid.c"
|
||||||
|
#include "dankarmulti.h"
|
||||||
|
|
||||||
|
START_MODE_LIST
|
||||||
|
ADD_MODE(sniff14a)
|
||||||
|
ADD_MODE(em4100)
|
||||||
|
ADD_MODE(icehid)
|
||||||
|
END_MODE_LIST
|
||||||
|
|
||||||
|
/*******************
|
||||||
|
* End mode list *
|
||||||
|
*******************/
|
||||||
|
|
||||||
|
void update_mode(int selected);
|
||||||
|
|
||||||
|
void ModInfo(void) {
|
||||||
|
DbpString(" Multi standalone loader aka dankarmulti (Daniel Karling)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_mode(int selected) {
|
||||||
|
if (selected >= NUM_MODES) {
|
||||||
|
SpinDown(100);
|
||||||
|
Dbprintf("Invalid mode selected");
|
||||||
|
LEDsoff();
|
||||||
|
} else {
|
||||||
|
Dbprintf("Selected mode: '%s'", mode_list[selected]->name);
|
||||||
|
LEDsoff();
|
||||||
|
LED(selected + 1, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RunMod(void) {
|
||||||
|
int selected_mode = 0;
|
||||||
|
|
||||||
|
StandAloneMode();
|
||||||
|
Dbprintf("[=] Multi standalone loader aka dankarmulti (Daniel Karling)");
|
||||||
|
Dbprintf("[=] Available modes:");
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM_MODES; i++) {
|
||||||
|
Dbprintf("[=] '%s'", mode_list[i]->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_mode(selected_mode);
|
||||||
|
|
||||||
|
// the main loop for your standalone mode
|
||||||
|
for (;;) {
|
||||||
|
WDT_HIT();
|
||||||
|
|
||||||
|
// exit from RunMod, send a usbcommand.
|
||||||
|
if (data_available()) break;
|
||||||
|
|
||||||
|
// Was our button held down or pressed?
|
||||||
|
int button_pressed = BUTTON_HELD(1000);
|
||||||
|
|
||||||
|
switch (button_pressed) {
|
||||||
|
case BUTTON_SINGLE_CLICK:
|
||||||
|
selected_mode = (selected_mode + 1) % NUM_MODES;
|
||||||
|
update_mode(selected_mode);
|
||||||
|
SpinDelay(300);
|
||||||
|
break;
|
||||||
|
case BUTTON_HOLD:
|
||||||
|
Dbprintf("Starting selected mode ('%s')", mode_list[selected_mode]->name);
|
||||||
|
mode_list[selected_mode]->run();
|
||||||
|
Dbprintf("Exited from selected mode");
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DbpString("[=] exiting");
|
||||||
|
LEDsoff();
|
||||||
|
}
|
66
armsrc/Standalone/dankarmulti.h
Normal file
66
armsrc/Standalone/dankarmulti.h
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#ifndef _DANKARMULTI_H_
|
||||||
|
#define _DANKARMULTI_H_
|
||||||
|
|
||||||
|
#ifdef MODE_NAME
|
||||||
|
#error "Do not define MODE_NAME when including this first time"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MODE_FILE
|
||||||
|
#error "Do not define MODE_FILE when including this first time"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STRINGIZE(X) STRINGIZE2(X)
|
||||||
|
#define STRINGIZE2(X) #X
|
||||||
|
|
||||||
|
#define CONCAT(X,Y) CONCAT2(X,Y)
|
||||||
|
#define CONCAT2(X, Y) X##Y
|
||||||
|
|
||||||
|
typedef void (*func_ptr)(void);
|
||||||
|
|
||||||
|
typedef struct mode_t {
|
||||||
|
const char *name;
|
||||||
|
func_ptr run;
|
||||||
|
func_ptr info;
|
||||||
|
} mode_t;
|
||||||
|
|
||||||
|
#define MODE_INTERNAL_NAME(name) CONCAT(standalone_mode, CONCAT(_,name))
|
||||||
|
#define MODE_INFO_FUNC(name) CONCAT(ModInfo, CONCAT(_,name))
|
||||||
|
#define MODE_RUN_FUNC(name) CONCAT(RunMod, CONCAT(_,name))
|
||||||
|
|
||||||
|
#define START_MODE_LIST mode_t *mode_list[] = {
|
||||||
|
#define ADD_MODE(name) &MODE_INTERNAL_NAME(name),
|
||||||
|
#define END_MODE_LIST }; static const int NUM_MODES = sizeof(mode_list) / sizeof(mode_t*);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifndef MODE_NAME
|
||||||
|
#error "Define LOAD_MODE before including this file multiple times"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MODE_FILE
|
||||||
|
#error "Define LOAD_MODE before including this file multiple times"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void MODE_INFO_FUNC(MODE_NAME)(void);
|
||||||
|
void MODE_RUN_FUNC(MODE_NAME)(void);
|
||||||
|
|
||||||
|
#define ModInfo MODE_INFO_FUNC(MODE_NAME)
|
||||||
|
#define RunMod MODE_RUN_FUNC(MODE_NAME)
|
||||||
|
|
||||||
|
void ModInfo(void);
|
||||||
|
void RunMod(void);
|
||||||
|
|
||||||
|
#include MODE_FILE
|
||||||
|
|
||||||
|
static mode_t MODE_INTERNAL_NAME(MODE_NAME) = {
|
||||||
|
.name = STRINGIZE(MODE_NAME),
|
||||||
|
.run = RunMod,
|
||||||
|
.info = ModInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
#undef ModInfo
|
||||||
|
#undef RunMod
|
||||||
|
#undef MODE_FILE
|
||||||
|
#undef MODE_NAME
|
||||||
|
|
||||||
|
#endif
|
|
@ -104,6 +104,7 @@ Here are the supported values you can assign to `STANDALONE` in `Makefile.platfo
|
||||||
| HF_TCPRST | IKEA Rothult ST25TA, Standalone Master Key Dump/Emulation - Nick Draffen
|
| HF_TCPRST | IKEA Rothult ST25TA, Standalone Master Key Dump/Emulation - Nick Draffen
|
||||||
| HF_TMUDFORD | Read and emulate ISO15693 card UID - Tim Mudford
|
| HF_TMUDFORD | Read and emulate ISO15693 card UID - Tim Mudford
|
||||||
| HF_YOUNG | Mifare sniff/simulation - Craig Young
|
| HF_YOUNG | Mifare sniff/simulation - Craig Young
|
||||||
|
| DANKARMULTI | Standalone mode that bakes together multiple other standalone modes. - dankar
|
||||||
|
|
||||||
By default `STANDALONE=LF_SAMYRUN`.
|
By default `STANDALONE=LF_SAMYRUN`.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue