PayloadFromRPX/source/main.cpp

157 lines
4.3 KiB
C++
Raw Normal View History

2020-04-26 13:41:39 +02:00
#include <stdio.h>
#include <string.h>
#include <coreinit/time.h>
#include <coreinit/foreground.h>
#include <proc_ui/procui.h>
#include <coreinit/thread.h>
#include <coreinit/screen.h>
2020-04-26 13:41:39 +02:00
#include <whb/log.h>
#include <whb/log_udp.h>
#include <sysapp/launch.h>
#include <sysapp/title.h>
2020-04-26 13:41:39 +02:00
#include <coreinit/cache.h>
#include <vpad/input.h>
#include <string>
2020-04-26 13:41:39 +02:00
#include "utils/logger.h"
#include "ElfUtils.h"
#include "ios_exploit.h"
#include "gx2sploit.h"
2020-07-22 15:12:25 +02:00
void SplashScreen(int32_t durationInMs);
2020-04-26 13:41:39 +02:00
bool CheckRunning() {
2020-07-22 15:12:25 +02:00
switch (ProcUIProcessMessages(true)) {
case PROCUI_STATUS_EXITING: {
return false;
}
case PROCUI_STATUS_RELEASE_FOREGROUND: {
ProcUIDrawDoneRelease();
break;
}
case PROCUI_STATUS_IN_FOREGROUND: {
break;
}
case PROCUI_STATUS_IN_BACKGROUND:
default:
break;
2020-04-26 13:41:39 +02:00
}
return true;
}
int main(int argc, char **argv) {
WHBLogUdpInit();
2020-08-23 10:37:31 +02:00
DEBUG_FUNCTION_LINE("Hello!");
2020-04-26 13:41:39 +02:00
VPADReadError err;
VPADStatus vpad_data;
VPADRead(VPAD_CHAN_0, &vpad_data, 1, &err);
uint32_t btn = vpad_data.hold | vpad_data.trigger;
bool loadWithoutHacks = false;
bool kernelDone = false;
bool skipKernel = false;
if ((btn & VPAD_BUTTON_R) == VPAD_BUTTON_R) {
skipKernel = true;
loadWithoutHacks = true;
}
2020-07-22 15:12:25 +02:00
if ((btn & VPAD_BUTTON_ZR) == VPAD_BUTTON_ZR) {
2020-04-26 13:41:39 +02:00
loadWithoutHacks = true;
}
2020-07-22 15:12:25 +02:00
if ((btn & VPAD_BUTTON_ZL) == VPAD_BUTTON_ZL) {
2020-04-26 13:41:39 +02:00
// In case that fopen check is not working...
2020-08-23 10:37:31 +02:00
DEBUG_FUNCTION_LINE("Force kernel exploit");
2020-04-26 13:41:39 +02:00
kernelDone = true;
DoKernelExploit();
}
if (!kernelDone && !skipKernel) {
2020-07-22 15:12:25 +02:00
if (fopen("fs:/vol/external01/wiiu/payload.elf", "r") != NULL) {
2020-08-23 10:37:31 +02:00
DEBUG_FUNCTION_LINE("We need the kernel exploit to load the payload");
2020-04-26 13:41:39 +02:00
DoKernelExploit();
}
}
2020-07-22 15:12:25 +02:00
if (!loadWithoutHacks) {
2020-04-26 13:41:39 +02:00
uint32_t entryPoint = load_loader_elf_from_sd(0, "wiiu/payload.elf");
2020-07-22 15:12:25 +02:00
if (entryPoint != 0) {
2020-08-23 10:37:31 +02:00
DEBUG_FUNCTION_LINE("New entrypoint at %08X", entryPoint);
2020-07-22 15:12:25 +02:00
int res = ((int (*)(int, char **)) entryPoint)(argc, argv);
if (res > 0) {
2020-08-23 10:37:31 +02:00
DEBUG_FUNCTION_LINE("Returning result of payload");
2020-04-26 13:41:39 +02:00
WHBLogUdpDeinit();
return 0;
} else {
loadWithoutHacks = true;
2020-04-26 13:41:39 +02:00
}
} else {
SplashScreen(1000);
2020-04-26 13:41:39 +02:00
loadWithoutHacks = true;
}
}
ProcUIInit(OSSavesDone_ReadyToRelease);
DEBUG_FUNCTION_LINE("ProcUIInit done");
2020-07-22 15:12:25 +02:00
if (loadWithoutHacks) {
DEBUG_FUNCTION_LINE("Load Wii U Menu");
// Restore the default title id to the normal Wii U Menu.
unsigned long long sysmenuIdUll = _SYSGetSystemApplicationTitleId(SYSTEM_APP_ID_HOME_MENU);
2020-07-22 15:12:25 +02:00
memcpy((void *) 0xF417FFF0, &sysmenuIdUll, 8);
DCStoreRange((void *) 0xF417FFF0, 0x8);
2020-04-26 13:41:39 +02:00
2020-08-23 10:37:31 +02:00
DEBUG_FUNCTION_LINE("Forcing start of title: %016llX", sysmenuIdUll);
2020-04-26 13:41:39 +02:00
ExecuteIOSExploit();
SYSLaunchMenu();
}
2020-07-22 15:12:25 +02:00
while (CheckRunning()) {
2020-04-26 13:41:39 +02:00
// wait.
OSSleepTicks(OSMillisecondsToTicks(100));
}
ProcUIShutdown();
DEBUG_FUNCTION_LINE("Exiting.");
2020-04-26 13:41:39 +02:00
WHBLogUdpDeinit();
return 0;
}
void SplashScreen(int32_t durationInMs) {
int32_t screen_buf0_size = 0;
// Init screen and screen buffers
OSScreenInit();
screen_buf0_size = OSScreenGetBufferSizeEx(SCREEN_TV);
OSScreenSetBufferEx(SCREEN_TV, (void *) 0xF4000000);
OSScreenSetBufferEx(SCREEN_DRC, (void *) (0xF4000000 + screen_buf0_size));
OSScreenEnableEx(SCREEN_TV, 1);
OSScreenEnableEx(SCREEN_DRC, 1);
// Clear screens
OSScreenClearBufferEx(SCREEN_TV, 0);
OSScreenClearBufferEx(SCREEN_DRC, 0);
std::string message1 = "Failed to load sd:/wiiu/payload.elf";
std::string message2 = "Starting the console without any modifcations.";
OSScreenPutFontEx(SCREEN_TV, 0, 0, message1.c_str());
OSScreenPutFontEx(SCREEN_DRC, 0, 0, message1.c_str());
OSScreenPutFontEx(SCREEN_TV, 0, 1, message2.c_str());
OSScreenPutFontEx(SCREEN_DRC, 0, 1, message2.c_str());
OSScreenFlipBuffersEx(SCREEN_TV);
OSScreenFlipBuffersEx(SCREEN_DRC);
OSSleepTicks(OSMillisecondsToTicks(durationInMs));
}