feat(Protections): Added scripted game event protection

This commit is contained in:
Yimura 2021-07-26 00:38:03 +02:00
parent db13703b43
commit 55ab43563e
7 changed files with 231 additions and 1 deletions

View File

@ -13,6 +13,28 @@ namespace big
VEHICLE_GUN
};
enum class RemoteEvent : int64_t
{
Bounty = -1906146218,
CeoBan = 1355230914,
CeoKick = -316948135,
CeoMoney = 1152266822,
ClearWantedLevel = 1187364773,
FakeDeposit = 153488394,
ForceMission = -1147284669,
GtaBanner = 1659915470,
PersonalVehicleDestroyed = 299217086,
RemoteOffradar = -397188359,
RotateCam = -1320260596,
SendToCutscene = 1889984715,
SendToIsland = -1479371259,
SoundSpam = 1537221257,
Spectate = -148441291,
Teleport = 1249026189,
TransactionError = -2041535807,
VehicleKick = -1005623606
};
enum class SpeedoMeter
{
DISABLED,

View File

@ -21,6 +21,26 @@ struct globals {
bool spectating = false;
};
struct protections {
bool bounty = true;
bool ceo_ban = true;
bool ceo_kick = true;
bool ceo_money = true;
bool clear_wanted_level = true;
bool fake_deposit = true;
bool force_mission = true;
bool force_teleport = true;
bool gta_banner = true;
bool personal_vehicle_destroyed = true;
bool remote_off_radar = true;
bool send_to_cutscene = true;
bool send_to_island = true;
bool sound_spam = true;
bool spectate = true;
bool transaction_error = true;
bool vehicle_kick = true;
};
struct self {
bool godmode = false;
bool off_radar = false;
@ -56,6 +76,7 @@ struct globals {
tunables tunables{};
player player{};
protections protections{};
self self{};
vehicle vehicle{};
weapons weapons{};
@ -63,6 +84,24 @@ struct globals {
void from_json(const nlohmann::json& j)
{
this->protections.bounty = j["protections"]["bounty"];
this->protections.ceo_ban = j["protections"]["ceo_ban"];
this->protections.ceo_kick = j["protections"]["ceo_kick"];
this->protections.ceo_money = j["protections"]["ceo_money"];
this->protections.clear_wanted_level = j["protections"]["clear_wanted_level"];
this->protections.fake_deposit = j["protections"]["fake_deposit"];
this->protections.force_mission = j["protections"]["force_mission"];
this->protections.force_teleport = j["protections"]["force_teleport"];
this->protections.gta_banner = j["protections"]["gta_banner"];
this->protections.personal_vehicle_destroyed = j["protections"]["personal_vehicle_destroyed"];
this->protections.remote_off_radar = j["protections"]["remote_off_radar"];
this->protections.send_to_cutscene = j["protections"]["send_to_cutscene"];
this->protections.send_to_island = j["protections"]["send_to_island"];
this->protections.sound_spam = j["protections"]["sound_spam"];
this->protections.spectate = j["protections"]["spectate"];
this->protections.transaction_error = j["protections"]["transaction_error"];
this->protections.vehicle_kick = j["protections"]["vehicle_kick"];
this->tunables.disable_phone = j["tunables"]["disable_phone"];
this->tunables.no_idle_kick = j["tunables"]["no_idle_kick"];
@ -84,6 +123,27 @@ struct globals {
nlohmann::json to_json()
{
return nlohmann::json{
{
"protections", {
{ "bounty", this->protections.bounty },
{ "ceo_ban", this->protections.ceo_ban },
{ "ceo_kick", this->protections.ceo_kick },
{ "ceo_money", this->protections.ceo_money },
{ "clear_wanted_level", this->protections.clear_wanted_level },
{ "fake_deposit", this->protections.fake_deposit },
{ "force_mission", this->protections.force_mission },
{ "force_teleport", this->protections.force_teleport },
{ "gta_banner", this->protections.gta_banner },
{ "personal_vehicle_destroyed", this->protections.personal_vehicle_destroyed },
{ "remote_off_radar", this->protections.remote_off_radar },
{ "send_to_cutscene", this->protections.send_to_cutscene },
{ "send_to_island", this->protections.send_to_island },
{ "sound_spam", this->protections.sound_spam },
{ "spectate", this->protections.spectate },
{ "transaction_error", this->protections.transaction_error },
{ "vehicle_kick", this->protections.vehicle_kick }
}
},
{
"tunables", {
{ "disable_phone", this->tunables.disable_phone },

View File

@ -59,7 +59,10 @@ namespace big
// Report Cash Spawn Event
m_report_cash_spawn_event_hook("RCSE", g_pointers->m_report_cash_spawn, &hooks::report_cash_spawn_handler),
// Report Cheating Hook
m_report_cheating_hook("RC", g_pointers->m_report_cheating, &hooks::report_cheating_handler)
m_report_cheating_hook("RC", g_pointers->m_report_cheating, &hooks::report_cheating_handler),
// Scripted Game Event Hook
m_scripted_game_event_hook("SGEH", g_pointers->m_scripted_game_event, &hooks::scripted_game_event)
{
m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present);
m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers);
@ -96,6 +99,8 @@ namespace big
m_report_cash_spawn_event_hook.enable();
m_report_cheating_hook.enable();
m_scripted_game_event_hook.enable();
m_enabled = true;
}
@ -103,6 +108,8 @@ namespace big
{
m_enabled = false;
m_scripted_game_event_hook.disable();
m_report_cheating_hook.disable();
m_report_cash_spawn_event_hook.disable();

View File

@ -43,6 +43,8 @@ namespace big
static bool report_cash_spawn_handler(__int64 creport_cash_spawn_event, CNetGamePlayer* source_player);
static void report_cheating_handler(__int64 a1, unsigned int a2, unsigned int a3, unsigned int a4);
static bool scripted_game_event(CScriptedGameEvent* scripted_game_event, CNetGamePlayer* player);
};
struct minhook_keepalive
@ -83,6 +85,8 @@ namespace big
detour_hook m_report_cash_spawn_event_hook;
detour_hook m_report_cheating_hook;
detour_hook m_scripted_game_event_hook;
};
inline hooking *g_hooking{};

View File

@ -0,0 +1,130 @@
#include "hooking.hpp"
#include "gta/enums.hpp"
#include "util/notify.hpp"
namespace big
{
bool hooks::scripted_game_event(CScriptedGameEvent* scripted_game_event, CNetGamePlayer* player)
{
auto args = scripted_game_event->m_args;
RemoteEvent hash = (RemoteEvent)args[0];
char type[32] = "";
switch (hash)
{
case RemoteEvent::Bounty:
if (g.protections.bounty)
strcpy(type, "Bounty");
break;
case RemoteEvent::CeoBan:
if (g.protections.ceo_ban)
strcpy(type, "Ceo Ban");
break;
case RemoteEvent::CeoKick:
if (g.protections.ceo_kick)
strcpy(type, "Ceo Kick");
break;
case RemoteEvent::CeoMoney:
if (g.protections.ceo_money)
strcpy(type, "Ceo Money");
break;
case RemoteEvent::ClearWantedLevel:
if (g.protections.clear_wanted_level)
strcpy(type, "Clear Wanted Level");
break;
case RemoteEvent::FakeDeposit:
if (g.protections.fake_deposit)
strcpy(type, "Fake Deposit");
break;
case RemoteEvent::ForceMission:
if (g.protections.force_mission)
strcpy(type, "Force Mission");
break;
case RemoteEvent::GtaBanner:
if (g.protections.gta_banner)
strcpy(type, "GTA Banner");
break;
case RemoteEvent::PersonalVehicleDestroyed:
if (g.protections.personal_vehicle_destroyed)
strcpy(type, "Personal Vehicle Destroyed");
break;
case RemoteEvent::RemoteOffradar:
if (g.protections.remote_off_radar)
strcpy(type, "Remote Off Radar");
break;
case RemoteEvent::SendToCutscene:
if (g.protections.send_to_cutscene)
strcpy(type, "Send To Cutscene");
break;
case RemoteEvent::SendToIsland:
if (g.protections.send_to_island)
strcpy(type, "Send To Island");
break;
case RemoteEvent::SoundSpam:
if (g.protections.sound_spam)
strcpy(type, "Sound Spam");
break;
case RemoteEvent::Spectate:
if (g.protections.spectate)
strcpy(type, "Specate");
break;
case RemoteEvent::Teleport:
if (g.protections.force_teleport)
strcpy(type, "Force Teleport");
break;
case RemoteEvent::TransactionError:
if (g.protections.transaction_error)
strcpy(type, "Transaction Error");
break;
case RemoteEvent::VehicleKick:
if (g.protections.vehicle_kick)
strcpy(type, "Vehicle Kick");
break;
}
if (strlen(type) != 0)
{
char msg[128];
strcpy(msg, "~g~BLOCKED SCRIPT EVENT~s~\nFrom: <C>");
strcat(msg, player->get_name());
strcat(msg, "</C>\nEvent Type: ~b~");
strcat(msg, type);
notify::above_map(msg);
return true;
}
if (false)
{
LOG(INFO) << "Received Script Event";
LOG(INFO) << "Player: " << player->get_name();
LOG(INFO) << "Hash: " << (int64_t)hash;
for (int i = 1; i < sizeof(args); i++)
LOG(INFO) << "Arg #" << i << ": " << args[i];
}
return g_hooking->m_scripted_game_event_hook.get_original<decltype(&hooks::scripted_game_event)>()(scripted_game_event, player);
}
}

View File

@ -179,6 +179,12 @@ namespace big
{
m_report_cheating = ptr.as<decltype(m_report_cheating)>();
});
// Scripted Game Event Handler
main_batch.add("SGEH", "40 53 48 81 EC ? ? ? ? 44 8B 81 ? ? ? ? 4C 8B CA 41 8D 40 FF 3D ? ? ? ? 77 42", [this](memory::handle ptr)
{
m_scripted_game_event = ptr.as<decltype(m_scripted_game_event)>();
});
main_batch.run(memory::module(nullptr));

View File

@ -43,6 +43,7 @@ namespace big
functions::increment_stat_event* m_increment_stat_event{};
PVOID m_scripted_game_event{};
functions::trigger_script_event* m_trigger_script_event{};
// Received Event Signatures START