diff --git a/src/dynamic_libs/nn_nim_functions.c b/src/dynamic_libs/nn_nim_functions.c new file mode 100644 index 0000000..49a7c68 --- /dev/null +++ b/src/dynamic_libs/nn_nim_functions.c @@ -0,0 +1,38 @@ +/**************************************************************************** + * Copyright (C) 2015 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#include "os_functions.h" +#include "nn_nim_functions.h" + +u32 nn_nim_handle __attribute__((section(".data"))) = 0; + +void InitAcquireNim(void) +{ + OSDynLoad_Acquire("nn_nim.rpl", &nn_nim_handle); +} + +void InitNimFunctionPointers(void) +{ + u32 *funcPointer = 0; + InitAcquireNim(); +} diff --git a/src/dynamic_libs/nn_nim_functions.h b/src/dynamic_libs/nn_nim_functions.h new file mode 100644 index 0000000..ac94cce --- /dev/null +++ b/src/dynamic_libs/nn_nim_functions.h @@ -0,0 +1,20 @@ +#ifndef __NN_NIM_FUNCTIONS_H_ +#define __NN_NIM_FUNCTIONS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Handle for coreinit */ +extern u32 nn_nim_handle; + +void InitAcquireNim(void); +void InitNimFunctionPointers(void); + +#ifdef __cplusplus +} +#endif + +#endif // __NN_NIM_FUNCTIONS_H_ diff --git a/src/main.c b/src/main.c index 95f7a56..9c15f65 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,7 @@ #include "menu.h" #include "main.h" #include "ios_exploit.h" +#include "nnu.h" static int exitToHBLOnLaunch = 0; @@ -85,11 +86,13 @@ int Menu_Main(void) { OSForceFullRelaunch(); SYSLaunchMenu(); + nnupatcher(); returnCode = EXIT_RELAUNCH_ON_LOAD; } else if(config.launchSysMenu) { SYSLaunchMenu(); + nnupatcher(); exitToHBLOnLaunch = 1; returnCode = EXIT_RELAUNCH_ON_LOAD; } diff --git a/src/nnu.c b/src/nnu.c new file mode 100644 index 0000000..406816b --- /dev/null +++ b/src/nnu.c @@ -0,0 +1,22 @@ +#include +#include +#include "dynamic_libs/os_functions.h" +#include "dynamic_libs/nn_nim_functions.h" +#include "nnu.h" + +void nnupatcher(void) { + InitNimFunctionPointers(); + + u32 *targetfunction, *patchoffset; + + // locate function + OSDynLoad_FindExport(nn_nim_handle, 0, "NeedsNetworkUpdate__Q2_2nn3nimFPb", &targetfunction); + + patchoffset = OSEffectiveToPhysical(targetfunction); + patchoffset = (u32*)((u32)patchoffset - 0x31000000 + 0xA0000000); + + // now patch + patchoffset[0] = 0x38600000; + patchoffset[1] = 0x38800000; + patchoffset[2] = 0x4E800020; +} \ No newline at end of file diff --git a/src/nnu.h b/src/nnu.h new file mode 100644 index 0000000..2526382 --- /dev/null +++ b/src/nnu.h @@ -0,0 +1,6 @@ +#ifndef _NNU_H_ +#define _NNU_H_ + +void nnupatcher(void); + +#endif