Improve protections (#428)

This commit is contained in:
maybegreat48 2022-08-29 10:26:18 +00:00 committed by GitHub
parent 4336a403e4
commit 8e7677e500
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 207 additions and 31 deletions

View File

@ -141,14 +141,12 @@ namespace big
CeoKick = -1425016400, // BGDISMISSED CeoKick = -1425016400, // BGDISMISSED
CeoMoney = 547083265, // Goon_Paid_Large CeoMoney = 547083265, // Goon_Paid_Large
ClearWantedLevel = 1449852136, ClearWantedLevel = 1449852136,
FakeDeposit = -1529596656, // TICK_ATTVAN
ForceMission = -283041276, // ), Var0.f_2, 1)) ForceMission = -283041276, // ), Var0.f_2, 1))
ForceMission2 = -1908874529, ForceMission2 = -1908874529,
GtaBanner = 145637109, // NETWORK::NETWORK_IS_SCRIPT_ACTIVE("BUSINESS_BATTLES", -1, true, 0) second one GtaBanner = 145637109, // NETWORK::NETWORK_IS_SCRIPT_ACTIVE("BUSINESS_BATTLES", -1, true, 0) second one
NetworkBail = 1674887089, // NETWORK::NETWORK_BAIL(16, 0, 0); xref func NetworkBail = 1674887089, // NETWORK::NETWORK_BAIL(16, 0, 0); xref func
PersonalVehicleDestroyed = -1838276770, // PLYVEH_INS_DES1 PersonalVehicleDestroyed = -1838276770, // PLYVEH_INS_DES1
RemoteOffradar = -1973627888, // NETWORK::GET_TIME_DIFFERENCE(NETWORK::GET_NETWORK_TIME(), Var0.f_2) RemoteOffradar = -1973627888, // NETWORK::GET_TIME_DIFFERENCE(NETWORK::GET_NETWORK_TIME(), Var0.f_2)
RotateCam = -1388926377, // CnCTG_IN_BF
SendToCutscene = 2131601101, // (bVar3, bVar4, 125f, 1) SendToCutscene = 2131601101, // (bVar3, bVar4, 125f, 1)
SendToCayoPerico = 1361475530, // CELL_HI_INV SendToCayoPerico = 1361475530, // CELL_HI_INV
SendToLocation = 1214823473, // &Var222, 11); SendToLocation = 1214823473, // &Var222, 11);
@ -156,6 +154,7 @@ namespace big
SoundSpam = 1111927333, // CELL_APTINVYACHT SoundSpam = 1111927333, // CELL_APTINVYACHT
Spectate = -2131157870, // SPEC_TCK1 Spectate = -2131157870, // SPEC_TCK1
Teleport = -1390976345, // Mission_Pass_Notify Teleport = -1390976345, // Mission_Pass_Notify
TeleportToWarehouse = 2130458390, // CAM::FORCE_CINEMATIC_RENDERING_THIS_UPDATE(true) xref counter
TransactionError = -768108950, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH TransactionError = -768108950, // NETWORK_RECEIVE_PLAYER_JOBSHARE_CASH
VehicleKick = -714268990, // PIM_RFMOC VehicleKick = -714268990, // PIM_RFMOC
Kick = 1674887089, Kick = 1674887089,
@ -163,9 +162,77 @@ namespace big
ChangeMCRole = 656530441, // _PLAYSTATS_CHANGE_MC_ROLE ChangeMCRole = 656530441, // _PLAYSTATS_CHANGE_MC_ROLE
DisableRecording = 867047895, // GET_FINAL_RENDERED_CAM_COORD DisableRecording = 867047895, // GET_FINAL_RENDERED_CAM_COORD
MCTeleport = -555356783, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one) MCTeleport = -555356783, // NETWORK::NETWORK_HASH_FROM_PLAYER_HANDLE(PLAYER::PLAYER_ID()) == (first one)
StartActivity = 1368055548, // (Var0.f_2, -1); first match
Crash = -1386010354, // SET_NO_LOADING_SCREEN, xref it Crash = 526822748, // SET_NO_LOADING_SCREEN, xref it
Crash2 = 1348481963, Crash2 = 1348481963,
TSECommand = -1388926377, // CnCTG_IN_BF
TSECommandRotateCam = -1762807505, // != 29) && f
Notification = -1529596656,
NotificationMoneyBanked = -849958015, // TICK_TC_BANK
NotificationMoneyRemoved = -290070531, // TICK_TC_REMO
NotificationMoneyStolen = -1640162684, // TICK_TC_STOL
};
enum class eActivityType
{
HeistPrep = 233,
Gunrunning = 180,
Sightseer = 142,
HeadHunter = 166,
BuySpecialCargo = 167,
SellSpecialCargo = 168,
DefendSpecialCargo = 169,
StealVehicle = 178,
ExportVehicle = 188,
Gunrunning2 = 225,
GunrunningSell = 226,
GunrunningDefend = 227,
BikerSell = 190,
BikerDefend = 191,
BusinessResupply = 192,
Survival = 3,
Darts = 14,
ArmWresling = 15,
GangAttack = 6,
PilotSchool = 122,
Golf = 11,
ShootingRange = 13,
Tennis = 12,
BaseJump = 8,
Deathmatch = 1,
ImpromptuDeathmatch = 5,
Mission = 0,
Race = 2,
ExecutiveDeathmatch = 148,
MarkedForDeath = 151,
PiracyPrevention = 152,
MostWanted = 153,
AssetRecovery = 157,
HostileTakeover = 159,
Point2Point = 162,
AmphibiousAssault = 216,
Velocity = 219,
GunsForHire = 185,
ByThePound = 182,
RippingItUp = 194,
RaceToPoint = 189,
HitAndRide = 193,
CriminalMischief = 205,
WeaponOfChoice = 186,
FragileGoods = 207,
Torched = 208,
Outrider = 209,
WheelieRider = 210,
POW = 183,
ExecutiveSearch = 199,
StandYourGround = 201,
AutoBuyout = 163,
DueDiligence = 160,
MarketManipulation = 154,
CourierService = 155,
}; };
enum class eSessionType enum class eSessionType

