mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
New flasher, much more paranoid and much more correct.
Knows how to merge segments to solve the "data overwrites last text block" issue. Removed "partition" stuff. Now it just flashes any elf file you pass, though there's still a -b option required to explicitly enable flashing the bootloader.
This commit is contained in:
parent
98bf65a640
commit
8fe1a992c7
3 changed files with 502 additions and 270 deletions
103
client/flasher.c
103
client/flasher.c
|
@ -3,64 +3,91 @@
|
|||
// at your option, any later version. See the LICENSE.txt file for the text of
|
||||
// the license.
|
||||
//-----------------------------------------------------------------------------
|
||||
// Flashing binary
|
||||
// Flasher frontend tool
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "sleep.h"
|
||||
#include "proxusb.h"
|
||||
#include "flash.h"
|
||||
|
||||
unsigned int current_command = CMD_UNKNOWN;
|
||||
|
||||
extern struct partition partitions[];
|
||||
|
||||
static void usage(char **argv)
|
||||
static void usage(char *argv0)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s areas image [image [image]]\n", argv[0]);
|
||||
fprintf(stderr, " areas is a comma-separated list of areas to flash, with no spaces\n");
|
||||
fprintf(stderr, " Known areas are:");
|
||||
|
||||
for (int i = 0; partitions[i].name != NULL; ++i) {
|
||||
fprintf(stderr, " %s", partitions[i].name);
|
||||
}
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, " image is the path to the corresponding image\n\n");
|
||||
fprintf(stderr, "Example: %s os,fpga path/to/osimage.elf path/to/fpgaimage.elf\n", argv[0]);
|
||||
fprintf(stderr, "Usage: %s [-b] image.elf [image.elf...]\n\n", argv0);
|
||||
fprintf(stderr, "\t-b\tEnable flashing of bootloader area (DANGEROUS)\n\n");
|
||||
fprintf(stderr, "Example: %s path/to/osimage.elf path/to/fpgaimage.elf\n", argv0);
|
||||
}
|
||||
|
||||
#define MAX_FILES 4
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc < 2) {
|
||||
usage(argv);
|
||||
exit(-1);
|
||||
}
|
||||
int can_write_bl = 0;
|
||||
int num_files = 0;
|
||||
int res;
|
||||
flash_file_t files[MAX_FILES];
|
||||
|
||||
/* Count area arguments */
|
||||
int areas = 0, offset=-1, length=0;
|
||||
while (find_next_area(argv[1], &offset, &length)) areas++;
|
||||
memset(files, 0, sizeof(files));
|
||||
|
||||
if (areas != argc - 2) {
|
||||
usage(argv);
|
||||
exit(-1);
|
||||
}
|
||||
if (argc < 2) {
|
||||
usage(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
usb_init();
|
||||
for (int i = 1; i < argc; i++) {
|
||||
if (argv[i][0] == '-') {
|
||||
if (!strcmp(argv[i], "-b")) {
|
||||
can_write_bl = 1;
|
||||
} else {
|
||||
usage(argv[0]);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
res = flash_load(&files[num_files], argv[i], can_write_bl);
|
||||
if (res < 0) {
|
||||
fprintf(stderr, "Error while loading %s\n", argv[i]);
|
||||
return -1;
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
num_files++;
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stderr,"Waiting for Proxmark to appear on USB... ");
|
||||
while (!OpenProxmark(0)) { sleep(1); }
|
||||
fprintf(stderr,"Found.\n");
|
||||
usb_init();
|
||||
|
||||
do_flash(argv);
|
||||
fprintf(stderr, "Waiting for Proxmark to appear on USB...");
|
||||
while (!OpenProxmark(0)) {
|
||||
sleep(1);
|
||||
fprintf(stderr, ".");
|
||||
}
|
||||
fprintf(stderr, " Found.\n");
|
||||
|
||||
UsbCommand c = {CMD_HARDWARE_RESET};
|
||||
SendCommand(&c);
|
||||
res = flash_start_flashing(can_write_bl);
|
||||
if (res < 0)
|
||||
return -1;
|
||||
|
||||
CloseProxmark();
|
||||
fprintf(stderr, "\nFlashing...\n");
|
||||
|
||||
fprintf(stderr,"Have a nice day!\n");
|
||||
for (int i = 0; i < num_files; i++) {
|
||||
res = flash_write(&files[i]);
|
||||
if (res < 0)
|
||||
return -1;
|
||||
flash_free(&files[i]);
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
fprintf(stderr, "Resetting hardware...\n");
|
||||
|
||||
res = flash_stop_flashing();
|
||||
if (res < 0)
|
||||
return -1;
|
||||
|
||||
CloseProxmark();
|
||||
|
||||
fprintf(stderr, "All done.\n\n");
|
||||
fprintf(stderr, "Have a nice day!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue