mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-11-12 04:26:41 +08:00
139 lines
4 KiB
C
139 lines
4 KiB
C
|
//-----------------------------------------------------------------------------
|
||
|
// 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();
|
||
|
}
|