View File

@ -62,6 +62,8 @@ namespace big
pair transaction_error{}; pair transaction_error{};
pair tse_freeze{}; pair tse_freeze{};
pair vehicle_kick{}; pair vehicle_kick{};
pair teleport_to_warehouse{};
pair start_activity{};
} script_event_handler{}; } script_event_handler{};
pair gta_thread_kill{}; pair gta_thread_kill{};
@ -116,6 +118,8 @@ namespace big
bool spectate = true; bool spectate = true;
bool transaction_error = true; bool transaction_error = true;
bool vehicle_kick = true; bool vehicle_kick = true;
bool teleport_to_warehouse = true;
bool start_activity = true;
}; };
script_events script_events{}; script_events script_events{};
@ -464,6 +468,10 @@ namespace big
script_handler.tse_freeze.notify = script_handler_j["tse_freeze"]["notify"]; script_handler.tse_freeze.notify = script_handler_j["tse_freeze"]["notify"];
script_handler.vehicle_kick.log = script_handler_j["vehicle_kick"]["log"]; script_handler.vehicle_kick.log = script_handler_j["vehicle_kick"]["log"];
script_handler.vehicle_kick.notify = script_handler_j["vehicle_kick"]["notify"]; script_handler.vehicle_kick.notify = script_handler_j["vehicle_kick"]["notify"];
script_handler.teleport_to_warehouse.log = script_handler_j["teleport_to_warehouse"]["log"];
script_handler.teleport_to_warehouse.notify = script_handler_j["teleport_to_warehouse"]["notify"];
script_handler.start_activity.log = script_handler_j["start_activity"]["log"];
script_handler.start_activity.notify = script_handler_j["start_activity"]["notify"];
} }
g->notifications.send_net_info_to_lobby.log = j["notifications"]["send_net_info_to_lobby"]["log"]; g->notifications.send_net_info_to_lobby.log = j["notifications"]["send_net_info_to_lobby"]["log"];
@ -497,6 +505,8 @@ namespace big
script_handler.spectate = script_handler_j["spectate"]; script_handler.spectate = script_handler_j["spectate"];
script_handler.transaction_error = script_handler_j["transaction_error"]; script_handler.transaction_error = script_handler_j["transaction_error"];
script_handler.vehicle_kick = script_handler_j["vehicle_kick"]; script_handler.vehicle_kick = script_handler_j["vehicle_kick"];
script_handler.teleport_to_warehouse = script_handler_j["teleport_to_warehouse"];
script_handler.start_activity = script_handler_j["start_activity"];
} }
this->tunables.disable_phone = j["tunables"]["disable_phone"]; this->tunables.disable_phone = j["tunables"]["disable_phone"];
@ -704,7 +714,9 @@ namespace big
{ "spectate", return_notify_pair(script_handler_notifications.spectate) }, { "spectate", return_notify_pair(script_handler_notifications.spectate) },
{ "transaction_error", return_notify_pair(script_handler_notifications.transaction_error) }, { "transaction_error", return_notify_pair(script_handler_notifications.transaction_error) },
{ "tse_freeze", return_notify_pair(script_handler_notifications.tse_freeze) }, { "tse_freeze", return_notify_pair(script_handler_notifications.tse_freeze) },
{ "vehicle_kick", return_notify_pair(script_handler_notifications.vehicle_kick) } { "vehicle_kick", return_notify_pair(script_handler_notifications.vehicle_kick) },
{ "teleport_to_warehouse", return_notify_pair(script_handler_notifications.teleport_to_warehouse) },
{ "start_activity", return_notify_pair(script_handler_notifications.start_activity) }
} }
}, },
{ "send_net_info_to_lobby", return_notify_pair(g->notifications.send_net_info_to_lobby) }, { "send_net_info_to_lobby", return_notify_pair(g->notifications.send_net_info_to_lobby) },
@ -739,7 +751,9 @@ namespace big
{ "sound_spam", script_handler_protections.sound_spam }, { "sound_spam", script_handler_protections.sound_spam },
{ "spectate", script_handler_protections.spectate }, { "spectate", script_handler_protections.spectate },
{ "transaction_error", script_handler_protections.transaction_error }, { "transaction_error", script_handler_protections.transaction_error },
{ "vehicle_kick", script_handler_protections.vehicle_kick } { "vehicle_kick", script_handler_protections.vehicle_kick },
{ "teleport_to_warehouse", script_handler_protections.teleport_to_warehouse },
{ "start_activity", script_handler_protections.start_activity },
} }
} }
} }

