From c4f861b4aa7771d22f1f11fd3fd8363d4194deec Mon Sep 17 00:00:00 2001 From: Edoardo Lolletti Date: Mon, 18 Aug 2025 00:03:56 +0200 Subject: [PATCH] Add binary patch to make unalunch work properly with HNAA tmd --- README.md | 99 +++++++++++++++++ arm9/src/main.cpp | 22 ++-- arm9/src/unlaunch.cpp | 105 +++++++++--------- arm9/src/unlaunch.h | 2 - nitrofiles/force-hnaa-patch.bin | Bin 0 -> 26552 bytes ...h-patch.bin => sound-and-splash-patch.bin} | Bin 6 files changed, 163 insertions(+), 65 deletions(-) create mode 100644 nitrofiles/force-hnaa-patch.bin rename nitrofiles/{unlaunch-patch.bin => sound-and-splash-patch.bin} (100%) diff --git a/README.md b/README.md index 7634042..65b2a9c 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,105 @@ protection since it won't interfere with the system. As a bonus, if you sell/trade you console in the future and the new owner uses the official installer, they'll be protected from bricks. +## Patches applied to unlaunch +The installer ships with 2 binary patches, one is an "ahestetic" one to enable +the dsi H&S screen and sound. +The other is a mandatory one, required to make unlaunch properly use the tmd that +was installed in the HNAA folder, otherwise it would attempt to save its settings +to random fat blocks, since it assumes that unlaunch is installed in the blocks right +after the title.tmd associated with the launcher read from HWINFO_S. +More specifically, the sound and splash patch modifies the arm7 instruction of unlaunch at +address 0x1308 (in the then relocated code it is run at 0x23fe038). The patched instruction +is a `bl` to the function patching a second binary blob of the launcher, and is replaced with +a nop. +The other patch, modifies the code responsible for reading the launcher title id from HWINFO. +The original code is as follow +``` +@ this loads in r0 the buffer containing the contents read +@ from HWINFO_S, offsetted at the position of the title id +FC 05 9F E5 ldr r0, [pc, #0x5fc] +FC 15 9F E5 ldr r1, [pc, #0x5fc] +@ This reads the title id and then stores it to the address +@ pointed by r1, which is then used across the whole program +00 00 90 E5 ldr r0, [r0] +00 00 81 E5 str r0, [r1] +F4 05 9F E5 ldr r0, [pc, #0x5f4] +9d 01 00 EB bl #0x602a3c4 +C5 FD FF EB bl #0x602946c +EC 05 9F E5 ldr r0, [pc, #0x5ec] +00 00 90 E5 ldr r0, [r0] +E8 15 9F E5 ldr r1, [pc, #0x5e8] +66 00 00 EB bl #0x6029f00 +E4 05 9F E5 ldr r0, [pc, #0x5e4] +E4 15 9F E5 ldr r1, [pc, #0x5e4] +14 20 A0 E3 mov r2, #0x14 +0C 09 00 EB bl #0x602c1a8 +DC 05 9F E5 ldr r0, [pc, #0x5dc] +91 01 00 EB bl #0x602a3c4 +BA FD FF EB bl #0x602946c +D4 05 9F E5 ldr r0, [pc, #0x5d4] +00 00 90 E5 ldr r0, [r0] +D0 15 9F E5 ldr r1, [pc, #0x5d0] +02 2C A0 E3 mov r2, #0x200 +5B 00 00 EB bl #0x6029f04 +C8 15 9F E5 ldr r1, [pc, #0x5c8] +E4 01 91 E5 ldr r0, [r1, #0x1e4] +72 08 00 EB bl #0x602bf6c +C0 15 9F E5 ldr r1, [pc, #0x5c0] +19 00 00 EB bl #0x6029e10 +00 00 A0 E3 mov r0, #0 +01 00 C1 E4 strb r0, [r1], #1 +B4 05 9F E5 ldr r0, [pc, #0x5b4] +93 01 D0 E5 ldrb r0, [r0, #0x193] +01 00 C1 E4 strb r0, [r1], #1 +FF 9F BD E8 pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, pc} +``` +The patched code is +``` +@ Instead of reading the title id from the HWINFO_S buffer, +@ read the hardcoded value placed at the bottom. +@ all the relative addresses have been incremented by 4 to account +@ for the shift of the instructions (same for the relative bl instructions) +7C 00 9F E5 ldr r0, [pc, #0x7c] +FC 15 9F E5 ldr r1, [pc, #0x5fc] +00 00 81 E5 str r0, [r1] +F8 05 9F E5 ldr r0, [pc, #0x5f8] +9D 01 00 EB bl #0x602a3c4 +C6 FD FF EB bl #0x602946c +F0 05 9F E5 ldr r0, [pc, #0x5f0] +00 00 90 E5 ldr r0, [r0] +EC 15 9F E5 ldr r1, [pc, #0x5ec] +67 00 00 EB bl #0x6029f00 +E8 05 9F E5 ldr r0, [pc, #0x5e8] +E8 15 9F E5 ldr r1, [pc, #0x5e8] +14 20 A0 E3 mov r2, #0x14 +0D 09 00 EB bl #0x602c1a8 +E0 05 9F E5 ldr r0, [pc, #0x5e0] +92 01 00 EB bl #0x602a3c4 +BB FD FF EB bl #0x602946c +D8 05 9F E5 ldr r0, [pc, #0x5d8] +00 00 90 E5 ldr r0, [r0] +D4 15 9F E5 ldr r1, [pc, #0x5d4] +02 2C A0 E3 mov r2, #0x200 +5C 00 00 EB bl #0x6029f04 +CC 15 9F E5 ldr r1, [pc, #0x5cc] +E8 01 91 E5 ldr r0, [r1, #0x1e8] +73 08 00 EB bl #0x602bf6c +C4 15 9F E5 ldr r1, [pc, #0x5c4] +1A 00 00 EB bl #0x6029e10 +00 00 A0 E3 mov r0, #0 +01 00 C1 E4 strb r0, [r1], #1 +B8 05 9F E5 ldr r0, [pc, #0x5b8] +97 01 D0 E5 ldrb r0, [r0, #0x197] +01 00 C1 E4 strb r0, [r1], #1 +FF 9F BD E8 pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, pc} +41 41 4E 48 .word 0x484e4141 +``` +The patched code is found at address `0x60a7` in the decompressed binary, and is loaded into +ram at address `0x6029d38`. + +The lzss compressed arm7 payload is found at offset `0x8580` for unlaunch 2.0 with a length of `0x67FD`. + ## Credits - [DevkitPro](https://devkitpro.org/): devkitARM and libnds - [Martin Korth (nocash)](https://problemkaputt.de): diff --git a/arm9/src/main.cpp b/arm9/src/main.cpp index bd2a114..848ecc0 100644 --- a/arm9/src/main.cpp +++ b/arm9/src/main.cpp @@ -90,7 +90,7 @@ static void setupScreens() static int mainMenu(const consoleInfo& info, int cursor) { - const auto tidPatchesSupported = (foundUnlaunchInstallerVersion == v1_9 || foundUnlaunchInstallerVersion == v2_0) && isLauncherVersionSupported; + const auto tidPatchesSupported = (foundUnlaunchInstallerVersion == v2_0) && isLauncherVersionSupported; //top screen clearScreen(&topScreen); @@ -352,12 +352,13 @@ void loadUnlaunchInstaller() { } void loadUnlaunchInstallerPatch() { - if (fileExists("sd:/unlaunch-patch.bin")) { - splashSoundBinaryPatchPath = "sd:/unlaunch-patch.bin"; + if (fileExists("sd:/sound-and-splash-patch.bin")) { + splashSoundBinaryPatchPath = "sd:/sound-and-splash-patch.bin"; + } else if(fileExists("nitro:/sound-and-splash-patch.bin")) { + splashSoundBinaryPatchPath = "nitro:/sound-and-splash-patch.bin"; } - else if(fileExists("nitro:/unlaunch-patch.bin")) - { - splashSoundBinaryPatchPath = "nitro:/unlaunch-patch.bin"; + if(!fileExists("nitro:/force-hnaa-patch.bin")) { + throw std::runtime_error(std::format("Failed to find hnaa patch ({})", "nitro:/force-hnaa-patch.bin")); } } @@ -657,7 +658,7 @@ void doMainMenu(consoleInfo& info) { { break; } - if(advancedOptionsUnlocked && (foundUnlaunchInstallerVersion == v1_9 || foundUnlaunchInstallerVersion == v2_0)) { + if(advancedOptionsUnlocked && (foundUnlaunchInstallerVersion == v2_0)) { disableAllPatches = !disableAllPatches; } break; @@ -700,11 +701,12 @@ int main(int argc, char **argv) } loadUnlaunchInstaller(); - loadUnlaunchInstallerPatch(); - - consoleInfo info; try { + loadUnlaunchInstallerPatch(); + + consoleInfo info; + retrieveInstalledLauncherInfo(info); checkNocashFooter(info); diff --git a/arm9/src/unlaunch.cpp b/arm9/src/unlaunch.cpp index 45e81c4..79495fb 100644 --- a/arm9/src/unlaunch.cpp +++ b/arm9/src/unlaunch.cpp @@ -30,19 +30,19 @@ constexpr std::array knownUnlaunchHashes{ /*"0525b28cc59b6f7fc00ad592aebadd7257bf7efb"_sha1, // v1.5: blacklisted, doesn't like this install method*/ /*"9470a51fde188235052b119f6bfabf6689cb2343"_sha1, // v1.6: blacklisted, doesn't like this install method*/ /*"672c11eb535b97b0d32ff580d314a2ad6411d5fe"_sha1, // v1.7: blacklisted, doesn't like this install method*/ - "b76c2b1722e769c6c0b4b3d4bc73250e41993229"_sha1, // v1.8 - "f3eb41cba136a3477523155f8b05df14917c55f4"_sha1, // v1.9 + /*"b76c2b1722e769c6c0b4b3d4bc73250e41993229"_sha1, // v1.8: blacklisted, the HNAA patch is only done for 2.0 */ + /*"f3eb41cba136a3477523155f8b05df14917c55f4"_sha1, // v1.9: blacklisted, the HNAA patch is only done for 2.0 */ "15f4a36251d1408d71114019b2825fe8f5b4c8cc"_sha1, // v2.0 }; constexpr std::array gifOffsets{ - std::make_pair(0x48d4, 0x8540), /* 1.8 */ - std::make_pair(0x48c8, 0x8534), /* 1.9 */ + /* std::make_pair(0x48d4, 0x8540),*/ /* 1.8 */ + /* std::make_pair(0x48c8, 0x8534),*/ /* 1.9 */ std::make_pair(0x48f0, 0x855c), /* 2.0 */ }; constexpr std::array blockAllPatchesOffset{ - 0xae74, /* 1.9 */ + /* 0xae74, */ /* 1.9 */ 0xae91, /* 2.0 */ }; @@ -476,55 +476,56 @@ static bool patchCustomBackground(const char* customBackgroundPath) return true; } +static bool applyBinaryPatch(const char* path) +{ + static constexpr auto lzssCompressedBinaryOffset = 0x8580; + static constexpr auto lzssCompressedBinarySize = 0x67FD; + auto* patch = fopen(path, "rb"); + if(!patch) + { + messageBox("\x1B[31mError:\x1B[33m Failed to open the patch.\n"); + return false; + } + auto patchSize = getFileSize(patch); + if(patchSize > lzssCompressedBinarySize) + { + messageBox("\x1B[31mError:\x1B[33m Patch is too big.\n"); + fclose(patch); + return false; + } + if (fread((unlaunchInstallerBuffer + 520) + lzssCompressedBinaryOffset, 1, patchSize, patch) != patchSize) + { + messageBox("\x1B[31mError:\x1B[33m Failed to read patch.\n"); + fclose(patch); + return false; + } + fclose(patch); + return true; +} + static bool patchUnlaunchInstaller(bool disableAllPatches, const char* splashSoundBinaryPatchPath, const char* customBackgroundPath) { tonccpy(unlaunchInstallerBuffer, ogUnlaunchInstallerBuffer, sizeof(unlaunchInstallerBuffer)); - if(disableAllPatches) - { - if(installerVersion == v1_8) - { - messageBox("\x1B[31mError:\x1B[33m Unlaunch 1.8 can't be patched\n"); - return false; - } - // change launcher TID from ANH to SAN so that unlaunch doesn't realize it's booting the launcher - auto patchOffset = blockAllPatchesOffset[installerVersion - 1]; - const char newID[]{'S','A','N'}; - memcpy((unlaunchInstallerBuffer + 520) + patchOffset, newID, 3); - } - else if (splashSoundBinaryPatchPath) - { - if(installerVersion != v2_0) - { - messageBox("\x1B[31mError:\x1B[33m The splash and sound patch is\n" - "only for unlaunch 2.0\n"); - return false; - } - static constexpr auto patchOffset = 0x8580; - static constexpr auto patchSectionSize = 0x67FD; - auto* patch = fopen(splashSoundBinaryPatchPath, "rb"); - if(!patch) - { - messageBox("\x1B[31mError:\x1B[33m Failed to open the splash and\n" - "sound patch is.\n"); - return false; - } - auto patchSize = getFileSize(patch); - if(patchSize > patchSectionSize) - { - messageBox("\x1B[31mError:\x1B[33m Splash and sound patch is too\n" - "big.\n"); - fclose(patch); - return false; - } - if (fread((unlaunchInstallerBuffer + 520) + patchOffset, 1, patchSize, patch) != patchSize) - { - messageBox("\x1B[31mError:\x1B[33m Failed to read splash and sound\n" - "patch.\n"); - fclose(patch); - return false; - } - fclose(patch); - } + if (splashSoundBinaryPatchPath) + { + iprintf("Applying splash and sound patch\n"); + if(!applyBinaryPatch(splashSoundBinaryPatchPath)) + { + return false; + } + } else { + if(disableAllPatches) { + // change launcher TID from ANH to SAN so that unlaunch doesn't realize it's booting the launcher + auto patchOffset = blockAllPatchesOffset[installerVersion]; + const char newID[]{'S','A','N'}; + memcpy((unlaunchInstallerBuffer + 520) + patchOffset, newID, 3); + } + iprintf("Applying HNAA patch\n"); + if(!applyBinaryPatch("nitro:/force-hnaa-patch.bin")) + { + return false; + } + } if(!patchCustomBackground(customBackgroundPath)) { return false; @@ -543,8 +544,6 @@ UNLAUNCH_VERSION loadUnlaunchInstaller(std::string_view path) } std::array unlaunchVersionStrings{ - "v1.8", - "v1.9", "v2.0", "INVALID", }; diff --git a/arm9/src/unlaunch.h b/arm9/src/unlaunch.h index b179d2b..f2443a1 100644 --- a/arm9/src/unlaunch.h +++ b/arm9/src/unlaunch.h @@ -5,8 +5,6 @@ #include "consoleInfo.h" typedef enum UNLAUNCH_VERSION { - v1_8, - v1_9, v2_0, INVALID, } UNLAUNCH_VERSION; diff --git a/nitrofiles/force-hnaa-patch.bin b/nitrofiles/force-hnaa-patch.bin new file mode 100644 index 0000000000000000000000000000000000000000..27150238ec89c464d09bf8c159132b3ab2c3fbec GIT binary patch literal 26552 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

^A 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 z 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 literal 0 HcmV?d00001 diff --git a/nitrofiles/unlaunch-patch.bin b/nitrofiles/sound-and-splash-patch.bin similarity index 100% rename from nitrofiles/unlaunch-patch.bin rename to nitrofiles/sound-and-splash-patch.bin