feat(Protections): Added received event

This commit is contained in:
Yimura 2021-05-25 12:58:33 +02:00
parent a9ea72ab3b
commit 6001b9e9b7
No known key found for this signature in database
GPG Key ID: 3D8FF4397E768682
7 changed files with 211 additions and 1 deletions

View File

@ -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
}

View File

@ -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();

View File

@ -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{};

View File

@ -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<decltype(&received_event)>()(event_manager, source_player, target_player, event_id, event_index, event_handled_bitset, bit_buffer_size, bit_buffer);
}
}

View File

@ -137,6 +137,28 @@ namespace big
{
m_trigger_script_event = ptr.as<decltype(m_trigger_script_event)>();
});
// Received Event Signatures START
main_batch.add("Received Event", "66 41 83 F9 ? 0F 83 ? ? ? ?", [this](memory::handle ptr)
{
m_received_event = ptr.as<decltype(m_received_event)>();
});
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<decltype(m_read_bitbuf_dword)>();
});
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<decltype(m_read_bitbuf_array)>();
});
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<decltype(m_send_event_ack)>();
});
// Received Event Signatures END
main_batch.run(memory::module(nullptr));

View File

@ -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{};

View File

@ -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: <C>");
strcat(msg, PLAYER::GET_PLAYER_NAME(player));
strcat(msg, "</C>");
above_map(msg);
}
inline void display_help_text(const char* text)
{
HUD::BEGIN_TEXT_COMMAND_DISPLAY_HELP("STRING");