diff --git a/client/fileutils.c b/client/fileutils.c index 9a5907882..f379f56d3 100644 --- a/client/fileutils.c +++ b/client/fileutils.c @@ -956,7 +956,10 @@ static int searchFinalFile(char **foundpath, const char *pm3dir, const char *sea } // try pm3 dirs in current repo workdir (dev mode) if ((exec_path != NULL) && - ((strcmp(TRACES_SUBDIR, pm3dir) == 0))) { + ((strcmp(TRACES_SUBDIR, pm3dir) == 0) || + (strcmp(FIRMWARES_SUBDIR, pm3dir) == 0) || + (strcmp(BOOTROM_SUBDIR, pm3dir) == 0) || + (strcmp(FULLIMAGE_SUBDIR, pm3dir) == 0))) { char *above = "../"; char *path = calloc(strlen(exec_path) + strlen(above) + strlen(pm3dir) + strlen(filename) + 1, sizeof(char)); if (path == NULL) diff --git a/client/proxmark3.c b/client/proxmark3.c index 05afcc1fd..50f63ec51 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -330,17 +330,40 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[ int ret = PM3_EUNDEF; flash_file_t files[FLASH_MAX_FILES]; memset(files, 0, sizeof(files)); + char *filepaths[FLASH_MAX_FILES]; if (serial_port_name == NULL) { PrintAndLogEx(ERR, "You must specify a port.\n"); return PM3_EINVARG; } + for (int i = 0 ; i < num_files; ++i) { + char *path; + ret = searchFile(&path, FIRMWARES_SUBDIR, filenames[i], ".elf", true); + if (ret != PM3_SUCCESS) { + ret = searchFile(&path, BOOTROM_SUBDIR, filenames[i], ".elf", true); + } + if (ret != PM3_SUCCESS) { + // Last try, let the error msg be displayed if not found + ret = searchFile(&path, FULLIMAGE_SUBDIR, filenames[i], ".elf", false); + } + if (ret != PM3_SUCCESS) { + goto finish2; + } + filepaths[i] = path; + } + + PrintAndLogEx(SUCCESS, "About to use the following file%s:", num_files > 1 ? "s" : ""); + for (int i = 0 ; i < num_files; ++i) { + PrintAndLogEx(SUCCESS, " %s", filepaths[i]); + } + if (OpenProxmark(serial_port_name, true, 60, true, FLASHMODE_SPEED)) { PrintAndLogEx(NORMAL, _GREEN_("Found")); } else { PrintAndLogEx(ERR, "Could not find Proxmark3 on " _RED_("%s") ".\n", serial_port_name); - return PM3_ETIMEOUT; + ret = PM3_ETIMEOUT; + goto finish2; } uint32_t max_allowed = 0; @@ -353,7 +376,7 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[ goto finish; for (int i = 0 ; i < num_files; ++i) { - ret = flash_load(&files[i], filenames[i], can_write_bl, max_allowed * ONE_KB); + ret = flash_load(&files[i], filepaths[i], can_write_bl, max_allowed * ONE_KB); if (ret != PM3_SUCCESS) { goto finish; } @@ -373,9 +396,12 @@ static int flash_pm3(char *serial_port_name, uint8_t num_files, char *filenames[ finish: ret = flash_stop_flashing(); - CloseProxmark(); - +finish2: + for (int i = 0 ; i < num_files; ++i) { + if (filepaths[i] != NULL) + free(filepaths[i]); + } if (ret == PM3_SUCCESS) PrintAndLogEx(SUCCESS, _BLUE_("All done.")); else @@ -599,6 +625,9 @@ int main(int argc, char *argv[]) { if (speed == 0) speed = USART_BAUD_RATE; + // set global variables + set_my_executable_path(); + if (flash_mode) { flash_pm3(port, flash_num_files, flash_filenames, flash_can_write_bl); exit(EXIT_SUCCESS); @@ -629,9 +658,6 @@ int main(int argc, char *argv[]) { } } - // set global variables - set_my_executable_path(); - // try to open USB connection to Proxmark if (port != NULL) { OpenProxmark(port, waitCOMPort, 20, false, speed); diff --git a/include/common.h b/include/common.h index f13f5f99a..627846ff2 100644 --- a/include/common.h +++ b/include/common.h @@ -30,6 +30,9 @@ #define LUA_SCRIPTS_SUBDIR "luascripts" PATHSEP #define RESOURCES_SUBDIR "resources" PATHSEP #define TRACES_SUBDIR "traces" PATHSEP +#define FIRMWARES_SUBDIR "firmware" PATHSEP +#define BOOTROM_SUBDIR "bootrom/obj" PATHSEP +#define FULLIMAGE_SUBDIR "armsrc/obj" PATHSEP #define PACKED __attribute__((packed)) diff --git a/pm3 b/pm3 index d235a0f67..a740beb12 100755 --- a/pm3 +++ b/pm3 @@ -3,21 +3,17 @@ # Usage: run option -h to get help PM3PATH=$(dirname "$0") +FULLIMAGE="fullimage.elf" +BOOTIMAGE="bootrom.elf" # try pm3 dirs in current repo workdir if [ -d "$PM3PATH/client/" ]; then CLIENT="$PM3PATH/client/proxmark3" - FULLIMAGE="$PM3PATH/armsrc/obj/fullimage.elf" - BOOTIMAGE="$PM3PATH/bootrom/obj/bootrom.elf" # try install dir elif [ -x "$PM3PATH/proxmark3" ]; then CLIENT="$PM3PATH/proxmark3" - FULLIMAGE="$PM3PATH/../share/proxmark3/firmware/fullimage.elf" - BOOTIMAGE="$PM3PATH/../share/proxmark3/firmware/bootrom.elf" else # hope it's installed somehow, still not sure where fw images are... CLIENT="proxmark3" - FULLIMAGE="$PM3PATH/../share/proxmark3/firmware/fullimage.elf" - BOOTIMAGE="$PM3PATH/../share/proxmark3/firmware/bootrom.elf" fi function wait4proxmark_Linux {