feat(Protections): Added received event
This commit is contained in:
parent
a9ea72ab3b
commit
6001b9e9b7
@ -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
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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{};
|
||||
|
133
BigBaseV2/src/hooks/received_event.cpp
Normal file
133
BigBaseV2/src/hooks/received_event.cpp
Normal 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);
|
||||
}
|
||||
}
|
@ -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));
|
||||
|
||||
|
@ -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{};
|
||||
|
@ -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");
|
||||
|
Reference in New Issue
Block a user