From 86c63dfff5dab97339ef13d29e3ff89a956644b4 Mon Sep 17 00:00:00 2001 From: Mr-X-GTA <110748953+Mr-X-GTA@users.noreply.github.com> Date: Fri, 10 May 2024 21:09:10 +0200 Subject: [PATCH] Desync kick protection (#3086) --- cmake/gtav-classes.cmake | 2 +- src/core/settings.hpp | 3 ++- src/gta_pointers.hpp | 2 +- src/hooking/hooking.cpp | 2 +- src/hooking/hooking.hpp | 2 +- .../misc/serialize_join_request_message.cpp | 17 ++++++++++++++++ src/hooks/misc/serialize_player_data_msg.cpp | 20 ------------------- src/hooks/protections/can_apply_data.cpp | 12 +++++------ src/pointers.cpp | 18 ++++++++--------- .../settings/view_protection_settings.cpp | 1 + 10 files changed, 39 insertions(+), 40 deletions(-) delete mode 100644 src/hooks/misc/serialize_player_data_msg.cpp diff --git a/cmake/gtav-classes.cmake b/cmake/gtav-classes.cmake index d36d3b9c..fec37bc5 100644 --- a/cmake/gtav-classes.cmake +++ b/cmake/gtav-classes.cmake @@ -3,7 +3,7 @@ include(FetchContent) FetchContent_Declare( gtav_classes GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git - GIT_TAG b13929ce04c86abb0b5aac3149bafca84de26677 + GIT_TAG df0def702dac8f7ba9bf7107734ac30b4db54e96 GIT_PROGRESS TRUE CONFIGURE_COMMAND "" BUILD_COMMAND "" diff --git a/src/core/settings.hpp b/src/core/settings.hpp index 456cef41..63bd1468 100644 --- a/src/core/settings.hpp +++ b/src/core/settings.hpp @@ -286,8 +286,9 @@ namespace big bool kick_rejoin = true; bool force_relay_connections = false; bool stop_traffic = true; + bool desync_kick = false; - NLOHMANN_DEFINE_TYPE_INTRUSIVE(protections, script_events, rid_join, receive_pickup, admin_check, kick_rejoin, force_relay_connections, stop_traffic) + NLOHMANN_DEFINE_TYPE_INTRUSIVE(protections, script_events, rid_join, receive_pickup, admin_check, kick_rejoin, force_relay_connections, stop_traffic, desync_kick) } protections{}; struct self diff --git a/src/gta_pointers.hpp b/src/gta_pointers.hpp index 018d20d6..c4a3e516 100644 --- a/src/gta_pointers.hpp +++ b/src/gta_pointers.hpp @@ -209,9 +209,9 @@ namespace big PVOID m_sort_session_details; PVOID m_process_matchmaking_find_response; - PVOID m_serialize_player_data_msg; PVOID m_serialize_join_request_message; + PVOID m_serialize_join_request_message_2; functions::give_pickup_rewards m_give_pickup_rewards; functions::send_network_damage m_send_network_damage; diff --git a/src/hooking/hooking.cpp b/src/hooking/hooking.cpp index 439b419e..4c930632 100644 --- a/src/hooking/hooking.cpp +++ b/src/hooking/hooking.cpp @@ -80,9 +80,9 @@ namespace big detour_hook_helper::add("SCM", g_pointers->m_gta.m_send_chat_message); detour_hook_helper::add("PMFR", g_pointers->m_gta.m_process_matchmaking_find_response); - detour_hook_helper::add("SJPD", g_pointers->m_gta.m_serialize_player_data_msg); detour_hook_helper::add("SJRM", g_pointers->m_gta.m_serialize_join_request_message); + detour_hook_helper::add("SJRM2", g_pointers->m_gta.m_serialize_join_request_message_2); detour_hook_helper::add("SMFS", g_pointers->m_gta.m_start_matchmaking_find_sessions); diff --git a/src/hooking/hooking.hpp b/src/hooking/hooking.hpp index 10446659..54c82854 100644 --- a/src/hooking/hooking.hpp +++ b/src/hooking/hooking.hpp @@ -119,8 +119,8 @@ namespace big static bool process_matchmaking_find_response(void* _this, void* unused, rage::JSONNode* node, int* unk); - static bool serialize_player_data_msg(CNetGamePlayerDataMsg* msg, rage::datBitBuffer* buffer); static bool serialize_join_request_message(RemoteGamerInfoMsg* info, void* data, int size, int* bits_serialized); + static bool serialize_join_request_message_2(__int64 msg, void* buf, int size, int* bits_serialized); static bool start_matchmaking_find_sessions(int profile_index, int available_slots, NetworkGameFilterMatchmakingComponent* filter, unsigned int max_sessions, rage::rlSessionInfo* results, int* num_sessions_found, rage::rlTaskStatus* status); diff --git a/src/hooks/misc/serialize_join_request_message.cpp b/src/hooks/misc/serialize_join_request_message.cpp index fe5c26f2..b6cb3a65 100644 --- a/src/hooks/misc/serialize_join_request_message.cpp +++ b/src/hooks/misc/serialize_join_request_message.cpp @@ -1,6 +1,7 @@ #include "gta_util.hpp" #include "hooking/hooking.hpp" +#include #include #include @@ -11,7 +12,23 @@ namespace big if (info->unk_0xC0 == 0) info->unk_0xC0 = 1; // TODO: do we need this anymore? + if (g.protections.desync_kick) + info->m_gamer_info.m_nat_type = 0; + info->m_num_handles = 0; return g_hooking->get_original()(info, data, size, bits_serialized); } + + bool hooks::serialize_join_request_message_2(__int64 msg, void* buf, int size, int* bits_serialized) + { + auto& data = *(CNetGamePlayerDataMsg*)(msg + 0x128); + + if (g.session.join_in_sctv_slots) + data.m_matchmaking_group = 4; + + if (g.protections.desync_kick) + data.m_nat_type = 0; + + return g_hooking->get_original()(msg, buf, size, bits_serialized); + } } \ No newline at end of file diff --git a/src/hooks/misc/serialize_player_data_msg.cpp b/src/hooks/misc/serialize_player_data_msg.cpp deleted file mode 100644 index bd0fd3fd..00000000 --- a/src/hooks/misc/serialize_player_data_msg.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "gta_util.hpp" -#include "hooking/hooking.hpp" - -#include -#include - -namespace big -{ - bool hooks::serialize_player_data_msg(CNetGamePlayerDataMsg* msg, rage::datBitBuffer* buffer) - { - int old_group = msg->m_matchmaking_group; - - if (g.session.join_in_sctv_slots) - msg->m_matchmaking_group = 4; - - bool ret = g_hooking->get_original()(msg, buffer); - msg->m_matchmaking_group = old_group; - return ret; - } -} \ No newline at end of file diff --git a/src/hooks/protections/can_apply_data.cpp b/src/hooks/protections/can_apply_data.cpp index a9347488..67860fab 100644 --- a/src/hooks/protections/can_apply_data.cpp +++ b/src/hooks/protections/can_apply_data.cpp @@ -426,8 +426,8 @@ namespace big break; case sync_node_id("CDynamicEntityGameStateDataNode"): LOG_FIELD(CDynamicEntityGameStateDataNode, m_interior_index); - LOG_FIELD_B(CDynamicEntityGameStateDataNode, unk_00C4); - LOG_FIELD_B(CDynamicEntityGameStateDataNode, unk_00C5); + LOG_FIELD_B(CDynamicEntityGameStateDataNode, m_loads_collisions); + LOG_FIELD_B(CDynamicEntityGameStateDataNode, m_retained); LOG_FIELD(CDynamicEntityGameStateDataNode, m_decor_count); for (int i = 0; i < ((CDynamicEntityGameStateDataNode*)node)->m_decor_count; i++) { @@ -635,13 +635,13 @@ namespace big LOG_FIELD_B(CPhysicalAttachDataNode, m_is_cargo_vehicle); break; case sync_node_id("CPhysicalHealthDataNode"): - LOG_FIELD_B(CPhysicalHealthDataNode, unk_00C0); + LOG_FIELD_B(CPhysicalHealthDataNode, m_has_max_health); LOG_FIELD_B(CPhysicalHealthDataNode, m_has_max_health_changed); LOG_FIELD(CPhysicalHealthDataNode, m_max_health); LOG_FIELD(CPhysicalHealthDataNode, m_current_health); LOG_FIELD_NI(CPhysicalHealthDataNode, m_weapon_damage_entity); LOG_FIELD_H(CPhysicalHealthDataNode, m_weapon_damage_hash); - LOG_FIELD(CPhysicalHealthDataNode, unk_00D8); + LOG_FIELD(CPhysicalHealthDataNode, m_last_damaged_material_id); break; case sync_node_id("CPhysicalMigrationDataNode"): LOG_FIELD_B(CPhysicalMigrationDataNode, m_unk); @@ -933,8 +933,8 @@ namespace big LOG_FIELD_B(CPhysicalGameStateDataNode, m_flag2); LOG_FIELD_B(CPhysicalGameStateDataNode, m_flag3); LOG_FIELD_B(CPhysicalGameStateDataNode, m_flag4); - LOG_FIELD(CPhysicalGameStateDataNode, m_val1); - LOG_FIELD(CPhysicalGameStateDataNode, m_unk204); + LOG_FIELD(CPhysicalGameStateDataNode, m_alpha_type); + LOG_FIELD(CPhysicalGameStateDataNode, m_custom_fade_duration); LOG_FIELD_B(CPhysicalGameStateDataNode, m_unk5); break; case sync_node_id("CPhysicalScriptGameStateDataNode"): diff --git a/src/pointers.cpp b/src/pointers.cpp index a8d4514b..d428d9ad 100644 --- a/src/pointers.cpp +++ b/src/pointers.cpp @@ -752,15 +752,6 @@ namespace big g_pointers->m_gta.m_process_matchmaking_find_response = ptr.as(); } }, - // Serialize Player Data Message - { - "SPDM", - "48 89 5C 24 08 48 89 74 24 10 48 89 7C 24 18 41 56 48 83 EC 20 BF 01 00 00 00", - [](memory::handle ptr) - { - g_pointers->m_gta.m_serialize_player_data_msg = ptr.as(); - } - }, // Serialize Join Request Message { "SJRM", @@ -770,6 +761,15 @@ namespace big g_pointers->m_gta.m_serialize_join_request_message = ptr.add(1).rip().as(); } }, + // Serialize Join Request Message 2 + { + "SJRM2", + "E8 ? ? ? ? 48 8D 8D 08 01 00 00 8A D8", + [](memory::handle ptr) + { + g_pointers->m_gta.m_serialize_join_request_message_2 = ptr.add(1).rip().as(); + } + }, // Send Network Damage { "SND", diff --git a/src/views/settings/view_protection_settings.cpp b/src/views/settings/view_protection_settings.cpp index 36f1fc10..a7585ddb 100644 --- a/src/views/settings/view_protection_settings.cpp +++ b/src/views/settings/view_protection_settings.cpp @@ -60,6 +60,7 @@ namespace big ImGui::Checkbox("VIEW_PROTECTION_SETTINGS_KICK_REJOIN"_T.data(), &g.protections.kick_rejoin); ImGui::Checkbox("BLOCK_TRAFFIC_MANIPULATION"_T.data(), &g.protections.stop_traffic); components::command_checkbox<"forcerelays">(); + ImGui::Checkbox("DESYNC_KICK"_T.data(), &g.protections.desync_kick); ImGui::EndGroup(); ImGui::SeparatorText("VIEW_PROTECTION_SETTINGS_OPTIONS"_T.data());