From 36f4b1f3509fd977c78ef475009dcdaf2d545fd5 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 4 Mar 2018 16:27:57 +0100 Subject: [PATCH] [Loader] A single plugin can be loaded via wiiload. Now more sd swapping for ftpiiu while developing plugins! Simply use the normal wiiload to send a plugin (.mod) file to the Wii U while the plugin loader in running. This requires zlib, don't forget to add it to your portlib. It can be found in the "libs" folder. --- .travis.yml | 1 + README.MD | 22 ++- loader/libs/portlibs.zip | Bin 0 -> 38349 bytes loader/src/Application.cpp | 3 + loader/src/Application.h | 4 +- loader/src/common/common.h | 3 + loader/src/main.cpp | 8 +- loader/src/myutils/TcpReceiver.cpp | 236 ++++++++++++++++++++++++++ loader/src/myutils/TcpReceiver.h | 43 +++++ loader/src/patcher/function_patcher.h | 2 +- loader/src/plugin/PluginLoader.cpp | 13 +- loader/src/plugin/PluginLoader.h | 4 + loader/src/utils.cpp | 32 +--- loader/src/utils.h | 2 +- tools/wiiload.exe | Bin 0 -> 61440 bytes 15 files changed, 334 insertions(+), 39 deletions(-) create mode 100644 loader/libs/portlibs.zip create mode 100644 loader/src/myutils/TcpReceiver.cpp create mode 100644 loader/src/myutils/TcpReceiver.h create mode 100644 tools/wiiload.exe diff --git a/.travis.yml b/.travis.yml index f9cb7e7..d24a556 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,6 +44,7 @@ install: - tar -xzvf libiosuhax.tar.gz - tar -xzvf fs_wrapper.tar.gz - tar -xzvf controller_patcher.tar.gz + - 7z x -y ./libs/portlibs.zip -o${DEVKITPRO} - 7z x -y ./dynamic_libs-lib/libs/portlibs.zip -o${DEVKITPRO} - 7z x -y ./libgui-master/libs/portlibs.zip -o${DEVKITPRO} - (cd libiosuhax-master && make -j8 && make install) diff --git a/README.MD b/README.MD index 019b682..cb8fa2d 100644 --- a/README.MD +++ b/README.MD @@ -47,11 +47,23 @@ For building the loader you need: - [libutils](https://github.com/Maschell/libutils) for common functions. - [libgui](https://github.com/Maschell/libgui) for the gui elements. +Install the according to their readmes. Don't forget to install their dependencies. + +**Dependencies** + +All needed dependencies are in the "libs" folder of this repository. Extract the "portlibs.zip" archive into your devkitPro directory. +The archive includes: + +- zlib + +**Compiling** + Then call the following command in the "loader" directory. ``` make ``` + This should create an "wiiupluginloader.elf" which can be loaded with the Homebrew Launcher. ### Plugins @@ -70,6 +82,12 @@ You can also check out the travis script for needed dependencies of the library, For logging (for example of the loader) you need to start the UdpDebugReader on a computer in the same network. This has been created by @dimok789 and can be found in the tools folder. +# Load plugin via network +While the loader is running, it's possible to load a single plugin via wiiload. +When using this feature, **only** this plugin will be loaded. The plugin will copied to the SDCard, this mean a SDCard is required. +A windows executable can be found in `tools/wiiload.exe` +More information about wiiload and alternatives can be found here: http://wiibrew.org/wiki/Wiiload + # Future Checkout the PLANS.MD for goals, issues and future plans. @@ -77,4 +95,6 @@ Checkout the PLANS.MD for goals, issues and future plans. Some files are based on brainslug by Chadderz: https://github.com/Chadderz121/brainslug-wii Much stuff also wouldn't be possible without dimok789. He made many great tools and homebrew this stuff in based on (Makefiles, Mocha, homebrew channel, udp logger, dynamic_libs etc.) -Also thanks to everyone who made actual exploits. \ No newline at end of file +Also thanks to everyone who made actual exploits. +Thanks to dhewg for wiiload: +http://wiibrew.org/wiki/Wiiload \ No newline at end of file diff --git a/loader/libs/portlibs.zip b/loader/libs/portlibs.zip new file mode 100644 index 0000000000000000000000000000000000000000..d2a9905812cd0286c3a51cbcbecd5babc8f0d015 GIT binary patch literal 38349 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 L0sxzdKU@C;&lER! literal 0 HcmV?d00001 diff --git a/loader/src/Application.cpp b/loader/src/Application.cpp index d020912..a690e06 100644 --- a/loader/src/Application.cpp +++ b/loader/src/Application.cpp @@ -25,6 +25,7 @@ #include #include #include "settings/CSettings.h" +#include "myutils/TcpReceiver.h" Application *Application::applicationInstance = NULL; bool Application::exitApplication = false; @@ -169,6 +170,8 @@ void Application::executeThread(void) { DEBUG_FUNCTION_LINE("Entering main loop\n"); exitApplication = false; //! main GX2 loop (60 Hz cycle with max priority on core 1) + + TcpReceiver pluginReceiver(4299); while(!exitApplication && !reloadUIflag) { //! Read out inputs for(s32 i = 0; i < 5; i++) { diff --git a/loader/src/Application.h b/loader/src/Application.h index c024c89..cd3dc0b 100644 --- a/loader/src/Application.h +++ b/loader/src/Application.h @@ -23,8 +23,8 @@ #include #include -#define APPLICATION_CLOSE_APPLY 1 -#define APPLICATION_CLOSE_MIIMAKER 2 +#define APPLICATION_CLOSE_APPLY 1 +#define APPLICATION_CLOSE_MIIMAKER 2 class Application : public CThread { public: diff --git a/loader/src/common/common.h b/loader/src/common/common.h index 29ad151..e4cd4e3 100644 --- a/loader/src/common/common.h +++ b/loader/src/common/common.h @@ -29,6 +29,9 @@ extern "C" { #define DEFAULT_LANG_PATH DEFAULT_WUPSLOADER_PATH "/languages" #define LANGUAGE_FILE_EXT ".lang" +#define WUPS_TEMP_PLUGIN_PATH SD_PATH WIIU_PATH "/plugins/temp" +#define WUPS_TEMP_PLUGIN_FILE WUPS_TEMP_PLUGIN_PATH "/temp.mod" + #define WUPS_SDUSB_MOUNTED_NONE 0 #define WUPS_SDUSB_MOUNTED_FAKE (1<<0) #define WUPS_SDUSB_MOUNTED_OS_SD (1<<1) diff --git a/loader/src/main.cpp b/loader/src/main.cpp index 6f39840..4b998e5 100644 --- a/loader/src/main.cpp +++ b/loader/src/main.cpp @@ -1,6 +1,8 @@ #include +#include #include #include +#include #include #include #include @@ -10,7 +12,7 @@ #include #include -#include "dynamic_libs/os_functions.h" +#include #include "dynamic_libs/gx2_functions.h" #include "dynamic_libs/ax_functions.h" #include "dynamic_libs/socket_functions.h" @@ -19,7 +21,7 @@ #include "dynamic_libs/nn_nim_functions.h" #include "dynamic_libs/vpad_functions.h" #include "dynamic_libs/padscore_functions.h" -#include "dynamic_libs/proc_ui_functions.h" +#include #include #include @@ -80,7 +82,7 @@ extern "C" int Menu_Main(int argc, char **argv) { DEBUG_FUNCTION_LINE("Wii U Plugin System Loader %s\n",APP_VERSION); - //setup_os_exceptions(); + setup_os_exceptions(); Init(); diff --git a/loader/src/myutils/TcpReceiver.cpp b/loader/src/myutils/TcpReceiver.cpp new file mode 100644 index 0000000..6cc7244 --- /dev/null +++ b/loader/src/myutils/TcpReceiver.cpp @@ -0,0 +1,236 @@ +#include +#include +#include +#include +#include +#include + +#include "common/common.h" +#include "TcpReceiver.h" +#include +#include +#include +#include +#include +#include +#include +#include "Application.h" +#include "plugin/PluginLoader.h" +#include "plugin/PluginInformation.h" + +TcpReceiver::TcpReceiver(int port) + : CThread(CThread::eAttributeAffCore0 | CThread::eAttributePinnedAff) + , exitRequested(false) + , serverPort(port) + , serverSocket(-1) { + + resumeThread(); +} + +TcpReceiver::~TcpReceiver() { + exitRequested = true; + + if(serverSocket > 0) { + shutdown(serverSocket, SHUT_RDWR); + } +} + +void TcpReceiver::executeThread() { + serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); + if (serverSocket < 0) + return; + + u32 enable = 1; + setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)); + + struct sockaddr_in bindAddress; + memset(&bindAddress, 0, sizeof(bindAddress)); + bindAddress.sin_family = AF_INET; + bindAddress.sin_port = serverPort; + bindAddress.sin_addr.s_addr = INADDR_ANY; + + s32 ret; + if ((ret = bind(serverSocket, (struct sockaddr *)&bindAddress, sizeof(bindAddress))) < 0) { + socketclose(serverSocket); + return; + } + + if ((ret = listen(serverSocket, 3)) < 0) { + socketclose(serverSocket); + return; + } + + struct sockaddr_in clientAddr; + s32 addrlen = sizeof(struct sockaddr); + + while(!exitRequested) { + s32 clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &addrlen); + if(clientSocket >= 0) { + u32 ipAddress = clientAddr.sin_addr.s_addr; + //serverReceiveStart(this, ipAddress); + int result = loadToMemory(clientSocket, ipAddress); + //serverReceiveFinished(this, ipAddress, result); + socketclose(clientSocket); + + if(result > 0) + break; + } else { + os_usleep(100000); + } + } + + socketclose(serverSocket); +} + +int TcpReceiver::loadToMemory(s32 clientSocket, u32 ipAddress) { + DEBUG_FUNCTION_LINE("Loading file from ip %08X\n", ipAddress); + + u32 fileSize = 0; + u32 fileSizeUnc = 0; + unsigned char haxx[8]; + memset(haxx, 0, sizeof(haxx)); + //skip haxx + recvwait(clientSocket, haxx, sizeof(haxx)); + recvwait(clientSocket, (unsigned char*)&fileSize, sizeof(fileSize)); + + if (haxx[4] > 0 || haxx[5] > 4) { + recvwait(clientSocket, (unsigned char*)&fileSizeUnc, sizeof(fileSizeUnc)); // Compressed protocol, read another 4 bytes + } + + u32 bytesRead = 0; + struct in_addr in; + in.s_addr = ipAddress; + + DEBUG_FUNCTION_LINE("transfer start\n"); + + unsigned char* loadAddress = (unsigned char*)memalign(0x40, fileSize); + if(!loadAddress) { + os_sleep(1); + return NOT_ENOUGH_MEMORY; + } + + // Copy rpl in memory + while(bytesRead < fileSize) { + + u32 blockSize = 0x1000; + if(blockSize > (fileSize - bytesRead)) + blockSize = fileSize - bytesRead; + + int ret = recv(clientSocket, loadAddress + bytesRead, blockSize, 0); + if(ret <= 0) { + DEBUG_FUNCTION_LINE("Failure on reading file\n"); + break; + } + + bytesRead += ret; + } + + if(bytesRead != fileSize) { + free(loadAddress); + DEBUG_FUNCTION_LINE("File loading not finished, %i of %i bytes received\n", bytesRead, fileSize); + os_sleep(1); + return FILE_READ_ERROR; + } + + bool res = false; + + // Do we need to unzip this thing? + if (haxx[4] > 0 || haxx[5] > 4) { + unsigned char* inflatedData = NULL; + + // We need to unzip... + if (loadAddress[0] == 'P' && loadAddress[1] == 'K' && loadAddress[2] == 0x03 && loadAddress[3] == 0x04) { + //! TODO: + //! mhmm this is incorrect, it has to parse the zip + + // Section is compressed, inflate + inflatedData = (unsigned char*)malloc(fileSizeUnc); + if(!inflatedData) { + free(loadAddress); + os_sleep(1); + return NOT_ENOUGH_MEMORY; + } + + int ret = 0; + z_stream s; + memset(&s, 0, sizeof(s)); + + s.zalloc = Z_NULL; + s.zfree = Z_NULL; + s.opaque = Z_NULL; + + ret = inflateInit(&s); + if (ret != Z_OK) { + free(loadAddress); + free(inflatedData); + os_sleep(1); + return FILE_READ_ERROR; + } + + s.avail_in = fileSize; + s.next_in = (Bytef *)(&loadAddress[0]); + + s.avail_out = fileSizeUnc; + s.next_out = (Bytef *)&inflatedData[0]; + + ret = inflate(&s, Z_FINISH); + if (ret != Z_OK && ret != Z_STREAM_END) { + free(loadAddress); + free(inflatedData); + os_sleep(1); + return FILE_READ_ERROR; + } + + inflateEnd(&s); + fileSize = fileSizeUnc; + } else { + // Section is compressed, inflate + inflatedData = (unsigned char*)malloc(fileSizeUnc); + if(!inflatedData) { + free(loadAddress); + os_sleep(1); + return NOT_ENOUGH_MEMORY; + } + + uLongf f = fileSizeUnc; + int result = uncompress((Bytef*)&inflatedData[0], &f, (Bytef*)loadAddress, fileSize); + if(result != Z_OK) { + DEBUG_FUNCTION_LINE("uncompress failed %i\n", result); + os_sleep(1); + return FILE_READ_ERROR; + } + + fileSizeUnc = f; + fileSize = fileSizeUnc; + } + + FSUtils::CreateSubfolder(WUPS_TEMP_PLUGIN_PATH); + res = FSUtils::saveBufferToFile(WUPS_TEMP_PLUGIN_FILE,inflatedData, fileSize); + free(inflatedData); + } else { + + FSUtils::CreateSubfolder(WUPS_TEMP_PLUGIN_PATH); + res = FSUtils::saveBufferToFile(WUPS_TEMP_PLUGIN_FILE,loadAddress, fileSize); + free(loadAddress); + } + + if(!res) { + os_sleep(1); + return NOT_ENOUGH_MEMORY; + } + + PluginInformation * plugin = PluginInformation::loadPluginInformation(WUPS_TEMP_PLUGIN_FILE); + if(plugin == NULL) { + return NOT_A_VALID_PLUGIN; + } + PluginLoader * pluginLoader = PluginLoader::getInstance(); + pluginLoader->resetPluginLoader(); + std::vector pluginList = pluginLoader->getPluginInformation(WUPS_TEMP_PLUGIN_PATH); + if(pluginList.size() == 0) { + return NOT_A_VALID_PLUGIN; + } + pluginLoader->loadAndLinkPlugins(pluginList); + Application::instance()->quit(APPLICATION_CLOSE_APPLY); + + return fileSize; +} diff --git a/loader/src/myutils/TcpReceiver.h b/loader/src/myutils/TcpReceiver.h new file mode 100644 index 0000000..05cc79a --- /dev/null +++ b/loader/src/myutils/TcpReceiver.h @@ -0,0 +1,43 @@ +#ifndef TCP_RECEIVER_H_ +#define TCP_RECEIVER_H_ + +#include +#include +#include + +#include +#include +#include + +class TcpReceiver : public CThread +{ +public: + enum eLoadResults + { + SUCCESS = 0, + INVALID_INPUT = -1, + FILE_OPEN_FAILURE = -2, + FILE_READ_ERROR = -3, + NOT_ENOUGH_MEMORY = -4, + NOT_A_VALID_PLUGIN = -5, + }; + + TcpReceiver(int port); + ~TcpReceiver(); + + sigslot::signal2 serverReceiveStart; + sigslot::signal3 serverReceiveFinished; + +private: + + void executeThread(); + int loadToMemory(s32 clientSocket, u32 ipAddress); + bool saveFileToSDCard(const char * path, void * buffer,u32 size); + + bool exitRequested; + s32 serverPort; + s32 serverSocket; +}; + + +#endif diff --git a/loader/src/patcher/function_patcher.h b/loader/src/patcher/function_patcher.h index 64e02a1..2d4a8b0 100644 --- a/loader/src/patcher/function_patcher.h +++ b/loader/src/patcher/function_patcher.h @@ -37,7 +37,7 @@ struct rpl_handling { #define FUNCTION_PATCHER_METHOD_STORE_SIZE 7 #define MAXIMUM_PLUGIN_PATH_NAME_LENGTH 256 #define MAXIMUM_PLUGIN_NAME_LENGTH 51 -#define MAXIMUM_FUNCTION_NAME_LENGTH 51 +#define MAXIMUM_FUNCTION_NAME_LENGTH 61 struct replacement_data_function_t { u32 replaceAddr; /* [needs to be filled] Address of our replacement function */ diff --git a/loader/src/plugin/PluginLoader.cpp b/loader/src/plugin/PluginLoader.cpp index 40c0ea2..c3a34e9 100644 --- a/loader/src/plugin/PluginLoader.cpp +++ b/loader/src/plugin/PluginLoader.cpp @@ -105,6 +105,9 @@ void PluginLoader::loadAndLinkPlugins(std::vector pluginInf copyPluginDataIntoGlobalStruct(loadedPlugins); clearPluginData(loadedPlugins); + + DCFlushRange((void*)this->startAddress,(u32)this->endAddress - (u32)this->startAddress); + ICInvalidateRange((void*)this->startAddress,(u32)this->endAddress - (u32)this->startAddress); } void PluginLoader::clearPluginData(std::vector pluginData) { @@ -392,11 +395,17 @@ void PluginLoader::copyPluginDataIntoGlobalStruct(std::vector plug for(size_t j = 0; j < function_data_list.size(); j++) { replacement_data_function_t * function_data = &plugin_data->functions[j]; - FunctionData * cur_function = function_data_list[j]; + + if(strlen(cur_function->getName().c_str()) > MAXIMUM_FUNCTION_NAME_LENGTH-1){ + DEBUG_FUNCTION_LINE("Couldn not add function \"%s\" for plugin \"%s\" function name is too long.\n",cur_function->getName().c_str(),plugin_data->plugin_name); + continue; + } + DEBUG_FUNCTION_LINE("Adding function \"%s\" for plugin \"%s\"\n",cur_function->getName().c_str(),plugin_data->plugin_name); //TODO: Warning/Error if string is too long. + strncpy(function_data->function_name,cur_function->getName().c_str(),MAXIMUM_FUNCTION_NAME_LENGTH-1); function_data->library = cur_function->getLibrary(); @@ -424,4 +433,6 @@ void PluginLoader::copyPluginDataIntoGlobalStruct(std::vector plug plugin_index++; gbl_replacement_data.number_used_plugins++; } + DCFlushRange((void*)&gbl_replacement_data,sizeof(gbl_replacement_data)); + ICInvalidateRange((void*)&gbl_replacement_data,sizeof(gbl_replacement_data)); } diff --git a/loader/src/plugin/PluginLoader.h b/loader/src/plugin/PluginLoader.h index 5cea729..7bf7687 100644 --- a/loader/src/plugin/PluginLoader.h +++ b/loader/src/plugin/PluginLoader.h @@ -107,6 +107,10 @@ public: return getTotalSpace() - getAvailableSpace(); } + void resetPluginLoader() { + this->currentStoreAddress = endAddress; + } + private: PluginLoader(void * startAddress, void * endAddress) { // TODO: Check if endAddress > startAddress. diff --git a/loader/src/utils.cpp b/loader/src/utils.cpp index 67b598a..ffccd4f 100644 --- a/loader/src/utils.cpp +++ b/loader/src/utils.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -9,40 +10,11 @@ #include #include "utils.h" +#include #include "common/common.h" #include "common/retain_vars.h" #include "myutils/overlay_helper.h" -// https://gist.github.com/ccbrown/9722406 -void dumpHex(const void* data, size_t size) { - char ascii[17]; - size_t i, j; - ascii[16] = '\0'; - for (i = 0; i < size; ++i) { - log_printf("%02X ", ((unsigned char*)data)[i]); - if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') { - ascii[i % 16] = ((unsigned char*)data)[i]; - } else { - ascii[i % 16] = '.'; - } - if ((i+1) % 8 == 0 || i+1 == size) { - log_printf(" "); - if ((i+1) % 16 == 0) { - log_printf("| %s \n", ascii); - } else if (i+1 == size) { - ascii[(i+1) % 16] = '\0'; - if ((i+1) % 16 <= 8) { - log_printf(" "); - } - for (j = (i+1) % 16; j < 16; ++j) { - log_printf(" "); - } - log_printf("| %s \n", ascii); - } - } - } -} - void CallHook(wups_loader_hook_type_t hook_type) { CallHookEx(hook_type,-1); } diff --git a/loader/src/utils.h b/loader/src/utils.h index c058c83..991c968 100644 --- a/loader/src/utils.h +++ b/loader/src/utils.h @@ -7,8 +7,8 @@ extern "C" { #endif #include +#include -void dumpHex(const void* data, size_t size); void CallHook(wups_loader_hook_type_t hook_type); void CallHookEx(wups_loader_hook_type_t hook_type, s32 plugin_index_needed); diff --git a/tools/wiiload.exe b/tools/wiiload.exe new file mode 100644 index 0000000000000000000000000000000000000000..601014f4e3d2546ef26e77e3c0e2f9d3e34dca7b GIT binary patch literal 61440 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