diff --git a/include/runtimeiospatch.h b/include/runtimeiospatch.h new file mode 100644 index 0000000..4bcdfbc --- /dev/null +++ b/include/runtimeiospatch.h @@ -0,0 +1,143 @@ +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// Copyright (C) 2010 Joseph Jordan +// Copyright (C) 2012-2013 damysteryman +// Copyright (C) 2012-2015 Christopher Bratusek +// Copyright (C) 2013 DarkMatterCore +// Copyright (C) 2014 megazig +// Copyright (C) 2015 FIX94 + +#ifndef __RUNTIMEIOSPATCH_H__ +#define __RUNTIMEIOSPATCH_H__ + +/** + * Version information for Libruntimeiospatch. + */ +#define LIB_RUNTIMEIOSPATCH_VERSION "1.5.4" + +//============================================================================== +// HW_RVL header +//============================================================================== +#if defined(HW_RVL) /* defined(HW_RVL) */ + +/** + *Returns true when HW_AHBPROT access can be applied + */ +#define AHBPROT_DISABLED (*(vu32*)0xcd800064 == 0xFFFFFFFF) + +//============================================================================== +// Error code definitions: +//============================================================================== +#define ERROR_AHBPROT -5 +#define ERROR_PATCH -7 + +//============================================================================== +// C++ header +//============================================================================== +#ifdef __cplusplus +extern "C" { +#endif +/* __cplusplus */ + +//============================================================================== +// Patchsets: +//============================================================================== +/* +Wii: + * DI Readlimit + * ISFS Permissions + * ES SetUID + * ES SetIdentify + * Hash Check (aka Trucha) + * New Hash Check (aka New Trucha) + * SSL patches + +Sciifii: + * MEM2 Prot + * ES OpenTitleContent 1 & 2 + * ES ReadContent Prot + * ES CloseContent + * ES TitleVersionCheck + * ES TitleDeleteCheck + +vWii: + * Kill Anti-SystemTitle-Install 1, 2, 3, 4 & 5 +*/ + + +//============================================================================== +// Functions: +//============================================================================== + +/** + * This function can be used to keep HW_AHBPROT access when going to reload IOS + * @param verbose Flag determing whether or not to print messages on-screen + * @example + * if(AHBPROT_DISABLED) { + * s32 ret; + * ret = IosPatch_AHBPROT(false); + * if (ret) { + * IOS_ReloadIOS(36); + * } else { + * printf("IosPatch_AHBPROT failed."); + * } + * } + * @return Signed 32bit integer representing code + * > 0 : Success - return equals to number of applied patches + * ERROR_AHBPROT : Error - No HW_AHBPROT access + */ +s32 IosPatch_AHBPROT(bool verbose); + + +/** + * This function applies patches on current IOS + * @see Patchsets + * @param wii Flag determing whether or not to apply Wii patches. + * @param sciifii Flag determing whether or not to apply extra Sciifii patches. + * @param vwii Flag determing whether or not to apply extra vWii patches. + * @param verbose Flag determing whether or not to print messages on-screen. + * @example if(AHBPROT_DISABLED) IosPatch_FULL(true, false, false, false); + * @return Signed 32bit integer representing code + * > 0 : Success - return equals to number of applied patches + * ERROR_AHBPROT : Error - No HW_AHBPROT access + * ERROR_PATCH : Error - Patching HW_AHBPROT access failed + */ +s32 IosPatch_RUNTIME(bool wii, bool sciifii, bool vwii, bool verbose); + + +/** + * This function combines IosPatch_AHBPROT + IOS_ReloadIOS + IosPatch_RUNTIME + * @see Patchsets + * @param wii Flag determing whether or not to apply Wii patches. + * @param sciifii Flag determing whether or not to apply extra Sciifii patches. + * @param vwii Flag determing whether or not to apply extra vWii patches. + * @param verbose Flag determing whether or not to print messages on-screen. + * @param IOS Which IOS to reload into. + * @example if(AHBPROT_DISABLED) IosPatch_FULL(true, false, false, false, 58); + * @return Signed 32bit integer representing code + * > 0 : Success - return equals to number of applied patches + * ERROR_AHBPROT : Error - No HW_AHBPROT access + * ERROR_PATCH : Error - Patching HW_AHBPROT access failed + */ +s32 IosPatch_FULL(bool wii, bool sciifii, bool vwii, bool verbose, int IOS); + +//============================================================================== +// C++ footer +//============================================================================== +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +//============================================================================== +// HW_RVL footer +//============================================================================== +#endif /* defined(HW_RVL) */ + +#endif diff --git a/lib/libruntimeiospatch.a b/lib/libruntimeiospatch.a new file mode 100644 index 0000000..2181a9a Binary files /dev/null and b/lib/libruntimeiospatch.a differ diff --git a/source/detect_settings.c b/source/detect_settings.c index 76b0b21..b6c6ef5 100644 --- a/source/detect_settings.c +++ b/source/detect_settings.c @@ -32,6 +32,7 @@ distribution. #include #include #include +#include #include "detect_settings.h" #include "wiibasics.h" @@ -207,16 +208,17 @@ char get_sysmenu_region(void) default: printf("Infected system menu (version number is %hu)\n", version); + printf("Press HOME to exit, any other button to try plan B.\n"); wait_anyKey(); break; } // Plan B - tikview view ATTRIBUTE_ALIGN(32) = {}; + tikview view ATTRIBUTE_ALIGN(0x20) = {}; s32 cfd; char region = 0; - unsigned char buffer[0x1000] = {}; - const char search[] = "\\ipl\\bin\\RVL\\Final_"; + unsigned char buffer[0x2000] ATTRIBUTE_ALIGN(0x20) = {}; + const char search[] = "ipl\\bin\\RVL\\Final_"; ret = ES_GetTicketViews(TITLE_ID(1, 2), &view, 1); if (ret < 0) @@ -237,15 +239,19 @@ char get_sysmenu_region(void) while (true) { - ret = ES_ReadContent(cfd, buffer, sizeof(buffer)); + ret = ES_ReadContent(cfd, buffer, sizeof(buffer) / 2); if (ret <= 0) break; - for (int i = 0; i < (ret - sizeof(search)); i++) + for (int i = 0; i < ret; i++) // Ok this is really bad. What if it cuts off at the 4kb boundary........ i have an idea { - // Not looking for the null byte!!!! - if (memcmp(buffer, search, sizeof(search) - 1) == 0) + if (memcmp(buffer + i, search, MIN(sizeof(search) - 1, (ret - i))) == 0) { + if ((ret - i) < sizeof(search)) + // printf("Region string was in the middle of the 4KB boundary.\nFilling in the other 4kb.\n"); + ES_ReadContent(cfd, buffer + ret, sizeof(buffer) / 2); + + printf("%s\n", buffer + i); region = *(buffer + i + strlen(search)); break; }