Skip to content

Commit

Permalink
flasher: add option --force rather than interactive prompt
Browse files Browse the repository at this point in the history
  • Loading branch information
doegox committed Feb 24, 2022
1 parent cb209a9 commit da90831
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 28 deletions.
29 changes: 9 additions & 20 deletions client/src/flash.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,17 +235,6 @@ static int check_segs(flash_file_t *ctx, int can_write_bl, uint32_t flash_size)
return PM3_SUCCESS;
}

static int ask_confirmation(void) {
PrintAndLogEx(INFO, "Make sure to flash a correct and up-to-date version");
PrintAndLogEx(NORMAL, "Do you want to flash the current image? (yes/no)");
char answer[10];
if ((fgets (answer, sizeof(answer), stdin) == NULL) || (strncmp(answer, "yes", 3) != 0)) {
return PM3_EOPABORTED;
} else {
return PM3_SUCCESS;
}
}

static int print_and_validate_version(struct version_information_t *vi) {
if (vi->magic != VERSION_INFORMATION_MAGIC)
return PM3_EFILE;
Expand All @@ -255,7 +244,7 @@ static int print_and_validate_version(struct version_information_t *vi) {
if (strlen(g_version_information.armsrc) == 9) {
if (strncmp(vi->armsrc, g_version_information.armsrc, 9) != 0) {
PrintAndLogEx(WARNING, _RED_("ARM firmware does not match the source at the time the client was compiled"));
return ask_confirmation();
return PM3_EINVARG;
} else {
return PM3_SUCCESS;
}
Expand All @@ -264,7 +253,7 @@ static int print_and_validate_version(struct version_information_t *vi) {
}

// Load an ELF file for flashing
int flash_load(flash_file_t *ctx) {
int flash_load(flash_file_t *ctx, bool force) {
FILE *fd;
Elf32_Ehdr_t *ehdr;
Elf32_Shdr_t *shdrs = NULL;
Expand Down Expand Up @@ -364,13 +353,13 @@ int flash_load(flash_file_t *ctx) {
}
if (res == PM3_SUCCESS)
return res;
if (res == PM3_EOPABORTED)
goto fail;
// We could not find proper version_information, so we ask for confirmation
PrintAndLogEx(WARNING, "Unable to check version_information");
res = ask_confirmation();
if (res == PM3_SUCCESS)
return res;
// We could not find proper version_information
if (res == PM3_EUNDEF)
PrintAndLogEx(WARNING, "Unable to check version_information");
PrintAndLogEx(INFO, "Make sure to flash a correct and up-to-date version");
PrintAndLogEx(INFO, "You can force flashing this firmware by using the option '--force'");
if (force)
return PM3_SUCCESS;
fail:
flash_free(ctx);
return res;
Expand Down
2 changes: 1 addition & 1 deletion client/src/flash.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ typedef struct {
flash_seg_t *segments;
} flash_file_t;

int flash_load(flash_file_t *ctx);
int flash_load(flash_file_t *ctx, bool force);
int flash_prepare(flash_file_t *ctx, int can_write_bl, int flash_size);
int flash_start_flashing(int enable_bl_writes, char *serial_port_name, uint32_t *max_allowed);
int flash_write(flash_file_t *ctx);
Expand Down
16 changes: 12 additions & 4 deletions client/src/proxmark3.c
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,8 @@ static void show_help(bool showFullHelp, char *exec_name) {
PrintAndLogEx(NORMAL, " --incognito do not use history, prefs file nor log files");
PrintAndLogEx(NORMAL, "\nOptions in flasher mode:");
PrintAndLogEx(NORMAL, " --flash flash Proxmark3, requires at least one --image");
PrintAndLogEx(NORMAL, " --unlock-bootloader Enable flashing of bootloader area *DANGEROUS* (need --flash or --flash-info)");
PrintAndLogEx(NORMAL, " --unlock-bootloader Enable flashing of bootloader area *DANGEROUS* (need --flash)");
PrintAndLogEx(NORMAL, " --force Enable flashing even if firmware seems to not match client version");
PrintAndLogEx(NORMAL, " --image <imagefile> image to flash. Can be specified several times.");
PrintAndLogEx(NORMAL, "\nExamples:");
PrintAndLogEx(NORMAL, "\n to run Proxmark3 client:\n");
Expand All @@ -602,7 +603,7 @@ static void show_help(bool showFullHelp, char *exec_name) {
}
}

static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[FLASH_MAX_FILES], bool can_write_bl) {
static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[FLASH_MAX_FILES], bool can_write_bl, bool force) {

int ret = PM3_EUNDEF;
flash_file_t files[FLASH_MAX_FILES];
Expand Down Expand Up @@ -635,7 +636,7 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[
}

for (int i = 0 ; i < num_files; ++i) {
ret = flash_load(&files[i]);
ret = flash_load(&files[i], force);
if (ret != PM3_SUCCESS) {
goto finish2;
}
Expand Down Expand Up @@ -732,6 +733,7 @@ int main(int argc, char *argv[]) {

bool flash_mode = false;
bool flash_can_write_bl = false;
bool flash_force = false;
bool debug_mode_forced = false;
int flash_num_files = 0;
char *flash_filenames[FLASH_MAX_FILES];
Expand Down Expand Up @@ -948,6 +950,12 @@ int main(int argc, char *argv[]) {
continue;
}

// force flash even if firmware seems to not match client version
if (strcmp(argv[i], "--force") == 0) {
flash_force = true;
continue;
}

// flash file
if (strcmp(argv[i], "--image") == 0) {
if (flash_num_files == FLASH_MAX_FILES) {
Expand Down Expand Up @@ -989,7 +997,7 @@ int main(int argc, char *argv[]) {
speed = USART_BAUD_RATE;

if (flash_mode) {
flash_pm3(port, flash_num_files, flash_filenames, flash_can_write_bl);
flash_pm3(port, flash_num_files, flash_filenames, flash_can_write_bl, flash_force);
exit(EXIT_SUCCESS);
}

Expand Down
40 changes: 37 additions & 3 deletions pm3
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,8 @@ elif [ "$SCRIPT" = "pm3-flash" ]; then
while [ "$1" != "" ]; do
if [ "$1" == "-b" ]; then
ARGS+=("--unlock-bootloader")
elif [ "$1" == "--force" ]; then
ARGS+=("--force")
else
ARGS+=("--image" "$1")
fi
Expand Down Expand Up @@ -320,7 +322,19 @@ elif [ "$SCRIPT" = "pm3-flash-all" ]; then
FINDBTDONGLE=false
FINDBTRFCOMM=false
FINDBTDIRECT=false
CMD() { $CLIENT "--port" "$1" "--flash" "--unlock-bootloader" "--image" "$BOOTIMAGE" "--image" "$FULLIMAGE"; }


CMD() {
ARGS=("--port" "$1" "--flash" "--unlock-bootloader" "--image" "$BOOTIMAGE" "--image" "$FULLIMAGE")
shift;
while [ "$1" != "" ]; do
if [ "$1" == "--force" ]; then
ARGS+=("--force")
fi
shift;
done
$CLIENT "${ARGS[@]}";
}
HELP() {
cat << EOF
Quick helper script for flashing a Proxmark device via USB
Expand All @@ -340,7 +354,17 @@ elif [ "$SCRIPT" = "pm3-flash-fullimage" ]; then
FINDBTDONGLE=false
FINDBTRFCOMM=false
FINDBTDIRECT=false
CMD() { $CLIENT "--port" "$1" "--flash" "--image" "$FULLIMAGE"; }
CMD() {
ARGS=("--port" "$1" "--flash" "--image" "$FULLIMAGE")
shift;
while [ "$1" != "" ]; do
if [ "$1" == "--force" ]; then
ARGS+=("--force")
fi
shift;
done
$CLIENT "${ARGS[@]}";
}
HELP() {
cat << EOF
Quick helper script for flashing a Proxmark device via USB
Expand All @@ -360,7 +384,17 @@ elif [ "$SCRIPT" = "pm3-flash-bootrom" ]; then
FINDBTDONGLE=false
FINDBTRFCOMM=false
FINDBTDIRECT=false
CMD() { $CLIENT "--port" "$1" "--flash" "--unlock-bootloader" "--image" "$BOOTIMAGE"; }
CMD() {
ARGS=("--port" "$1" "--flash" "--unlock-bootloader" "--image" "$BOOTIMAGE")
shift;
while [ "$1" != "" ]; do
if [ "$1" == "--force" ]; then
ARGS+=("--force")
fi
shift;
done
$CLIENT "${ARGS[@]}";
}
HELP() {
cat << EOF
Quick helper script for flashing a Proxmark device via USB
Expand Down

0 comments on commit da90831

Please sign in to comment.