From 57579cf2bd251b71dfaeef6aacbe853721e3d56c Mon Sep 17 00:00:00 2001 From: LightCat Date: Sun, 28 Feb 2021 11:50:08 +0100 Subject: [PATCH] Fix crashes with bytepatches on specific hardware due to memory being marked non readable (#1364) * Try to fix bytepatch crash * Try some more potential fixes * More changes --- include/bytepatch.hpp | 24 +++++++++++++++++++++--- src/hacks/BulletTracers.cpp | 6 ++++++ src/hacks/Misc.cpp | 8 +++++++- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/include/bytepatch.hpp b/include/bytepatch.hpp index 32e8acd5..396994c9 100644 --- a/include/bytepatch.hpp +++ b/include/bytepatch.hpp @@ -29,21 +29,39 @@ public: addr = static_cast(static_cast(addr) + offset); size = patch.size(); original.resize(size); - memcpy(&original[0], addr, size); + Copy(); } BytePatch(uintptr_t addr, std::vector patch) : addr{ reinterpret_cast(addr) }, patch_bytes{ patch } { size = patch.size(); original.resize(size); - memcpy(&original[0], reinterpret_cast(addr), size); + Copy(); } BytePatch(void *addr, std::vector patch) : addr{ addr }, patch_bytes{ patch } { size = patch.size(); original.resize(size); - memcpy(&original[0], addr, size); + Copy(); } + static void mprotectAddr(unsigned addr, int size, int flags) + { + void *page = (void *) ((uint64_t) addr & ~0xFFF); + void *end_page = (void *) (((uint64_t)(addr) + size) & ~0xFFF); + uintptr_t mprot_len = (uint64_t) end_page - (uint64_t) page + 0xFFF; + + mprotect(page, mprot_len, flags); + } + void Copy() + { + void *page = (void *) ((uint64_t) addr & ~0xFFF); + void *end_page = (void *) (((uint64_t)(addr) + size) & ~0xFFF); + uintptr_t mprot_len = (uint64_t) end_page - (uint64_t) page + 0xFFF; + + mprotect(page, mprot_len, PROT_READ | PROT_WRITE | PROT_EXEC); + memcpy(&original[0], addr, size); + mprotect(page, mprot_len, PROT_EXEC); + } void Patch() { if (!patched) diff --git a/src/hacks/BulletTracers.cpp b/src/hacks/BulletTracers.cpp index edccf8da..93baff7d 100644 --- a/src/hacks/BulletTracers.cpp +++ b/src/hacks/BulletTracers.cpp @@ -236,6 +236,12 @@ static InitRoutine init([]() { static auto addr4 = gSignatures.GetClientSignature("E8 ? ? ? ? 8D 85 ? ? ? ? 89 7C 24 0C 89 44 24 10"); static auto addr5 = gSignatures.GetClientSignature("E8 ? ? ? ? 8D 65 F4 5B 5E 5F 5D C3 8D 76 00 8B 43 0C"); // FX_Tracer detour + BytePatch::mprotectAddr(addr1 + 1, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + BytePatch::mprotectAddr(addr2 + 1, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + BytePatch::mprotectAddr(addr3 + 1, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + BytePatch::mprotectAddr(addr4 + 1, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + BytePatch::mprotectAddr(addr5 + 1, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + GetParticleSystemNameFromIndex_fn = GetParticleSystemNameFromIndex_t(e8call(addr1 + 7)); GetActiveTFWeapon_fn = GetActiveTFWeapon_t(e8call_direct(addr2)); DispatchEffect_fn = DispatchEffect_t(e8call_direct(addr3)); diff --git a/src/hacks/Misc.cpp b/src/hacks/Misc.cpp index fc2b60af..460dbacf 100644 --- a/src/hacks/Misc.cpp +++ b/src/hacks/Misc.cpp @@ -963,7 +963,13 @@ inline void force_wait_func(bool after) { // Enable the wait command int **enable_wait = (int **) (enable_wait_signature + 3); - **enable_wait = true; + + BytePatch::mprotectAddr((uintptr_t) enable_wait, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + BytePatch::mprotectAddr((uintptr_t) *enable_wait, 4, PROT_READ | PROT_WRITE | PROT_EXEC); + + **enable_wait = true; + BytePatch::mprotectAddr((uintptr_t) enable_wait, 4, PROT_EXEC); + patch_wait.Patch(); } else