From 203c1c012e7209d6553b771bfb73ed8ff08e68d6 Mon Sep 17 00:00:00 2001 From: borntohonk <6264306+borntohonk@users.noreply.github.com> Date: Tue, 25 Nov 2025 08:58:33 +0100 Subject: [PATCH] refactor conds, patterns, and remove ssl patches, add new olsc patch --- Makefile | 2 +- overlay/src/main.cpp | 90 +++++++++++----------- sysmod/src/main.cpp | 172 ++++++++++++++++--------------------------- 3 files changed, 112 insertions(+), 152 deletions(-) diff --git a/Makefile b/Makefile index e752ef4..f760ec7 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ MAKEFILES := sysmod overlay TARGETS := $(foreach dir,$(MAKEFILES),$(CURDIR)/$(dir)) # the below was taken from atmosphere + switch-examples makefile -export VERSION := 1.5.8 +export VERSION := 1.5.9 ifneq ($(strip $(shell git symbolic-ref --short HEAD 2>/dev/null)),) export GIT_BRANCH := $(shell git symbolic-ref --short HEAD) diff --git a/overlay/src/main.cpp b/overlay/src/main.cpp index 4839405..eb44735 100644 --- a/overlay/src/main.cpp +++ b/overlay/src/main.cpp @@ -99,65 +99,69 @@ class GuiToggle final : public tsl::Gui { auto list = new tsl::elm::List(); list->addItem(new tsl::elm::CategoryHeader("FS - 0100000000000000")); - list->addItem(config_noacidsigchk1.create_list_item("noacidsigchk1")); - list->addItem(config_noacidsigchk2.create_list_item("noacidsigchk2")); - list->addItem(config_noncasigchk_old.create_list_item("noncasigchk_old")); - list->addItem(config_noncasigchk_old2.create_list_item("noncasigchk_old2")); - list->addItem(config_noncasigchk_new.create_list_item("noncasigchk_new")); - list->addItem(config_nocntchk.create_list_item("nocntchk")); - list->addItem(config_nocntchk2.create_list_item("nocntchk2")); + list->addItem(config_noacidsigchk1.create_list_item("noacidsigchk_1.0.0-9.2.0")); + list->addItem(config_noacidsigchk2.create_list_item("noacidsigchk_1.0.0-9.2.0")); + list->addItem(config_noncasigchk1.create_list_item("noncasigchk_10.0.0-16.1.0")); + list->addItem(config_noncasigchk2.create_list_item("noncasigchk_17.0.0+")); + list->addItem(config_nocntchk1.create_list_item("nocntchk_10.0.0-18.1.0")); + list->addItem(config_nocntchk2.create_list_item("nocntchk_19.0.0-20.5.0")); + list->addItem(config_nocntchk3.create_list_item("nocntchk_21.0.0+")); list->addItem(new tsl::elm::CategoryHeader("LDR - 0100000000000001")); - list->addItem(config_noacidsigchk.create_list_item("noacidsigchk")); + list->addItem(config_noacidsigchk3.create_list_item("noacidsigchk_10.0.0+")); list->addItem(new tsl::elm::CategoryHeader("ERPT - 010000000000002B")); list->addItem(config_no_erpt.create_list_item("no_erpt")); list->addItem(new tsl::elm::CategoryHeader("ES - 0100000000000033")); - list->addItem(config_es1.create_list_item("es1")); - list->addItem(config_es2.create_list_item("es2")); - list->addItem(config_es3.create_list_item("es3")); - list->addItem(config_es4.create_list_item("es4")); + list->addItem(config_es1.create_list_item("es_1.0.0-8.1.1")); + list->addItem(config_es2.create_list_item("es_9.0.0-11.0.1")); + list->addItem(config_es3.create_list_item("es_12.0.0-18.1.0")); + list->addItem(config_es4.create_list_item("es_19.0.0+")); + + list->addItem(new tsl::elm::CategoryHeader("OLSC - 010000000000003E")); + list->addItem(config_olsc1.create_list_item("olsc_6.0.0-14.1.2")); + list->addItem(config_olsc2.create_list_item("olsc_15.0.0-18.1.0")); + list->addItem(config_olsc3.create_list_item("olsc_19.0.0+")); list->addItem(new tsl::elm::CategoryHeader("NIFM - 010000000000000F")); - list->addItem(config_ctest.create_list_item("ctest")); - list->addItem(config_ctest2.create_list_item("ctest2")); - list->addItem(config_ctest3.create_list_item("ctest3")); + list->addItem(config_ctest1.create_list_item("ctest_1.0.0-19.0.1")); + list->addItem(config_ctest2.create_list_item("ctest_20.0.0+")); list->addItem(new tsl::elm::CategoryHeader("NIM - 0100000000000025")); - list->addItem(config_nim_old.create_list_item("nim_old")); - list->addItem(config_nim_new.create_list_item("nim_new")); - - list->addItem(new tsl::elm::CategoryHeader("Disable CA Verification - apply all")); - list->addItem(config_ssl1.create_list_item("disablecaverification1")); - list->addItem(config_ssl2.create_list_item("disablecaverification2")); - list->addItem(config_ssl3.create_list_item("disablecaverification3")); + list->addItem(config_nim1.create_list_item("blankcal0crashfix_17.0.0+")); + list->addItem(config_nim_fw1.create_list_item("blockfirmwareupdates_1.0.0-5.1.0")); + list->addItem(config_nim_fw2.create_list_item("blockfirmwareupdates_6.0.0-6.2.0")); + list->addItem(config_nim_fw3.create_list_item("blockfirmwareupdates_7.0.0-11.0.1")); + list->addItem(config_nim_fw4.create_list_item("blockfirmwareupdates_12.0.0+")); frame->setContent(list); return frame; } - ConfigEntry config_noacidsigchk1{"fs", "noacidsigchk1", true}; - ConfigEntry config_noacidsigchk2{"fs", "noacidsigchk2", true}; - ConfigEntry config_noncasigchk_old{"fs", "noncasigchk_old", true}; - ConfigEntry config_noncasigchk_old2{"fs", "noncasigchk_old2", true}; - ConfigEntry config_noncasigchk_new{"fs", "noncasigchk_new", true}; - ConfigEntry config_nocntchk{"fs", "nocntchk", true}; - ConfigEntry config_nocntchk2{"fs", "nocntchk2", true}; - ConfigEntry config_noacidsigchk{"ldr", "noacidsigchk", true}; - ConfigEntry config_no_erpt{"erpt", "no_erpt", false}; - ConfigEntry config_es1{"es", "es1", true}; - ConfigEntry config_es2{"es", "es2", true}; - ConfigEntry config_es3{"es", "es3", true}; - ConfigEntry config_es4{"es", "es4", true}; - ConfigEntry config_ctest{"nifm", "ctest", true}; - ConfigEntry config_ctest2{"nifm", "ctest2", true}; - ConfigEntry config_ctest3{"nifm", "ctest3", true}; - ConfigEntry config_nim_old{"nim_old", "nim_old", true}; - ConfigEntry config_nim_new{"nim_new", "nim_new", true}; - ConfigEntry config_ssl1{"ssl", "disablecaverification1", false}; - ConfigEntry config_ssl2{"ssl", "disablecaverification2", false}; - ConfigEntry config_ssl3{"ssl", "disablecaverification3", false}; + ConfigEntry config_noacidsigchk1{"fs", "noacidsigchk_1.0.0-9.2.0", true}; + ConfigEntry config_noacidsigchk2{"fs", "noacidsigchk_1.0.0-9.2.0", true}; + ConfigEntry config_noncasigchk1{"fs", "noncasigchk_10.0.0-16.1.0", true}; + ConfigEntry config_noncasigchk2{"fs", "noncasigchk_17.0.0+", true}; + ConfigEntry config_nocntchk1{"fs", "nocntchk_10.0.0-18.1.0", true}; + ConfigEntry config_nocntchk2{"fs", "nocntchk_19.0.0-20.5.0", true}; + ConfigEntry config_nocntchk3{"fs", "nocntchk_21.0.0+", true}; + ConfigEntry config_noacidsigchk3{"ldr", "noacidsigchk_10.0.0+", true}; + ConfigEntry config_no_erpt{"erpt", "no_erpt", true}; + ConfigEntry config_es1{"es", "es_1.0.0-8.1.1", true}; + ConfigEntry config_es2{"es", "es_9.0.0-11.0.1", true}; + ConfigEntry config_es3{"es", "es_12.0.0-18.1.0", true}; + ConfigEntry config_es4{"es", "es_19.0.0+", true}; + ConfigEntry config_olsc1{"olsc", "olsc_6.0.0-14.1.2", true}; + ConfigEntry config_olsc2{"olsc", "olsc_15.0.0-18.1.0", true}; + ConfigEntry config_olsc3{"olsc", "olsc_19.0.0+", true}; + ConfigEntry config_ctest1{"nifm", "ctest_1.0.0-19.0.1", true}; + ConfigEntry config_ctest2{"nifm", "ctest_20.0.0+", true}; + ConfigEntry config_nim1{"nim", "blankcal0crashfix_17.0.0+", true}; + ConfigEntry config_nim_fw1{"nim", "blockfirmwareupdates_1.0.0-5.1.0", true}; + ConfigEntry config_nim_fw2{"nim", "blockfirmwareupdates_6.0.0-6.2.0", true}; + ConfigEntry config_nim_fw3{"nim", "blockfirmwareupdates_7.0.0-11.0.1", true}; + ConfigEntry config_nim_fw4{"nim", "blockfirmwareupdates_12.0.0+", true}; }; class GuiLog final : public tsl::Gui { diff --git a/sysmod/src/main.cpp b/sysmod/src/main.cpp index 457b9ce..22eba73 100644 --- a/sysmod/src/main.cpp +++ b/sysmod/src/main.cpp @@ -63,7 +63,7 @@ struct PatternData { str2hex(s, data, size); } - u16 data[44]{}; // reasonable max pattern length, adjust as needed + u16 data[60]{}; // reasonable max pattern length, adjust as needed u8 size{}; }; @@ -126,6 +126,11 @@ struct PatchEntry { const u32 max_fw_ver{FW_VER_ANY}; // set to FW_VER_ANY to ignore }; +// naming convention should if possible adhere to either an arm instruction + _cond, +// example: "bl_cond" +// or naming it specific to what is being patched, and including all possible bytes within the address being tested for the given patch. +// example: "ctest_cond" + constexpr auto sub_cond(u32 inst) -> bool { const auto type = inst >> 24; return type == 0xD1; // sub sp, sp, #0x150 @@ -133,106 +138,71 @@ constexpr auto sub_cond(u32 inst) -> bool { constexpr auto cmp_cond(u32 inst) -> bool { const auto type = inst >> 24; - return type == 0x6B; // cmp w0, w1 + return type == 0x6B || // cmp w0, w1 + type == 0xF1; // cmp x0, #0x1 } constexpr auto bl_cond(u32 inst) -> bool { const auto type = inst >> 24; - return type == 0x25 || type == 0x94; + return type == 0x25 || + type == 0x94 || + type == 0x97; } constexpr auto tbz_cond(u32 inst) -> bool { return ((inst >> 24) & 0x7F) == 0x36; } - -constexpr auto cbz_cond(u32 inst) -> bool { - const auto type = inst >> 24; - return type == 0x34 || type == 0xB4; -} - -constexpr auto mov_cond(u32 inst) -> bool { - return ((inst >> 24) & 0x7F) == 0x52; -} - -constexpr auto mov2_cond(u32 inst) -> bool { - if (hosversionBefore(12,0,0) || !hosversionBefore(15,0,0)) { - return (inst >> 24) == 0x2A; // mov x0, x20 - } else { - return (inst >> 24) == 0x92; // and x0, x19, #0xffffffff - } -} - -constexpr auto mov3_cond(u32 inst) -> bool { - return (inst >> 24) == 0xD2; // mov x10, #0x3 -} - -constexpr auto and_cond(u32 inst) -> bool { - return ((inst >> 24) & 0x1F) == 0x0A; -} - constexpr auto adr_cond(u32 inst) -> bool { return (inst >> 24) == 0x10; // adr x2, LAB } -constexpr auto bne_cond(u32 inst) -> bool { +constexpr auto block_fw_updates_cond(u32 inst) -> bool { const auto type = inst >> 24; - const auto cond = inst & 0x10; - return type == 0x54 || cond == 0x0; -} - -constexpr auto beq_cond(u32 inst) -> bool { - return (inst >> 24) == 0x54; // beq, 0x710011c94c + return type == 0xA8 || + type == 0xA9 || + type == 0xF8 || + type == 0xF9; } -constexpr auto str_cond(u32 inst) -> bool { - return (inst >> 24) == 0xB9; // str, w8,[x19, #0x15c] +constexpr auto es_cond(u32 inst) -> bool { + const auto type = inst >> 24; + return type == 0xD1 || + type == 0xA9 || + type == 0xAA || + type == 0x2A || + type == 0x92; } constexpr auto ctest_cond(u32 inst) -> bool { - return std::byteswap(0xF50301AA) == inst; // mov x21, x1 -} - -constexpr auto b_cond(u32 inst) -> bool { const auto type = inst >> 24; - return type == 0x14 || type == 0x17; + return type == 0xF9 || + type == 0xA9 || + type == 0xF8; } -constexpr auto stp_cond(u32 inst) -> bool { - return (inst >> 24) == 0xA9; // stp x29, x30, [sp, #-0x30]! -} // to view patches, use https://armconverter.com/?lock=arm64 constexpr PatchData ret0_patch_data{ "0xE0031F2A" }; -constexpr PatchData ret1_patch_data{ "0x10000014" }; -constexpr PatchData erpt_patch_data{ "0xE0031F2AC0035FD6" }; +constexpr PatchData ret1_patch_data{ "0x200080D2" }; +constexpr PatchData mov0_ret_patch_data{ "0xE0031F2AC0035FD6" }; constexpr PatchData nop_patch_data{ "0x1F2003D5" }; //mov x0, xzr constexpr PatchData mov0_patch_data{ "0xE0031FAA" }; //mov x2, xzr constexpr PatchData mov2_patch_data{ "0xE2031FAA" }; constexpr PatchData cmp_patch_data{ "0x00" }; -constexpr PatchData ssl1_patch_data{ "0x0A" }; -constexpr PatchData ssl2_patch_data{ "0x08008052" }; constexpr PatchData ctest_patch_data{ "0x00309AD2001EA1F2610100D4E0031FAAC0035FD6" }; constexpr auto ret0_patch(u32 inst) -> PatchData { return ret0_patch_data; } constexpr auto ret1_patch(u32 inst) -> PatchData { return ret1_patch_data; } -constexpr auto erpt_patch(u32 inst) -> PatchData { return erpt_patch_data; } +constexpr auto mov0_ret_patch(u32 inst) -> PatchData { return mov0_ret_patch_data; } constexpr auto nop_patch(u32 inst) -> PatchData { return nop_patch_data; } constexpr auto mov0_patch(u32 inst) -> PatchData { return mov0_patch_data; } constexpr auto mov2_patch(u32 inst) -> PatchData { return mov2_patch_data; } constexpr auto cmp_patch(u32 inst) -> PatchData { return cmp_patch_data; } -constexpr auto ssl1_patch(u32 inst) -> PatchData { return ssl1_patch_data; } -constexpr auto ssl2_patch(u32 inst) -> PatchData { return ssl2_patch_data; } constexpr auto ctest_patch(u32 inst) -> PatchData { return ctest_patch_data; } -constexpr auto b_patch(u32 inst) -> PatchData { - const u32 opcode = 0x14 << 24; - const u32 offset = (inst >> 5) & 0x7FFFF; - return opcode | offset; -} - constexpr auto ret0_applied(const u8* data, u32 inst) -> bool { return ret0_patch(inst).cmp(data); } @@ -249,12 +219,8 @@ constexpr auto cmp_applied(const u8* data, u32 inst) -> bool { return cmp_patch(inst).cmp(data); } -constexpr auto erpt_applied(const u8* data, u32 inst) -> bool { - return erpt_patch(inst).cmp(data); -} - -constexpr auto b_applied(const u8* data, u32 inst) -> bool { - return 0x14 == (inst >> 24); +constexpr auto mov0_ret_applied(const u8* data, u32 inst) -> bool { + return mov0_ret_patch(inst).cmp(data); } constexpr auto mov0_applied(const u8* data, u32 inst) -> bool { @@ -265,58 +231,52 @@ constexpr auto mov2_applied(const u8* data, u32 inst) -> bool { return mov2_patch(inst).cmp(data); } -constexpr auto ssl1_applied(const u8* data, u32 inst) -> bool { - return ssl1_patch(inst).cmp(data); -} - -constexpr auto ssl2_applied(const u8* data, u32 inst) -> bool { - return ssl2_patch(inst).cmp(data); -} - constexpr auto ctest_applied(const u8* data, u32 inst) -> bool { return ctest_patch(inst).cmp(data); } constinit Patterns fs_patterns[] = { - { "noacidsigchk1", "0xC8FE4739", -24, 0, bl_cond, ret0_patch, ret0_applied, true, FW_VER_ANY, MAKEHOSVERSION(9,2,0) }, - { "noacidsigchk2", "0x0210911F000072", -5, 0, bl_cond, ret0_patch, ret0_applied, true, FW_VER_ANY, MAKEHOSVERSION(9,2,0) }, - { "noncasigchk_old", "0x0036.......71..0054..4839", -2, 0, tbz_cond, nop_patch, nop_applied, true, MAKEHOSVERSION(10,0,0), MAKEHOSVERSION(16,1,0) }, - { "noncasigchk_old2", "0x.94..0036.258052", 2, 0, tbz_cond, nop_patch, nop_applied, true, MAKEHOSVERSION(17,0,0), MAKEHOSVERSION(20,5,0) }, // 17.0.0 - 20.5.0 - { "noncasigchk_new", "0x.94..0036.........258052", 2, 0, tbz_cond, nop_patch, nop_applied, true, MAKEHOSVERSION(21,0,0), FW_VER_ANY }, // 21.0.0+ - { "nocntchk", "0x40f9...9408.0012.050071", 2, 0, bl_cond, ret0_patch, ret0_applied, true, MAKEHOSVERSION(10,0,0), MAKEHOSVERSION(18,1,0) }, - { "nocntchk2", "0x40f9...94..40b9..0012", 2, 0, bl_cond, ret0_patch, ret0_applied, true, MAKEHOSVERSION(19,0,0), FW_VER_ANY }, + { "noacidsigchk_1.0.0-9.2.0", "0xC8FE4739", -24, 0, bl_cond, ret0_patch, ret0_applied, true, FW_VER_ANY, MAKEHOSVERSION(9,2,0) }, // moved to loader 10.0.0 + { "noacidsigchk_1.0.0-9.2.0", "0x0210911F000072", -5, 0, bl_cond, ret0_patch, ret0_applied, true, FW_VER_ANY, MAKEHOSVERSION(9,2,0) }, // moved to loader 10.0.0 + { "noncasigchk_10.0.0-16.1.0", "0x1E48391F.0071..0054", -17, 0, tbz_cond, nop_patch, nop_applied, true, MAKEHOSVERSION(10,0,0), MAKEHOSVERSION(16,1,0) }, + { "noncasigchk_17.0.0+", "0x0694..00.42.0091", -18, 0, tbz_cond, nop_patch, nop_applied, true, MAKEHOSVERSION(17,0,0), FW_VER_ANY }, + { "nocntchk_10.0.0-18.1.0", "0x00..0240F9....08.....00...00...0037", 6, 0, bl_cond, ret0_patch, ret0_applied, true, MAKEHOSVERSION(10,0,0), MAKEHOSVERSION(18,1,0) }, + { "nocntchk_19.0.0-20.5.0", "0x00..0240F9....08.....00...00...0054", 6, 0, bl_cond, ret0_patch, ret0_applied, true, MAKEHOSVERSION(19,0,0), MAKEHOSVERSION(20,5,0) }, + { "nocntchk_21.0.0+", "0x00..0240F9....E8.....00...00...0054", 6, 0, bl_cond, ret0_patch, ret0_applied, true, MAKEHOSVERSION(21,0,0), FW_VER_ANY }, }; constinit Patterns ldr_patterns[] = { - { "noacidsigchk", "009401C0BE121F00", 6, 2, cmp_cond, cmp_patch, cmp_applied, true, FW_VER_ANY }, // 1F00016B - cmp w0, w1 patched to 1F00006B - cmp w0, w0 + { "noacidsigchk_10.0.0+", "0x009401C0BE121F00", 6, 2, cmp_cond, cmp_patch, cmp_applied, true, FW_VER_ANY }, // 1F00016B - cmp w0, w1 patched to 1F00006B - cmp w0, w0 }; constinit Patterns erpt_patterns[] = { - { "no_erpt", "0x...D1FD7B02A9FD830091F76305A9", 0, 0, sub_cond, erpt_patch, erpt_applied, false }, // FF4305D1 - sub sp, sp, #0x150 patched to E0031F2AC0035FD6 - mov w0, wzr, ret + { "no_erpt", "0x...D1FD7B02A9FD830091F76305A9", 0, 0, sub_cond, mov0_ret_patch, mov0_ret_applied, true, FW_VER_ANY }, // FF4305D1 - sub sp, sp, #0x150 patched to E0031F2AC0035FD6 - mov w0, wzr, ret }; constinit Patterns es_patterns[] = { - { "es1", "0x..00.....e0.0091..0094..4092...d1", 16, 0, and_cond, mov0_patch, mov0_applied, true, FW_VER_ANY, MAKEHOSVERSION(1,0,0) }, - { "es2", "0x..00.....e0.0091..0094..4092...a9", 16, 0, and_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(2,0,0), MAKEHOSVERSION(8,1,1) }, - { "es3", "0x..00...0094a0..d1..ff97.......a9", 16, 0, mov2_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(9,0,0), MAKEHOSVERSION(20,5,0) }, //9.0.0 - 20.5.0 - { "es4", "0x..00....97a0..d1...97e003132a...a9", 16, 0, mov2_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(21,0,0), FW_VER_ANY }, //21.0.0+ + { "es_1.0.0-8.1.1", "0x....E8.00...FF97.0300AA..00.....E0.0091..0094.7E4092.......A9", 36, 0, es_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(1,0,0), MAKEHOSVERSION(8,1,1) }, + { "es_9.0.0-11.0.1", "0x00...............00.....A0..D1...97.......A9", 30, 0, es_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(9,0,0), MAKEHOSVERSION(11,0,1) }, + { "es_12.0.0-18.1.0", "0x02.00...........00...00.....A0..D1...97.......A9", 32, 0, es_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(12,0,0), MAKEHOSVERSION(18,1,0) }, + { "es_19.0.0+", "0xA1.00...........00...00.....A0..D1...97.......A9", 32, 0, es_cond, mov0_patch, mov0_applied, true, MAKEHOSVERSION(19,0,0), FW_VER_ANY }, }; -constinit Patterns nifm_patterns[] = { - { "ctest", "....................F40300AA....F30314AAE00314AA9F0201397F8E04F8", 16, -16, ctest_cond, ctest_patch, ctest_applied, true, FW_VER_ANY, MAKEHOSVERSION(18,1,0) }, // 1.0.0 - 18.1.0 - { "ctest2", "14...........91...........97...............14", 41, 0, stp_cond, ctest_patch, ctest_applied, true, MAKEHOSVERSION(19,0,0), MAKEHOSVERSION(20,5,0) }, //19.0.0 - 20.5.0 - { "ctest3", "14...........91...........97...............14", 49, 0, stp_cond, ctest_patch, ctest_applied, true, MAKEHOSVERSION(21,0,0), FW_VER_ANY }, //21.0.0 +constinit Patterns olsc_patterns[] = { + { "olsc_6.0.0-14.1.2", "0x00.73..F968024039..00...00", 42, 0, bl_cond, ret1_patch, ret1_applied, true, MAKEHOSVERSION(6,0,0), MAKEHOSVERSION(14,1,2) }, + { "olsc_15.0.0-18.1.0", "0x00.73..F968024039..00...00", 38, 0, bl_cond, ret1_patch, ret1_applied, true, MAKEHOSVERSION(15,0,0), MAKEHOSVERSION(18,1,0) }, + { "olsc_19.0.0+", "0x00.73..F968024039..00...00", 42, 0, bl_cond, ret1_patch, ret1_applied, true, MAKEHOSVERSION(19,0,0), FW_VER_ANY }, }; -constinit Patterns nim_patterns[] = { - { "nim_old", "0x.0F00351F2003D5", 8, 0, adr_cond, mov2_patch, mov2_applied, true, MAKEHOSVERSION(17,0,0), MAKEHOSVERSION(20,5,0) }, - { "nim_new", "0x.0700351F2003D5", 8, 0, adr_cond, mov2_patch, mov2_applied, true, MAKEHOSVERSION(21,0,0), FW_VER_ANY }, +constinit Patterns nifm_patterns[] = { + { "ctest_1.0.0-19.0.1", "0x03.AAE003.AA...39..04F8....E0", -29, 0, ctest_cond, ctest_patch, ctest_applied, true, FW_VER_ANY, MAKEHOSVERSION(18,1,0) }, + { "ctest_20.0.0+", "0x03.AA...AA.........0314AA..14AA", -17, 0, ctest_cond, ctest_patch, ctest_applied, true, MAKEHOSVERSION(20,0,0), FW_VER_ANY }, }; -constinit Patterns ssl_patterns[] = { - { "disablecaverification1", "0x6A0080D2", 0, 0, mov3_cond, ssl1_patch, ssl1_applied, false, FW_VER_ANY }, - { "disablecaverification2", "0x2409437AA0000054", 4, 0, beq_cond, ret1_patch, ret1_applied, false, FW_VER_ANY }, - { "disablecaverification3", "0x88160012", 4, 0, str_cond, ssl2_patch, ssl2_applied, false, FW_VER_ANY }, +constinit Patterns nim_patterns[] = { + { "blankcal0crashfix_17.0.0+", "0x00351F2003D5...............97..0094..00.....61", 6, 0, adr_cond, mov2_patch, mov2_applied, true, MAKEHOSVERSION(17,0,0), FW_VER_ANY }, + { "blockfirmwareupdates_1.0.0-5.1.0", "0x1139F30301AA81.40F9E0.1191", -30, 0, block_fw_updates_cond, mov0_ret_patch, mov0_ret_applied, true, MAKEHOSVERSION(1,0,0), MAKEHOSVERSION(5,1,0) }, + { "blockfirmwareupdates_6.0.0-6.2.0", "0xF30301AA.4E40F9E0..91", -40, 0, block_fw_updates_cond, mov0_ret_patch, mov0_ret_applied, true, MAKEHOSVERSION(6,0,0), MAKEHOSVERSION(6,2,0) }, + { "blockfirmwareupdates_7.0.0-11.0.1", "0xF30301AA014C40F9F40300AAE0..91", -36, 0, block_fw_updates_cond, mov0_ret_patch, mov0_ret_applied, true, MAKEHOSVERSION(7,0,0), MAKEHOSVERSION(11,0,1) }, + { "blockfirmwareupdates_12.0.0+", "0x280841F9084C00F9E0031F.C0035FD6", 16, 0, block_fw_updates_cond, mov0_ret_patch, mov0_ret_applied, true, MAKEHOSVERSION(12,0,0), FW_VER_ANY }, }; // NOTE: add system titles that you want to be patched to this table. @@ -329,9 +289,10 @@ constinit PatchEntry patches[] = { { "erpt", 0x010000000000002B, erpt_patterns, MAKEHOSVERSION(10,0,0) }, // es was added in fw 2 { "es", 0x0100000000000033, es_patterns, MAKEHOSVERSION(2,0,0) }, + // olsc was added in fw 6 + { "olsc", 0x010000000000003E, olsc_patterns, MAKEHOSVERSION(6,0,0) }, { "nifm", 0x010000000000000F, nifm_patterns }, { "nim", 0x0100000000000025, nim_patterns }, - { "ssl", 0x0100000000000024, ssl_patterns }, }; struct EmummcPaths { @@ -429,6 +390,8 @@ auto apply_patch(PatchEntry& patch) -> bool { constexpr u64 overlap_size = 0x4f; static u8 buffer[READ_BUFFER_SIZE + overlap_size]; + std::memset(buffer, 0, sizeof(buffer)); + // skip if version isn't valid if (VERSION_SKIP && ((patch.min_fw_ver && patch.min_fw_ver > FW_VERSION) || @@ -466,15 +429,6 @@ auto apply_patch(PatchEntry& patch) -> bool { continue; } - // u32 overlap_size = 0; - // for (const auto& pattern : patch.patterns) { - // overlap_size = std::max(overlap_size, static_cast(pattern.byte_pattern.size)); - // } - // u8* buffer = (u8*)aligned_alloc(alignof(u8*), READ_BUFFER_SIZE + overlap_size); - // if (!buffer) { - // svcCloseHandle(handle); - // return false; - // } for (u64 sz = 0; sz < mem_info.size; sz += READ_BUFFER_SIZE - overlap_size) { const auto actual_size = std::min(READ_BUFFER_SIZE, mem_info.size - sz); if (R_FAILED(svcReadDebugProcessMemory(buffer + overlap_size, handle, mem_info.addr + sz, actual_size))) { @@ -483,10 +437,12 @@ auto apply_patch(PatchEntry& patch) -> bool { patcher(handle, std::span{buffer, actual_size + overlap_size}, mem_info.addr + sz - overlap_size, patch.patterns); if (actual_size >= overlap_size) { memcpy(buffer, buffer + actual_size, overlap_size); + std::memset(buffer + overlap_size, 0, READ_BUFFER_SIZE); + } else { + std::memset(buffer, 0, sizeof(buffer)); } } } - // free(buffer); } svcCloseHandle(handle); return true;