From 5909af7fd2f3cdf3c8816cef3df4d1cd5019f13d Mon Sep 17 00:00:00 2001 From: Yimura <24669514+Yimura@users.noreply.github.com> Date: Fri, 30 Dec 2022 11:48:59 +0100 Subject: [PATCH] feat(Protections): Reenabled CanApplyData (#740) * fix(CanApplyData): correct crash_blocked msg --- src/gta/joaat.hpp | 18 ++++ src/hooking.cpp | 2 +- src/hooks/protections/can_apply_data.cpp | 122 +++++++++++++++++++++-- 3 files changed, 130 insertions(+), 12 deletions(-) diff --git a/src/gta/joaat.hpp b/src/gta/joaat.hpp index 7444599d..1a0b8a76 100644 --- a/src/gta/joaat.hpp +++ b/src/gta/joaat.hpp @@ -28,5 +28,23 @@ namespace rage static_assert(consteval_joaat("test") == 0x3f75ccc1); } +inline consteval rage::joaat_t operator""_j(const char* s, std::size_t n) +{ + rage::joaat_t result = 0; + + for (std::size_t i = 0; i < n; i++) + { + result += rage::joaat_to_lower(s[i]); + result += (result << 10); + result ^= (result >> 6); + } + + result += (result << 3); + result ^= (result >> 11); + result += (result << 15); + + return result; +} + #define RAGE_JOAAT_IMPL(str) (::rage::consteval_joaat(str)) #define RAGE_JOAAT(str) (std::integral_constant::value) \ No newline at end of file diff --git a/src/hooking.cpp b/src/hooking.cpp index 1973278d..e77e660c 100644 --- a/src/hooking.cpp +++ b/src/hooking.cpp @@ -56,7 +56,7 @@ namespace big detour_hook_helper::add("RCC", g_pointers->m_received_clone_create); detour_hook_helper::add("RCS", g_pointers->m_received_clone_sync); - // detour_hook_helper::add("CAD", g_pointers->m_can_apply_data); + detour_hook_helper::add("CAD", g_pointers->m_can_apply_data); detour_hook_helper::add("GNED", g_pointers->m_get_network_event_data); detour_hook_helper::add("WPGDN", g_pointers->m_write_player_gamer_data_node); diff --git a/src/hooks/protections/can_apply_data.cpp b/src/hooks/protections/can_apply_data.cpp index c033669d..88b8be67 100644 --- a/src/hooks/protections/can_apply_data.cpp +++ b/src/hooks/protections/can_apply_data.cpp @@ -23,10 +23,95 @@ #include "util/model_info.hpp" #include "network/CNetGamePlayer.hpp" #include "util/notify.hpp" +// TODO: remove as it's unused #define CLASS_TO_MANGLED_NAME(c) "?AV"#c"@@" namespace big { + constexpr auto nodes = std::to_array>({ + {RAGE_JOAAT("CAutomobileCreationDataNode"), 0x1b088e0}, + {RAGE_JOAAT("CBikeGameStateDataNode"), 0x1b08a40}, + {RAGE_JOAAT("CBoatGameStateDataNode"), 0x1b08a80}, + {RAGE_JOAAT("CDoorCreationDataNode"), 0x1b08be0}, + {RAGE_JOAAT("CDoorMovementDataNode"), 0x1b09000}, + {RAGE_JOAAT("CDoorScriptGameStateDataNode"), 0x1b08ea0}, + {RAGE_JOAAT("CDoorScriptInfoDataNode"), 0x1b08d40}, + {RAGE_JOAAT("CDynamicEntityGameStateDataNode"), 0x1b06450}, + {RAGE_JOAAT("CEntityOrientationDataNode"), 0x1b05df0}, + {RAGE_JOAAT("CEntityScriptGameStateDataNode"), 0x1b05c90}, + {RAGE_JOAAT("CEntityScriptInfoDataNode"), 0x1b05b30}, + {RAGE_JOAAT("CGlobalFlagsDataNode"), 0x1b057f0}, + {RAGE_JOAAT("CHeliControlDataNode"), 0x1b08180}, + {RAGE_JOAAT("CHeliHealthDataNode"), 0x1b06f60}, + {RAGE_JOAAT("CMigrationDataNode"), 0x1b05af0}, + {RAGE_JOAAT("CObjectCreationDataNode"), 0x1b096e0}, + {RAGE_JOAAT("CObjectGameStateDataNode"), 0x1b09840}, + {RAGE_JOAAT("CObjectOrientationNode"), 0x1b09c60}, + {RAGE_JOAAT("CObjectScriptGameStateDataNode"), 0x1b099a0}, + {RAGE_JOAAT("CObjectSectorPosNode"), 0x1b09b00}, + {RAGE_JOAAT("CPedAIDataNode"), 0x1b0ae80}, + {RAGE_JOAAT("CPedAppearanceDataNode"), 0x1b0ad20}, + {RAGE_JOAAT("CPedAttachDataNode"), 0x1b0a900}, + {RAGE_JOAAT("CPedComponentReservationDataNode"), 0x1b0a380}, + {RAGE_JOAAT("CPedCreationDataNode"), 0x1b09ca0}, + {RAGE_JOAAT("CPedGameStateDataNode"), 0x1b09f60}, + {RAGE_JOAAT("CPedHealthDataNode"), 0x1b0a7a0}, + {RAGE_JOAAT("CPedInventoryDataNode"), 0x1b0b2a0}, + {RAGE_JOAAT("CPedMovementDataNode"), 0x1b0abc0}, + {RAGE_JOAAT("CPedMovementGroupDataNode"), 0x1b0aa60}, + {RAGE_JOAAT("CPedOrientationDataNode"), 0x1b0a640}, + {RAGE_JOAAT("CPedScriptCreationDataNode"), 0x1b09e00}, + {RAGE_JOAAT("CPedScriptGameStateDataNode"), 0x1b0a4e0}, + {RAGE_JOAAT("CPedSectorPosMapNode"), 0x1b05ab0}, + {RAGE_JOAAT("CPedSectorPosNavMeshNode"), 0x1b0a220}, + {RAGE_JOAAT("CPedTaskSequenceDataNode"), 0x1b0b400}, + {RAGE_JOAAT("CPedTaskSpecificDataNode"), 0x1b0b140}, + {RAGE_JOAAT("CPedTaskTreeDataNode"), 0x1b0afe0}, + {RAGE_JOAAT("CPhysicalAngVelocityDataNode"), 0x1b06f20}, + {RAGE_JOAAT("CPhysicalAttachDataNode"), 0x1b06fa0}, + {RAGE_JOAAT("CPhysicalGameStateDataNode"), 0x1b06b00}, + {RAGE_JOAAT("CPhysicalHealthDataNode"), 0x1b06f60}, + {RAGE_JOAAT("CPhysicalMigrationDataNode"), 0x1b07100}, + {RAGE_JOAAT("CPhysicalScriptGameStateDataNode"), 0x1b06c60}, + {RAGE_JOAAT("CPhysicalScriptMigrationDataNode"), 0x1b07140}, + {RAGE_JOAAT("CPhysicalVelocityDataNode"), 0x1b06dc0}, + {RAGE_JOAAT("CPickupCreationDataNode"), 0x1b0b560}, + {RAGE_JOAAT("CPickupPlacementCreationDataNode"), 0x1b0b860}, + {RAGE_JOAAT("CPickupPlacementStateDataNode"), 0x1b0b9c0}, + {RAGE_JOAAT("CPickupScriptGameStateNode"), 0x1b0b820}, + {RAGE_JOAAT("CPickupSectorPosNode"), 0x1b0b6c0}, + {RAGE_JOAAT("CPlaneControlDataNode"), 0x1b08180}, + {RAGE_JOAAT("CPlaneGameStateDataNode"), 0x1b0c380}, + {RAGE_JOAAT("CPlayerAmbientModelStreamingNode"), 0x1b0c040}, + {RAGE_JOAAT("CPlayerAppearanceDataNode"), 0x1b0bc20}, + {RAGE_JOAAT("CPlayerCameraDataNode"), 0x1b0bba0}, + {RAGE_JOAAT("CPlayerCreationDataNode"), 0x1b0ba00}, + {RAGE_JOAAT("CPlayerExtendedGameStateNode"), 0x1b0c300}, + {RAGE_JOAAT("CPlayerGameStateDataNode"), 0x1b0bbe0}, + {RAGE_JOAAT("CPlayerGamerDataNode"), 0x1b0c1a0}, + {RAGE_JOAAT("CPlayerPedGroupDataNode"), 0x1b0bd80}, + {RAGE_JOAAT("CPlayerSectorPosNode"), 0x1b0bb60}, + {RAGE_JOAAT("CPlayerWantedAndLOSDataNode"), 0x1b0bee0}, + {RAGE_JOAAT("CSectorDataNode"), 0x1b05950}, + {RAGE_JOAAT("CSectorPositionDataNode"), 0x1b05ab0}, + {RAGE_JOAAT("CSubmarineControlDataNode"), 0x1b08180}, + {RAGE_JOAAT("CSubmarineGameStateDataNode"), 0x1b092c0}, + {RAGE_JOAAT("CTrainGameStateDataNode"), 0x1b0c340}, + {RAGE_JOAAT("CVehicleAngVelocityDataNode"), 0x1b06f20}, + {RAGE_JOAAT("CVehicleAppearanceDataNode"), 0x1b082e0}, + {RAGE_JOAAT("CVehicleComponentReservationDataNode"), 0x1b085e0}, + {RAGE_JOAAT("CVehicleControlDataNode"), 0x1b08180}, + {RAGE_JOAAT("CVehicleCreationDataNode"), 0x1b07940}, + {RAGE_JOAAT("CVehicleDamageStatusDataNode"), 0x1b08440}, + {RAGE_JOAAT("CVehicleGadgetDataNode"), 0x1b08780}, + {RAGE_JOAAT("CVehicleGameStateDataNode"), 0x1b07c00}, + {RAGE_JOAAT("CVehicleHealthDataNode"), 0x1b07ec0}, + {RAGE_JOAAT("CVehicleProximityMigrationDataNode"), 0x1b08740}, + {RAGE_JOAAT("CVehicleScriptGameStateDataNode"), 0x1b07d60}, + {RAGE_JOAAT("CVehicleSteeringDataNode"), 0x1b08020}, + {RAGE_JOAAT("CVehicleTaskDataNode"), 0x1b085a0}}); + + // TODO: remove as it's unused constexpr uint64_t operator ""_fnv1a(char const* str, std::size_t len) { auto const fnv_offset_basis = 14695981039346656037ULL; @@ -95,9 +180,24 @@ namespace big } else if (node->IsDataNode()) { - switch (typeid(*node).hash_code()) + auto offset_to_address = [](uint64_t off) { - case "?AVCDoorCreationDataNode@@"_fnv1a: + static auto base_addr = reinterpret_cast(GetModuleHandle(nullptr)); + return base_addr + off; + }; + + auto vtable = *(void**)node; + Hash node_hash; + for (const auto& n : nodes) + { + if ((void*)offset_to_address(n.second) == vtable) + { + node_hash = n.first; + } + } + switch (node_hash) + { + case "CDoorCreationDataNode"_j: { const auto creation_node = dynamic_cast(node); if (is_crash_object(creation_node->m_model)) @@ -107,17 +207,17 @@ namespace big } break; } - case "?AVCPickupCreationDataNode@@"_fnv1a: + case "CPickupCreationDataNode"_j: { const auto creation_node = dynamic_cast(node); if (is_crash_object(creation_node->m_custom_model)) { - notify::crash_blocked(sender, "invalid door model"); + notify::crash_blocked(sender, "invalid pickup model"); return true; } break; } - case "?AVCPhysicalAttachDataNode@@"_fnv1a: + case "CPhysicalAttachDataNode"_j: { const auto attach_node = dynamic_cast(node); @@ -130,7 +230,7 @@ namespace big } break; } - case "?AVCPedCreationDataNode@@"_fnv1a: + case "CPedCreationDataNode"_j: { const auto creation_node = dynamic_cast(node); if (is_crash_ped(creation_node->m_model)) @@ -145,7 +245,7 @@ namespace big } break; } - case "?AVCPedAttachDataNode@@"_fnv1a: + case "CPedAttachDataNode"_j: { const auto attach_node = dynamic_cast(node); if (attach_node->m_attached && attach_node->m_attached_to == object->m_object_id) @@ -155,7 +255,7 @@ namespace big } break; } - case "?AVCVehicleCreationDataNode@@"_fnv1a: + case "CVehicleCreationDataNode"_j: { const auto vehicle_creation_node = dynamic_cast(node); if (is_crash_vehicle(vehicle_creation_node->m_model)) @@ -165,7 +265,7 @@ namespace big } break; } - case "?AVCObjectCreationDataNode@@"_fnv1a: + case "CObjectCreationDataNode"_j: { const auto creation_node = dynamic_cast(node); if (is_crash_object(creation_node->m_model)) @@ -175,7 +275,7 @@ namespace big } break; } - case "?AVCPlayerAppearanceDataNode@@"_fnv1a: + case "CPlayerAppearanceDataNode"_j: { const auto player_appearance_node = dynamic_cast(node); if (is_crash_ped(player_appearance_node->m_model_hash)) @@ -185,7 +285,7 @@ namespace big } break; } - case "?AVCSectorDataNode@@"_fnv1a: + case "CSectorDataNode"_j: { const auto sector_node = dynamic_cast(node); if (sector_node->m_pos_x == 712 || sector_node->m_pos_y == 712 || sector_node->m_pos_z == 712)