From 61d250a7f82e45872a900c2ad6e551122ee070f4 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 7 May 2019 11:05:05 +0200 Subject: [PATCH] add: 'hw connect' - lets you connect to a specified serial port. If already connected, it disconnects current port before. --- client/cmdhw.c | 61 ++++++++++++++++++++++++++++++++++++++++------ client/proxmark3.c | 8 ++++-- uart/uart_win32.c | 9 +++---- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/client/cmdhw.c b/client/cmdhw.c index a6d4a18dd..01c9cf350 100644 --- a/client/cmdhw.c +++ b/client/cmdhw.c @@ -37,7 +37,7 @@ static int usage_hw_detectreader(void) { } static int usage_hw_setmux(void) { - PrintAndLogEx(NORMAL, "Set mux mode"); + PrintAndLogEx(NORMAL, "Set the ADC mux to a specific value"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Usage: hw setmux [h] "); PrintAndLogEx(NORMAL, "Options:"); @@ -49,6 +49,20 @@ static int usage_hw_setmux(void) { return PM3_SUCCESS; } +static int usage_hw_connect(void) { + PrintAndLogEx(NORMAL, "Connects to a Proxmark3 device via specified serial port"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Usage: hw connect [h] "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); + PrintAndLogEx(NORMAL, " serial port to connect to"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, " hw connect /dev/ttyACM0 -- *nix "); + PrintAndLogEx(NORMAL, " hw connect com3 -- windows"); + return PM3_SUCCESS; +} + static void lookupChipID(uint32_t iChipID, uint32_t mem_used) { char asBuff[120]; memset(asBuff, 0, sizeof(asBuff)); @@ -426,7 +440,7 @@ static int CmdSetMux(const char *Cmd) { else { usage_hw_setmux(); return PM3_EINVARG; - } + } clearCommandBuffer(); SendCommandOLD(CMD_SET_ADC_MUX, arg, 0, 0, NULL, 0); return PM3_SUCCESS; @@ -458,9 +472,9 @@ static int CmdPing(const char *Cmd) { PacketResponseNG resp; SendCommandMIX(CMD_PING, 0, 0, 0, NULL, 0); if (WaitForResponseTimeout(CMD_ACK, &resp, 1000)) - PrintAndLogEx(NORMAL, "Ping " _GREEN_("successful")); + PrintAndLogEx(SUCCESS, "Ping " _GREEN_("successful")); else - PrintAndLogEx(NORMAL, "Ping " _RED_("failed")); + PrintAndLogEx(WARNING, "Ping " _RED_("failed")); return PM3_SUCCESS; } @@ -485,21 +499,52 @@ static int CmdPingNG(const char *Cmd) { return PM3_SUCCESS; } +static int CmdConnect(const char *Cmd) { + + if (tolower(Cmd[0] == 'h')) + return usage_hw_connect(); + + char *port = NULL; + port = (char *)Cmd; + + if (port != NULL) { + + // if we were already connected, disconnect first. + if (session.pm3_present) { + PrintAndLogEx(INFO, "Disconnecting from current serial port"); + CloseProxmark(); + session.pm3_present = false; + } + + // try to open serial port + session.pm3_present = OpenProxmark(port, false, 20, false, USART_BAUD_RATE); + + if (session.pm3_present && (TestProxmark() != PM3_SUCCESS)) { + PrintAndLogEx(ERR, _RED_("ERROR:") "cannot communicate with the Proxmark\n"); + CloseProxmark(); + session.pm3_present = false; + } else { + } + } + return PM3_SUCCESS; +} + static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, + {"connect", CmdConnect, AlwaysAvailable, "connect Proxmark3 to serial port"}, {"detectreader", CmdDetectReader, IfPm3Present, "['l'|'h'] -- Detect external reader field (option 'l' or 'h' to limit to LF or HF)"}, {"fpgaoff", CmdFPGAOff, IfPm3Present, "Set FPGA off"}, {"lcd", CmdLCD, IfPm3Lcd, " -- Send command/data to LCD"}, {"lcdreset", CmdLCDReset, IfPm3Lcd, "Hardware reset LCD"}, + {"ping", CmdPing, IfPm3Present, "Test if the Proxmark3 is responding"}, + {"pingng", CmdPingNG, IfPm3Present, "Test if the Proxmark3 is responsive, using new frame format (experimental)"}, {"readmem", CmdReadmem, IfPm3Present, "[address] -- Read memory at decimal address from flash"}, {"reset", CmdReset, IfPm3Present, "Reset the Proxmark3"}, {"setlfdivisor", CmdSetDivisor, IfPm3Present, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"}, - {"setmux", CmdSetMux, IfPm3Present, " -- Set the ADC mux to a specific value"}, + {"setmux", CmdSetMux, IfPm3Present, "Set the ADC mux to a specific value"}, + {"status", CmdStatus, IfPm3Present, "Show runtime status information about the connected Proxmark3"}, {"tune", CmdTune, IfPm3Present, "Measure antenna tuning"}, {"version", CmdVersion, IfPm3Present, "Show version information about the connected Proxmark3"}, - {"status", CmdStatus, IfPm3Present, "Show runtime status information about the connected Proxmark3"}, - {"ping", CmdPing, IfPm3Present, "Test if the Proxmark3 is responding"}, - {"pingng", CmdPingNG, IfPm3Present, "Test if the Proxmark3 is responsive, using new frame format (experimental)"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/proxmark3.c b/client/proxmark3.c index 3115af727..1543c7f6e 100644 --- a/client/proxmark3.c +++ b/client/proxmark3.c @@ -158,8 +158,12 @@ main_loop(char *script_cmds_file, char *script_cmd) { printprompt = true; } else { - rl_event_hook = check_comm; - cmd = readline(PROXPROMPT); + //rl_event_hook = check_comm; + if (session.pm3_present ) + cmd = readline(PROXPROMPT); + else + cmd = readline("[offline] "PROXPROMPT); + fflush(NULL); } } diff --git a/uart/uart_win32.c b/uart/uart_win32.c index d04a4aca1..8dc5300ad 100644 --- a/uart/uart_win32.c +++ b/uart/uart_win32.c @@ -181,16 +181,13 @@ int uart_receive(const serial_port sp, uint8_t *pbtRx, uint32_t pszMaxRxLen, uin int uart_send(const serial_port sp, const uint8_t *p_tx, const uint32_t len) { DWORD txlen = 0; int res = WriteFile(((serial_port_windows *)sp)->hPort, p_tx, len, &txlen, NULL); - int errorcode = GetLastError(); - if ( res == 0 ) { - printf("[!]res %d | send errorcode == %d \n",res, errorcode); - } + if ( res ) + return PM3_SUCCESS; + int errorcode = GetLastError(); if (res == 0 && errorcode == 2) { return PM3_EIO; } - if ( res ) - return PM3_SUCCESS; printf("[!!]res %d | send errorcode == %d \n",res, errorcode); return PM3_ENOTTY;