Created
July 15, 2020 13:14
-
-
Save rw-r-r-0644/df0769e6da2d5e1a5a8736116b52af8b to your computer and use it in GitHub Desktop.
(quite bad) arduino external reset device code for https://github.com/wiiu-wasteland/prsh_exploit_bruteforce
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Servo.h> | |
#define CONSOLE_RESET_TIMEOUT 40000 | |
/////////////////////////////////////////////////////////// | |
// Automatic restart timer | |
/////////////////////////////////////////////////////////// | |
unsigned long timerBase = 0; | |
bool timerEnabled = true; | |
void disableTimer() | |
{ | |
timerEnabled = false; | |
} | |
void resetTimer() | |
{ | |
timerBase = millis(); | |
} | |
unsigned long readTimer() | |
{ | |
return millis() - timerBase; | |
} | |
/////////////////////////////////////////////////////////// | |
// Automatic console restart | |
/////////////////////////////////////////////////////////// | |
Servo pwrControlServo; | |
void togglePower() | |
{ | |
pwrControlServo.write(71); | |
delay(150); | |
pwrControlServo.write(83); | |
delay(150); | |
} | |
void sendPowerButton() | |
{ | |
digitalWrite(7, HIGH); | |
delay(250); | |
digitalWrite(7, LOW); | |
} | |
void doRestart() | |
{ | |
togglePower(); | |
delay(250); | |
sendPowerButton(); | |
resetTimer(); | |
} | |
void consoleRestartCheck() | |
{ | |
if (timerEnabled && (readTimer() > CONSOLE_RESET_TIMEOUT)) { | |
Serial.println("Restarting the console since the timeout expired..."); | |
doRestart(); | |
} | |
} | |
/////////////////////////////////////////////////////////// | |
// Console signals processing | |
/////////////////////////////////////////////////////////// | |
unsigned long changeDelay[10] = {0}; | |
unsigned long lastGpioChange = 0; | |
int lastGpioStatus = LOW; | |
void sensorbarGpioCheck() | |
{ | |
int gpioStatus, i; | |
unsigned long now; | |
gpioStatus = digitalRead(2); | |
if (gpioStatus == lastGpioStatus) { | |
return; | |
} | |
now = millis(); | |
for (i = 9; i > 0; i--) { | |
changeDelay[i] = changeDelay[i-1]; | |
} | |
changeDelay[0] = now - lastGpioChange; | |
lastGpioChange = now; | |
lastGpioStatus = gpioStatus; | |
Serial.println(changeDelay[0]); | |
//pinMode(13, gpioStatus); | |
bool s_running = true; | |
for (i = 0; i < 4; i++) { | |
s_running &= ((changeDelay[i] > 200) && (changeDelay[i] < 300)); | |
} | |
if (s_running) { | |
resetTimer(); | |
Serial.println("Detected running signal; timeout reset"); | |
return; | |
} | |
bool s_complete = true; | |
for (i = 0; i < 9; i++) { | |
s_complete &= ((changeDelay[i] > 900) && (changeDelay[i] < 1100)); | |
} | |
if (s_complete) { | |
disableTimer(); | |
Serial.println("Detected success signal; timeout disabled"); | |
Serial.println("Exploit successful!\n"); | |
tone(11, 1000); | |
return; | |
} | |
} | |
/////////////////////////////////////////////////////////// | |
// Main program | |
/////////////////////////////////////////////////////////// | |
void setup() | |
{ | |
Serial.begin(9600); | |
pinMode(11, OUTPUT); | |
digitalWrite(11, LOW); | |
pinMode(7, OUTPUT); | |
digitalWrite(7, LOW); | |
pinMode(13, OUTPUT); | |
digitalWrite(13, LOW); | |
/* monitor changes on the sensorbar GPIO pin to | |
* determine if the console is still alive. */ | |
pinMode(2, INPUT); | |
digitalWrite(2, LOW); | |
/* | |
* The reset button servo; if you have suitable | |
* relay, mosfets or literally anything else, | |
* please use them instead (modifying the code | |
* should be simple) | |
*/ | |
pwrControlServo.write(83); | |
pwrControlServo.attach(9); | |
delay(250); | |
/* | |
* Reset the automatic restart timer | |
*/ | |
resetTimer(); | |
} | |
void loop() { | |
sensorbarGpioCheck(); | |
consoleRestartCheck(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment