commit ec64a7cf6e372b63b1fb9ced5216be1e2495a615 Author: Ash Logan Date: Sun Apr 7 22:13:09 2019 +1000 Initial commit (works, but bad) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dd480be --- /dev/null +++ b/Makefile @@ -0,0 +1,300 @@ +# You probably never need to adjust this Makefile. +# All changes can be done in the makefile.mk + +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif +ifeq ($(strip $(DEVKITPRO)),) +$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPRO") +endif + +export PATH := $(DEVKITPPC)/bin:$(PORTLIBS)/bin:$(PATH) +export PORTLIBS := $(DEVKITPRO)/portlibs/ppc +export WUPSDIR := $(DEVKITPRO)/wups +export GCC_VER := $(shell $(DEVKITPPC)/bin/powerpc-eabi-gcc -dumpversion) + +PREFIX := powerpc-eabi- + +export AS := $(PREFIX)as +export CC := $(PREFIX)gcc +export CXX := $(PREFIX)g++ +export LD := $(PREFIX)ld +export AR := $(PREFIX)ar +export OBJCOPY := $(PREFIX)objcopy + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build + +ifeq ($(notdir $(CURDIR)),$(BUILD)) + include ../makefile.mk +else + include makefile.mk +endif + +include $(WUPSDIR)/plugin_makefile.mk + + +#MAP ?= $(TARGET:.mod=.map) + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +# -Os: optimise size +# -Wall: generate lots of warnings +# -D__wiiu__: define the symbol __wiiu__ (used in some headers) +# -mcpu=750: enable processor specific compilation +# -meabi: enable eabi specific compilation +# -mhard-float: enable hardware floating point instructions +# -nostartfiles: Do not use the standard system startup files when linking +# -ffunction-sections: split up functions so linker can garbage collect +# -fdata-sections: split up data so linker can garbage collect +COMMON_CFLAGS := -Os -Wall -mcpu=750 -meabi -mhard-float -D__WIIU__ -nostartfiles -ffunction-sections -fdata-sections -Wl,-q $(COMMON_CFLAGS) + +# -x c: compile as c code +# -std=c11: use the c11 standard +CFLAGS := $(COMMON_CFLAGS) -x c -std=gnu11 $(CFLAGS) + +# -x c: compile as c++ code +# -std=gnu++11: use the c++11 standard +CXXFLAGS := $(COMMON_CFLAGS) -x c++ -std=gnu++11 $(CXXFLAGS) + +ifeq ($(DO_LOGGING), 1) + CFLAGS += -D__LOGGING__ + CXXFLAGS += -D__LOGGING__ +endif + +#--------------------------------------------------------------------------------- +# any extra ld flags +#-------------------------------------------------------------------------------- +# --gc-sections: remove unneeded symbols +# -Map: generate a map file +LDFLAGS += -Wl,-Map,$(notdir $@).map,--gc-sections + + +#--------------------------------------------------------------------------------- +Q := @ +MAKEFLAGS += --no-print-directory +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS += +# +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS += + +NEEDS_WUT := 0 + +ifeq ($(WUT_ENABLE_CPP), 1) + WUT_ENABLE_NEWLIB := 1 + + LDFLAGS += -Wl,-whole-archive,-lwutstdc++,-no-whole-archive + NEEDS_WUT := 1 +endif + +ifeq ($(WUT_ENABLE_NEWLIB), 1) + LDFLAGS += -Wl,-whole-archive,-lwutnewlib,-no-whole-archive + NEEDS_WUT := 1 +endif + +ifeq ($(WUT_DEFAULT_MALLOC), 1) + LDFLAGS += -Wl,-whole-archive,-lwutmalloc,-no-whole-archive + NEEDS_WUT := 1 +endif + +ifeq ($(NEEDS_WUT), 1) + ifeq ($(strip $(WUT_ROOT)),) + $(error "Please set WUT_ROOT in your environment. export WUT_ROOT=wut) + endif + CFLAGS += -D__WUT__ + CXXFLAGS += -D__WUT__ +endif + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- +export PROJECTDIR := $(CURDIR) +export OUTPUT := $(CURDIR)/$(TARGETDIR)/$(TARGET) +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) +TTFFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ttf))) +PNGFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.png))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export REAL_LD := $(CC) +else + export REAL_LD := $(CXX) +endif + +export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) \ + $(PNGFILES:.png=.png.o) $(addsuffix .o,$(BINFILES)) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE_FULL += $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + $(EXTERNAL_INCLUDE) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS_FULL += $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + $(EXTERNAL_LIBPATHS) + + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean install + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).mod $(OUTPUT) + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) + +############################################################################### +# Rule to make everything. +PHONY += all + +all : $(OUTPUT) +############################################################################### +# Special build rules + + +# Rule to make the module file. +$(OUTPUT) : $(OFILES) + @echo "linking ... " $@ + @$(REAL_LD) $(OFILES) $(LDFLAGS) $(LIBS) $(LIBPATHS_FULL) -o $@ + +############################################################################### +# Standard build rules +#--------------------------------------------------------------------------------- +%.a: +#--------------------------------------------------------------------------------- + @echo $(notdir $@) + @rm -f $@ + @$(AR) -rc $@ $^ + +#--------------------------------------------------------------------------------- +%.o: %.cpp + @echo $(notdir $<) + @$(CXX) -MMD -MP -MF $(DEPSDIR)/$*.d $(CXXFLAGS) $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.o: %.c + @echo $(notdir $<) + @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d $(CFLAGS) $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.o: %.S + @echo $(notdir $<) + @$(CC) -MMD -MP -MF $(DEPSDIR)/$*.d -x assembler-with-cpp $(INCLUDE_FULL) -c $< -o $@ $(ERROR_FILTER) + +#--------------------------------------------------------------------------------- +%.png.o : %.png + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.bin.o : %.bin + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.wav.o : %.wav + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.mp3.o : %.mp3 + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +#--------------------------------------------------------------------------------- +%.ogg.o : %.ogg + @echo $(notdir $<) + @bin2s -a 32 $< | $(AS) -o $(@) + +############################################################################### +# Assembly listing rules + +# Rule to make assembly listing. +PHONY += list +list : $(LIST) + +# Rule to make the listing file. +%.list : $(TARGET) + $(LOG) + -$Qmkdir -p $(dir $@) + $Q$(OBJDUMP) -d $< > $@ + +############################################################################### +# Clean rule + +# Rule to clean files. +PHONY += clean +clean : + $Qrm -rf $(wildcard $(BUILD) $(BIN)) + +############################################################################### +# Phony targets + +.PHONY : $(PHONY) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/MiiversePlugin.mod b/MiiversePlugin.mod new file mode 100755 index 0000000..80802e3 Binary files /dev/null and b/MiiversePlugin.mod differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c8d81f --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Example plugin + +This is just a simple example plugin which can be used as a template. + +## Building + +For building you need: +- [wups](https://github.com/Maschell/WiiUPluginSystem) +- [wut](https://github.com/decaf-emu/wut) +- [libutils](https://github.com/Maschell/libutils/tree/wut) for common functions (WUT version). + +Install them (in this order) according to their README's. Don't forget the dependencies of the libs itself. \ No newline at end of file diff --git a/makefile.mk b/makefile.mk new file mode 100644 index 0000000..e711172 --- /dev/null +++ b/makefile.mk @@ -0,0 +1,64 @@ +# Compiling the projects with libutils logging code? +DO_LOGGING := 1 + +# Links against the wut implementation of newlib, this is useful for using any function +# from the C standard library +WUT_ENABLE_NEWLIB := 0 + +# Links against the wut implementation of stdcpp, this is useful for using any function +# from the C++ standard library. This will enable WUT_ENABLE_NEWLIB if you have not already done so. +WUT_ENABLE_CPP := 0 + +# By default newlib will allocate 90% of the default heap for use with sbrk & malloc, +# if this is unacceptable to you then you should use this as it replaces the newlib +# malloc functions which ones which redirect to the CafeOS default heap functions +# such as MEMAllocFromDefaultHeap. +WUT_DEFAULT_MALLOC := 1 + +# Target filename +TARGET := $(notdir $(CURDIR)).mod + +# Source directories +SOURCES := src + +# Data directories +DATA := + +# Include directories +INCLUDES := src + +#--------------------------------------------------------------------------------- +# options for code generation and linking +#--------------------------------------------------------------------------------- +# Extra C AND C++ compiler flags +COMMON_CFLAGS := +# Extra C compiler flags +CFLAGS := +# Extra C++ compiler flags +CXXFLAGS := +# Extra linking flags for all linking steps +LDFLAGS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(WUPSDIR) $(WUT_ROOT) $(PORTLIBS) + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lwups -lutilswut -lcoreinit -lnsysnet -lgx2 -lgfd + +#--------------------------------------------------------------------------------- +# Will be added to the final lib paths +# example: +# -L$C:/library1/lib +#--------------------------------------------------------------------------------- +EXTERNAL_LIBPATHS := + +#--------------------------------------------------------------------------------- +# Will be added to the final include paths +# -IC:/library1/include +#--------------------------------------------------------------------------------- +EXTERNAL_INCLUDE := -I$(WUT_ROOT)/include/libutilswut diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..415d6dc --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,86 @@ +/* Copyright 2019 Ash Logan "quarktheawesome" + Copyright 2019 Maschell + + Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include +#include + +/** + Mandatory plugin information. + If not set correctly, the loader will refuse to use the plugin. +**/ +WUPS_PLUGIN_NAME("MiiversePlugin"); +WUPS_PLUGIN_DESCRIPTION("AAAAAA"); +WUPS_PLUGIN_VERSION("v1.0"); +WUPS_PLUGIN_AUTHOR("quarktheawesome"); +WUPS_PLUGIN_LICENSE("ISC"); + +WUPS_ALLOW_KERNEL(); + +char original_url[] = "discovery.olv.nintendo.net/v1/endpoint"; +char new_url[] = "heyquark.com/miiverse.xml\0\0\0\0"; +_Static_assert(sizeof(original_url) > sizeof(new_url), + "new_url too long! Must be less than 38chars."); + +// We'll keep a handle to nn_olv, just to ensure it doesn't get unloaded +static OSDynLoad_Module olv_handle; + +ON_APPLICATION_START(args){ + socket_lib_init(); + log_init(); + + if (!args.kernel_access) { + DEBUG_FUNCTION_LINE("MiiversePlugin: No kernel access!\n"); + return; + } + + OSDynLoad_Acquire("nn_olv", &olv_handle); + + //wish there was a better way than "blow through MEM2" + //TODO use OSGetMemBounds or w/e + for (uint32_t addr = 0x10000000; addr < 0x20000000; addr += 4) { + int ret = memcmp(original_url, (void*)addr, sizeof(original_url)); + if (ret == 0) { + DEBUG_FUNCTION_LINE("Found string at %08X\n", addr); + DEBUG_FUNCTION_LINE("string: %s\n", (char*)addr); + for (uint j = 0; j < sizeof(new_url); j += 4) { + uint32_t val = *(uint32_t*)(new_url + j); + WUPS_KernelWrite((void*)(addr + j), val); + } + DEBUG_FUNCTION_LINE("string: %s\n", (char*)addr); + return; + } + } +} + +ON_APPLICATION_ENDING(){ + DEBUG_FUNCTION_LINE("MiiversePlugin: shutting down...\n"); + OSDynLoad_Release(olv_handle); +} + +DECL_FUNCTION(NSSLContextHandle, NSSLCreateContext, int32_t unk) { + NSSLContextHandle context = real_NSSLCreateContext(unk); + + //Add all commercial certs + for (int cert = NSSL_SERVER_CERT_GROUP_COMMERCIAL_FIRST; + cert <= NSSL_SERVER_CERT_GROUP_COMMERCIAL_LAST; cert++) { + NSSLAddServerPKI(context, (NSSLServerCertId)cert); + } + for (int cert = NSSL_SERVER_CERT_GROUP_COMMERCIAL_4096_FIRST; + cert <= NSSL_SERVER_CERT_GROUP_COMMERCIAL_4096_LAST; cert++) { + NSSLAddServerPKI(context, (NSSLServerCertId)cert); + } + + return context; +} + +WUPS_MUST_REPLACE(NSSLCreateContext, WUPS_LOADER_LIBRARY_NSYSNET, NSSLCreateContext);