View File

@ -21,6 +21,7 @@ namespace big
else else
return false; return false;
} }
bool hooks::receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame) bool hooks::receive_net_message(void* netConnectionManager, void* a2, rage::netConnection::InFrame* frame)
{ {
if (frame->get_type() == 4) if (frame->get_type() == 4)
@ -33,18 +34,37 @@ namespace big
{ {
switch (msgType) switch (msgType)
{ {
//Desync Kick //Desync Kick
case rage::eNetMessage::CMsgNetComplaint: case rage::eNetMessage::CMsgNetComplaint:
{
uint64_t hostToken;
buffer.ReadQWord(&hostToken, 0x40);
buffer.Seek(0);
player_ptr sender = g_player_service->get_by_host_token(hostToken);
sender->get_net_game_player()->m_complaints = USHRT_MAX; //Sender
g_notification_service->push_warning("Blocked Kick", fmt::format("Desync kick from {}", sender->get_name()));
buffer.Seek(0);
return false;
}
case rage::eNetMessage::CMsgScriptMigrateHost:
{
if (std::chrono::system_clock::now() - player->m_last_transition_msg_sent < 200ms)
{ {
uint64_t hostToken; if (player->m_num_failed_transition_attempts++ == 20)
buffer.ReadQWord(&hostToken, 0x40); {
buffer.Seek(0); g_notification_service->push_error("Protections", fmt::format("{} tried to OOM kick you!", player->get_name()));
player_ptr sender = g_player_service->get_by_host_token(hostToken); }
sender->get_net_game_player()->m_complaints = USHRT_MAX; //Sender return true;
g_notification_service->push_warning("Blocked Kick", fmt::format("Desync kick from {}", sender->get_name()));
buffer.Seek(0);
return false;
} }
else
{
player->m_last_transition_msg_sent = std::chrono::system_clock::now();
player->m_num_failed_transition_attempts = 0;
}
break;
}
} }
} }
} }

View File

