Skip to content

Instantly share code, notes, and snippets.

@rw-r-r-0644
Created July 15, 2020 13:14
Show Gist options
  • Save rw-r-r-0644/df0769e6da2d5e1a5a8736116b52af8b to your computer and use it in GitHub Desktop.
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
#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