spacehuhn / wifi_ducky

Upload, save and run keystroke injection payloads with an ESP8266 + ATMEGA32U4
MIT License
1.26k stars 295 forks source link

Convenient reflashing (suggestion) #96

Open michalmonday opened 5 years ago

michalmonday commented 5 years ago

Hi, reflashing of Esp8266 requires uploading separate code to Arduino, the suggestion is to:

Here's example of how it could look like:

Top of the code:

// using #defines to save dynamic memory
#define WIFI_DUCKY_PROGRAMMING_MODE_SWITCH_PIN 3 // 3 of Arduino Pro Micro, SCL, PD0 (18 of Atmega32u4)
#define WIFI_DUCKY_GPIO_0_CONTROL_PIN 2 // 2 of Arduino Pro Micro, SDA, PD1 (19 of Atmega32u4)
#define WIFI_DUCKY_ENABLE_CONTROL_PIN 20 // 20 of Arduino Pro Micro, A2, PF5 (38 of Atmega32u4)

Begining of the setup function:

void setup(){
    Wifi_ducky_programming_mode();

Anywhere, or at the end:

void Wifi_ducky_programming_mode(){
  pinMode(WIFI_DUCKY_PROGRAMMING_MODE_SWITCH_PIN, INPUT_PULLUP);

  pinMode(WIFI_DUCKY_GPIO_0_CONTROL_PIN, OUTPUT);
  pinMode(WIFI_DUCKY_ENABLE_CONTROL_PIN, OUTPUT);

  if(digitalRead(WIFI_DUCKY_PROGRAMMING_MODE_SWITCH_PIN) == LOW){
    // If switch was activated then pass all data through Serial1 and allow programming Esp8266 with "Nodemcu Flasher" program.
    Serial1.begin(115200);
    Serial.begin(115200);
    digitalWrite(WIFI_DUCKY_GPIO_0_CONTROL_PIN,LOW);
    digitalWrite(WIFI_DUCKY_ENABLE_CONTROL_PIN,HIGH);

    /* Flash LED 3 times quickly to show that the constant loop was reached and the Esp8266 can be programmed.
      Device is unusable in this mode (this mode is for flashing esp only) and has to be replugged in order to work again (plugged out + switch turned the other side + plugged back in) */
    digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW); delay(300); digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW); delay(300); digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW);

    while(true){
        while(Serial1.available()){
          Serial.write((uint8_t)Serial1.read());
        }

        if(Serial.available()){
          while(Serial.available()){
            Serial1.write((uint8_t)Serial.read());
          }
        }
    }
  }else{
    digitalWrite(WIFI_DUCKY_GPIO_0_CONTROL_PIN,HIGH);
    digitalWrite(WIFI_DUCKY_ENABLE_CONTROL_PIN,HIGH);
  }
}

image

Switches that could be used:

wiring image