From 046759a8cc643ddd9fd624c6e0b34756fd944dcd Mon Sep 17 00:00:00 2001 From: Yimura Date: Wed, 16 Mar 2022 15:55:27 +0100 Subject: [PATCH] feat(Protections): Added version mismatch patch --- BigBaseV2/src/hooking.cpp | 8 +++++- BigBaseV2/src/hooking.hpp | 4 +++ BigBaseV2/src/hooks/net_array_handler.cpp | 35 +++++++++++++++++++++++ BigBaseV2/src/pointers.cpp | 9 +++++- BigBaseV2/src/pointers.hpp | 1 + 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 BigBaseV2/src/hooks/net_array_handler.cpp diff --git a/BigBaseV2/src/hooking.cpp b/BigBaseV2/src/hooking.cpp index dfd10099..d2d86b01 100644 --- a/BigBaseV2/src/hooking.cpp +++ b/BigBaseV2/src/hooking.cpp @@ -36,7 +36,9 @@ namespace big // Network Player Mgr Shutdown m_network_player_mgr_shutdown_hook("NPMS", g_pointers->m_network_player_mgr_shutdown, &hooks::network_player_mgr_shutdown), - + + m_net_array_handler_hook("net_array_handler", g_pointers->m_net_array_handler, &hooks::net_array_handler), + // Increment Stat Event m_increment_stat_hook("ISE", g_pointers->m_increment_stat_event, &hooks::increment_stat_event), // Is DLC Present @@ -88,6 +90,8 @@ namespace big m_network_player_mgr_shutdown_hook.enable(); + m_net_array_handler_hook.enable(); + m_player_has_joined_hook.enable(); m_player_has_left_hook.enable(); @@ -121,6 +125,8 @@ namespace big m_player_has_joined_hook.disable(); m_player_has_left_hook.disable(); + m_net_array_handler_hook.disable(); + m_network_player_mgr_shutdown_hook.disable(); m_gta_thread_tick_hook.disable(); diff --git a/BigBaseV2/src/hooking.hpp b/BigBaseV2/src/hooking.hpp index a36dcdce..3cd4a810 100644 --- a/BigBaseV2/src/hooking.hpp +++ b/BigBaseV2/src/hooking.hpp @@ -42,6 +42,8 @@ namespace big static void network_player_mgr_shutdown(CNetworkPlayerMgr* _this); + static bool net_array_handler(__int64 netArrayHandlerBaseMgr, unsigned __int8* a2, rage::datBitBuffer* datbitbuffer, unsigned int bytes_to_read, __int16 a5); + static void player_join(CNetworkObjectMgr* _this, CNetGamePlayer* net_player); static void player_leave(CNetworkObjectMgr* _this, CNetGamePlayer* net_player); @@ -99,6 +101,8 @@ namespace big detour_hook m_network_player_mgr_shutdown_hook; + detour_hook m_net_array_handler_hook; + detour_hook m_player_has_joined_hook; detour_hook m_player_has_left_hook; diff --git a/BigBaseV2/src/hooks/net_array_handler.cpp b/BigBaseV2/src/hooks/net_array_handler.cpp new file mode 100644 index 00000000..7a1ba80c --- /dev/null +++ b/BigBaseV2/src/hooks/net_array_handler.cpp @@ -0,0 +1,35 @@ +#include "hooking.hpp" + +namespace big +{ + // in this hook we rebuild how the game reads data from the datBitBuffer + // we specifically recreate what the game uses to "detect" the NET_ARRAY_ERROR + // then if we find such a crash we just return false; + bool hooks::net_array_handler(long long netArrayHandlerBaseMgr, unsigned char* a2, rage::datBitBuffer* datbitbuffer, unsigned int bytes_to_read, short a5) + { + if (g_running) + { + DWORD test = 0; + + const auto bytes_start = datbitbuffer->m_bitsRead; + for (unsigned int i = datbitbuffer->m_bitsRead - bytes_start; + i < bytes_to_read; + i = datbitbuffer->m_bitsRead - bytes_start) + { + const auto bytes_read_before = datbitbuffer->m_bitsRead; + g_pointers->m_read_bitbuf_dword(datbitbuffer, &test, 1u); + + if (bytes_read_before == datbitbuffer->m_bitsRead) + { + LOG(INFO) << "NET_ARRAY_ERROR caught, someones probably trying to crash us."; + + return false; + } + } + + datbitbuffer->Seek(bytes_start); + } + + return g_hooking->m_net_array_handler_hook.get_original()(netArrayHandlerBaseMgr, a2, datbitbuffer, bytes_to_read, a5); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/pointers.cpp b/BigBaseV2/src/pointers.cpp index bb1f1514..db5a27ed 100644 --- a/BigBaseV2/src/pointers.cpp +++ b/BigBaseV2/src/pointers.cpp @@ -225,12 +225,14 @@ namespace big m_network_player_mgr_shutdown = ptr.sub(0x17).as(); }); + // FriendRegistry main_batch.add("FR", "3B 0D ? ? ? ? 73 13 48 63 C9", [this](memory::handle ptr) { m_friend_registry = ptr.add(2).rip().as(); }); - main_batch.add("GET_SCREEN_COORDS_FROM_WORLD_COORDS", "E8 ? ? ? ? 84 C0 74 19 F3 0F 10 44 24", [this](memory::handle ptr) + // GET_SCREEN_COORDS_FROM_WORLD_COORDS + main_batch.add("GSCFWC", "E8 ? ? ? ? 84 C0 74 19 F3 0F 10 44 24", [this](memory::handle ptr) { m_get_screen_coords_for_world_coords = ptr.add(1).rip().as(); }); @@ -241,6 +243,11 @@ namespace big m_get_gamplay_cam_coords = ptr.as(); }); + // net array handler - version mismatch patch + main_batch.add("NAH", "44 8B E0 89 45 F4 48 8B 03 48 8B CB FF 90", [this](memory::handle ptr) + { + m_net_array_handler = ptr.sub(0x3C).as(); + }); main_batch.run(memory::module(nullptr)); diff --git a/BigBaseV2/src/pointers.hpp b/BigBaseV2/src/pointers.hpp index 7512ff96..0dc1931f 100644 --- a/BigBaseV2/src/pointers.hpp +++ b/BigBaseV2/src/pointers.hpp @@ -59,6 +59,7 @@ namespace big PVOID m_gta_thread_kill{}; PVOID m_network_player_mgr_shutdown; + PVOID m_net_array_handler; PVOID m_player_has_joined{}; PVOID m_player_has_left{};