diff --git a/BigBaseV2/src/function_types.hpp b/BigBaseV2/src/function_types.hpp index 9b3769e9..53d1f164 100644 --- a/BigBaseV2/src/function_types.hpp +++ b/BigBaseV2/src/function_types.hpp @@ -17,4 +17,20 @@ namespace big::functions using increment_stat_event = bool(uint64_t net_event_struct, int64_t sender, int64_t a3); using trigger_script_event = int(int unk0, int64_t* args, int argCount, int bitFlags); + + // Received Event Signatures START + using read_bitbuf_array = bool(rage::datBitBuffer* buffer, PVOID read, int bits, int); + using read_bitbuf_dword = bool(rage::datBitBuffer* buffer, PVOID read, int bits); + using received_event = bool( + rage::netEventMgr* event_manager, + CNetGamePlayer* source_player, + CNetGamePlayer* target_player, + uint16_t event_id, + int event_index, + int event_handled_bitset, + int64_t bit_buffer_size, + int64_t bit_buffer + ); + using send_event_ack = void(rage::netEventMgr* event_manager, CNetGamePlayer* source_player, CNetGamePlayer* target_player, int event_index, int event_handled_bitset); + // Received Event Signatures END } diff --git a/BigBaseV2/src/hooking.cpp b/BigBaseV2/src/hooking.cpp index c21addcb..0238ae6a 100644 --- a/BigBaseV2/src/hooking.cpp +++ b/BigBaseV2/src/hooking.cpp @@ -44,7 +44,9 @@ namespace big m_increment_stat_hook("Increment Stat Event", g_pointers->m_increment_stat_event, &hooks::increment_stat_event), - m_error_screen_hook("Error Screen", g_pointers->m_error_screen, &hooks::disable_error_screen) + m_error_screen_hook("Error Screen", g_pointers->m_error_screen, &hooks::disable_error_screen), + + m_received_event_hook("Received Event", g_pointers->m_received_event, &hooks::received_event) { m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present); m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers); @@ -76,6 +78,8 @@ namespace big m_error_screen_hook.enable(); + m_received_event_hook.enable(); + m_enabled = true; } @@ -83,6 +87,8 @@ namespace big { m_enabled = false; + m_received_event_hook.disable(); + m_error_screen_hook.disable(); m_increment_stat_hook.disable(); diff --git a/BigBaseV2/src/hooking.hpp b/BigBaseV2/src/hooking.hpp index c3595e4d..51518c43 100644 --- a/BigBaseV2/src/hooking.hpp +++ b/BigBaseV2/src/hooking.hpp @@ -28,6 +28,17 @@ namespace big static rage::eThreadState gta_thread_kill(GtaThread* thread); static bool increment_stat_event(uint64_t net_event_struct, CNetGamePlayer* sender, int64_t a3); + + static bool received_event( + rage::netEventMgr* event_manager, + CNetGamePlayer* source_player, + CNetGamePlayer* target_player, + uint16_t event_id, + int event_index, + int event_handled_bitset, + int64_t bit_buffer_size, + int64_t bit_buffer + ); }; struct minhook_keepalive @@ -63,6 +74,8 @@ namespace big detour_hook m_gta_thread_kill_hook; detour_hook m_increment_stat_hook; + + detour_hook m_received_event_hook; }; inline hooking *g_hooking{}; diff --git a/BigBaseV2/src/hooks/received_event.cpp b/BigBaseV2/src/hooks/received_event.cpp new file mode 100644 index 00000000..d6691a0f --- /dev/null +++ b/BigBaseV2/src/hooks/received_event.cpp @@ -0,0 +1,133 @@ +#include "gta/enums.hpp" +#include "gta/net_game_event.hpp" +#include "hooking.hpp" +#include "natives.hpp" +#include "util/notify.hpp" + +namespace big +{ + bool hooks::received_event( + rage::netEventMgr* event_manager, + CNetGamePlayer* source_player, + CNetGamePlayer* target_player, + uint16_t event_id, + int event_index, + int event_handled_bitset, + int64_t bit_buffer_size, + int64_t bit_buffer + ) + { + rage::datBitBuffer* buffer = new rage::datBitBuffer((void*)bit_buffer, (uint32_t)bit_buffer_size); + + if (event_id > 90) return false; + + const char* event_name = *(char**)((DWORD64)event_manager + 8i64 * event_id + 241328); + if (event_name == nullptr || source_player == nullptr || source_player->player_id < 0 || source_player->player_id >= 32) + { + g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); + return false; + } + + switch ((RockstarEvent)event_id) + { + case RockstarEvent::NETWORK_CLEAR_PED_TASKS_EVENT: + { + if (source_player->player_id < 32) + { + g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); + + notify::blocked_event(event_name, source_player->player_id); + + return false; + } + + break; + } + // Don't block this event, we still want to report this player + // because if we still report others, our account seems less fishy + case RockstarEvent::REPORT_CASH_SPAWN_EVENT: + { + uint32_t money; + + buffer->Seek(64); + buffer->ReadDword(&money, 32); + buffer->Seek(0); + + if (money >= 2000) + { + // player is spawning modded cash + } + + break; + } + case RockstarEvent::NETWORK_CHECK_CODE_CRCS_EVENT: + case RockstarEvent::REPORT_MYSELF_EVENT: + { + // player sending this event is a modder + + break; + } + //case RockstarEvent::GIVE_PICKUP_REWARDS_EVENT: + //{ + // uint32_t amount, hash; + // buffer->ReadDword(&amount, 3); + // buffer->ReadDword(&hash, 32); + + // if (func::is_crash_reward(hash) && func::is_crash_pickup(hash)) + // { + // g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); + + // notify::blocked_event(event_name, source_player->player_id); + + // return false; + // } + // buffer->Seek(0); + + // return true; + //} + case RockstarEvent::GAME_CLOCK_EVENT: + { + uint32_t hour, min, sec; + buffer->Seek(21); + buffer->ReadDword(&hour, 6); + buffer->ReadDword(&min, 7); + buffer->ReadDword(&sec, 7); + + if (hour > 23 || min > 59 || sec > 59) + { + g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); + + notify::blocked_event(event_name, source_player->player_id); + + return false; + } + buffer->Seek(0); + + return true; + } + case RockstarEvent::GAME_WEATHER_EVENT: + { + uint32_t propagate, target, weather; + + buffer->ReadDword(&propagate, 1); + buffer->ReadDword(&weather, 5); + if (!propagate) + buffer->ReadDword(&target, 9); + + if (weather > 12 || !propagate) + { + g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset); + + return false; + } + buffer->Seek(0); + + return true; + } + } + + //LOG(INFO) << "Received Event: " << event_name; + + return g_hooking->m_received_event_hook.get_original()(event_manager, source_player, target_player, event_id, event_index, event_handled_bitset, bit_buffer_size, bit_buffer); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/pointers.cpp b/BigBaseV2/src/pointers.cpp index d9f71168..f0c67380 100644 --- a/BigBaseV2/src/pointers.cpp +++ b/BigBaseV2/src/pointers.cpp @@ -137,6 +137,28 @@ namespace big { m_trigger_script_event = ptr.as(); }); + + // Received Event Signatures START + main_batch.add("Received Event", "66 41 83 F9 ? 0F 83 ? ? ? ?", [this](memory::handle ptr) + { + m_received_event = ptr.as(); + }); + + main_batch.add("Read BitBuffer WORD/DWORD", "48 89 74 24 ? 57 48 83 EC 20 48 8B D9 33 C9 41 8B F0 8A", [this](memory::handle ptr) + { + m_read_bitbuf_dword = ptr.sub(5).as(); + }); + + main_batch.add("Read BitBuffer Array", "48 89 5C 24 ? 57 48 83 EC 30 41 8B F8 4C", [this](memory::handle ptr) + { + m_read_bitbuf_array = ptr.as(); + }); + + main_batch.add("Send Event Ack", "48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC 20 80 7A", [this](memory::handle ptr) + { + m_send_event_ack = ptr.sub(5).as(); + }); + // Received Event Signatures END main_batch.run(memory::module(nullptr)); diff --git a/BigBaseV2/src/pointers.hpp b/BigBaseV2/src/pointers.hpp index 9772300d..e438b82a 100644 --- a/BigBaseV2/src/pointers.hpp +++ b/BigBaseV2/src/pointers.hpp @@ -49,6 +49,13 @@ namespace big functions::increment_stat_event* m_increment_stat_event{}; functions::trigger_script_event* m_trigger_script_event{}; + + // Received Event Signatures START + functions::read_bitbuf_array* m_read_bitbuf_array{}; + functions::read_bitbuf_dword* m_read_bitbuf_dword{}; + functions::received_event* m_received_event{}; + functions::send_event_ack* m_send_event_ack{}; + // Received Event Signatures END }; inline pointers *g_pointers{}; diff --git a/BigBaseV2/src/util/notify.hpp b/BigBaseV2/src/util/notify.hpp index bdec4c96..f502b498 100644 --- a/BigBaseV2/src/util/notify.hpp +++ b/BigBaseV2/src/util/notify.hpp @@ -11,6 +11,19 @@ namespace big::notify HUD::END_TEXT_COMMAND_THEFEED_POST_TICKER(false, false); } + inline void blocked_event(const char* name, Player player) + { + char msg[128]; + + strcpy(msg, "~g~BLOCKED RECEIVED EVENT~s~\n~b~"); + strcat(msg, name); + strcat(msg, "~s~\nFrom: "); + strcat(msg, PLAYER::GET_PLAYER_NAME(player)); + strcat(msg, ""); + + above_map(msg); + } + inline void display_help_text(const char* text) { HUD::BEGIN_TEXT_COMMAND_DISPLAY_HELP("STRING");