@ -74,12 +74,19 @@ namespace big
return true; return true;
} }
break; break;
case eRemoteEvent::FakeDeposit: case eRemoteEvent::Notification:
if (g->protections.script_events.fake_deposit) switch (static_cast<eRemoteEvent>(args[2]))
{ {
format_string(player_name, "Fake Deposit", notify.fake_deposit.log, notify.fake_deposit.notify); case eRemoteEvent::NotificationMoneyBanked:
case eRemoteEvent::NotificationMoneyRemoved:
case eRemoteEvent::NotificationMoneyStolen:
if (g->protections.script_events.fake_deposit)
{
format_string(player_name, "Fake Deposit", notify.fake_deposit.log, notify.fake_deposit.notify);
return true; return true;
}
break;
} }
break; break;
case eRemoteEvent::ForceMission: case eRemoteEvent::ForceMission:
@ -99,9 +106,15 @@ namespace big
} }
break; break;
case eRemoteEvent::MCTeleport: case eRemoteEvent::MCTeleport:
if (g->protections.script_events.mc_teleport) if (g->protections.script_events.mc_teleport && args[3] <= 32)
{ {
format_string(player_name, "MC Teleport", notify.mc_teleport.log, notify.mc_teleport.notify); format_string(player_name, "Remote Teleport", notify.mc_teleport.log, notify.mc_teleport.notify);
return true;
}
else if (g->protections.script_events.crash && args[3] > 32)
{
format_string(player_name, "TSE Crash", notify.crash.log, notify.crash.notify);
return true; return true;
} }
@ -130,17 +143,10 @@ namespace big
return true; return true;
} }
break; break;
case eRemoteEvent::RotateCam: case eRemoteEvent::TSECommand:
if (g->protections.script_events.crash && args[2] == 537560473) { if (g->protections.script_events.rotate_cam && static_cast<eRemoteEvent>(args[2]) == eRemoteEvent::TSECommandRotateCam)
format_string(player_name, "Crash - Rotate Cam", notify.crash.log, notify.crash.notify);
return true;
}
if (g->protections.script_events.rotate_cam)
{ {
if (CNetworkPlayerMgr* player_mgr = gta_util::get_network_player_mgr(); player_mgr != nullptr) format_string(player_name, "Rotate Cam", notify.rotate_cam.log, notify.rotate_cam.notify);
if (args[2] == player_mgr->m_local_net_player->m_player_id)
format_string(player_name, "Rotate Cam", notify.rotate_cam.log, notify.rotate_cam.notify);
return true; return true;
} }
@ -254,6 +260,58 @@ namespace big
return true; return true;
} }
break;
case eRemoteEvent::TeleportToWarehouse:
if (g->protections.script_events.teleport_to_warehouse)
{
format_string(player_name, "Teleport To Warehouse", notify.teleport_to_warehouse.log, notify.teleport_to_warehouse.notify);
return true;
}
break;
case eRemoteEvent::StartActivity:
eActivityType activity = static_cast<eActivityType>(args[2]);
if (g->protections.script_events.start_activity)
{
if (activity == eActivityType::Survival || activity == eActivityType::Mission || activity == eActivityType::Deathmatch || activity == eActivityType::BaseJump || activity == eActivityType::Race)
{
format_string(player_name, "Softlock Game", notify.start_activity.log, notify.start_activity.notify);
return true;
}
else if (activity == eActivityType::Darts)
{
format_string(player_name, "Send To Darts", notify.start_activity.log, notify.start_activity.notify);
return true;
}
else if (activity == eActivityType::PilotSchool)
{
format_string(player_name, "Send To Flight School", notify.start_activity.log, notify.start_activity.notify);
return true;
}
else if (activity == eActivityType::ImpromptuDeathmatch)
{
format_string(player_name, "Start Impromptu Deathmatch", notify.start_activity.log, notify.start_activity.notify);
return true;
}
else if (activity == eActivityType::DefendSpecialCargo || activity == eActivityType::GunrunningDefend || activity == eActivityType::BikerDefend)
{
format_string(player_name, "Trigger Business Raid", notify.start_activity.log, notify.start_activity.notify);
return true;
}
// there are MANY more
}
else if (g->protections.script_events.crash && activity == eActivityType::Tennis)
{
format_string(player_name, "TSE Crash (Start Tennis)", notify.crash.log, notify.crash.notify);
return true;
}
break;
} }

View File

@ -38,6 +38,9 @@ namespace big
bool never_wanted = false; bool never_wanted = false;
std::chrono::system_clock::time_point m_last_transition_msg_sent{};
int m_num_failed_transition_attempts = 0;
protected: protected:
bool equals(const CNetGamePlayer* net_game_player) const; bool equals(const CNetGamePlayer* net_game_player) const;

View File

@ -92,6 +92,13 @@ namespace big
draw_pair_option("Wanted Level", script_event_handler.clear_wanted_level); draw_pair_option("Wanted Level", script_event_handler.clear_wanted_level);
ImGui::EndGroup(); ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
draw_pair_option("Teleport To Warehouse", script_event_handler.teleport_to_warehouse);
draw_pair_option("Start Activity", script_event_handler.start_activity);
ImGui::EndGroup();
components::sub_title("Other"); components::sub_title("Other");
draw_pair_option("Reports", g->notifications.reports); draw_pair_option("Reports", g->notifications.reports);

View File

@ -37,6 +37,13 @@ namespace big
ImGui::Checkbox("Vehicle Kick", &g->protections.script_events.vehicle_kick); ImGui::Checkbox("Vehicle Kick", &g->protections.script_events.vehicle_kick);
ImGui::Checkbox("Wanted Level", &g->protections.script_events.clear_wanted_level); ImGui::Checkbox("Wanted Level", &g->protections.script_events.clear_wanted_level);
ImGui::EndGroup(); ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Teleport To Warehouse", &g->protections.script_events.teleport_to_warehouse);
ImGui::Checkbox("Start Activity", &g->protections.script_events.start_activity);
ImGui::EndGroup();
} }
} }