#include "Pointers.hpp" #include "core/backend/PatternCache.hpp" #include "core/memory/ModuleMgr.hpp" #include "core/memory/PatternScanner.hpp" #include "core/util/Joaat.hpp" #include "types/network/rlSessionInfo.hpp" #include "types/rage/atArray.hpp" namespace YimMenu { // on some cracked game builds static bool IsSocialClubNeverGoingToLoad() { return Pointers.ScriptThreads && Pointers.ScriptThreads->size() != 0; } bool Pointers::Init() { PatternCache::Init(); const auto gta5 = ModuleMgr.Get("GTA5_Enhanced.exe"_J); if (!gta5) { LOG(FATAL) << "Could not find GTA5_Enhanced.exe, is this GTA 5 Enhanced?"; return false; } auto scanner = PatternScanner(gta5); constexpr auto screenResPtrn = Pattern<"75 39 0F 57 C0 F3 0F 2A 05">("ScreenRes"); scanner.Add(screenResPtrn, [this](PointerCalculator ptr) { ScreenResX = ptr.Add(0x5).Add(4).Rip().As(); ScreenResY = ptr.Add(0x1E).Add(4).Rip().As(); }); constexpr auto versionPtrn = Pattern<"4C 8D 0D ? ? ? ? 48 8D 5C 24 ? 48 89 D9 48 89 FA">("Version"); scanner.Add(versionPtrn, [this](PointerCalculator ptr) { GameVersion = ptr.Add(3).Rip().As(); OnlineVersion = ptr.Add(0x47).Add(3).Rip().As(); }); constexpr auto scriptThreadsPtrn = Pattern<"48 8B 05 ? ? ? ? 48 89 34 F8 48 FF C7 48 39 FB 75 97">("ScriptThreads"); scanner.Add(scriptThreadsPtrn, [this](PointerCalculator ptr) { ScriptThreads = ptr.Add(3).Rip().As*>(); }); constexpr auto populateNativesPtrn = Pattern<"EB 2A 0F 1F 40 00 48 8B 54 17 10">("InitNativeTables"); scanner.Add(populateNativesPtrn, [this](PointerCalculator ptr) { InitNativeTables = ptr.Sub(0x2A).As(); }); constexpr auto runScriptThreadsPtrn = Pattern<"BE 40 5D C6 00">("RunScriptThreads"); scanner.Add(runScriptThreadsPtrn, [this](PointerCalculator ptr) { RunScriptThreads = ptr.Sub(0xA).As(); }); constexpr auto handlesAndPtrsPtrn = Pattern<"0F 1F 84 00 00 00 00 00 89 F8 0F 28 FE 41">("HandlesAndPtrs"); scanner.Add(handlesAndPtrsPtrn, [this](PointerCalculator ptr) { HandleToPtr = ptr.Add(0x21).Add(1).Rip().As(); PtrToHandle = ptr.Sub(0xB).Add(1).Rip().As(); }); constexpr auto pedFactoryPtrn = Pattern<"C7 40 30 03 00 00 00 48 8B 0D">("PedFactory"); scanner.Add(pedFactoryPtrn, [this](PointerCalculator ptr) { PedFactory = ptr.Add(7).Add(3).Rip().As(); }); constexpr auto getNetPlayerFromPidPtrn = Pattern<"83 FB 20 74 2A 89 D9">("GetNetPlayerFromPID"); scanner.Add(getNetPlayerFromPidPtrn, [this](PointerCalculator ptr) { GetNetPlayerFromPid = ptr.Add(8).Rip().As(); }); constexpr auto isSessionStarted = Pattern<"0F B6 05 ? ? ? ? 0A 05 ? ? ? ? 75 2A">("IsSessionStarted"); scanner.Add(isSessionStarted, [this](PointerCalculator addr) { IsSessionStarted = addr.Add(3).Rip().As(); }); constexpr auto assignPhysicalIndexPtrn = Pattern<"41 8D 47 01 3C 20 0F 87 68 01 00 00">("AssignPhysicalIndex"); scanner.Add(assignPhysicalIndexPtrn, [this](PointerCalculator ptr) { AssignPhysicalIndex = ptr.Sub(0x13).As(); }); constexpr auto networkPlayerManagerShutdownPtrn = Pattern<"84 C0 0F 84 88 00 00 00 4C 89 F9 E8">("NetworkPlayerMgrShutdown"); scanner.Add(networkPlayerManagerShutdownPtrn, [this](PointerCalculator ptr) { NetworkPlayerMgrShutdown = ptr.Sub(0x1B).As(); }); constexpr auto scriptGlobalsPtrn = Pattern<"48 8B 8E B8 00 00 00 48 8D 15 ? ? ? ? 49 89 D8">("ScriptGlobals"); scanner.Add(scriptGlobalsPtrn, [this](PointerCalculator ptr) { ScriptGlobals = ptr.Add(7).Add(3).Rip().As(); }); constexpr auto triggerWeaponDamageEventPtrn = Pattern<"E8 ? ? ? ? 66 90 FF C5">("TriggerWeaponDamageEvent"); scanner.Add(triggerWeaponDamageEventPtrn, [this](PointerCalculator ptr) { TriggerWeaponDamageEvent = ptr.Add(1).Rip().As(); }); constexpr auto scriptProgramsPtrn = Pattern<"48 C7 84 C8 D8 00 00 00 00 00 00 00">("ScriptPrograms"); scanner.Add(scriptProgramsPtrn, [this](PointerCalculator ptr) { ScriptPrograms = ptr.Add(0x13).Add(3).Rip().Add(0xD8).As(); }); constexpr auto regionCodePtrn = Pattern<"4C 8D 05 ? ? ? ? 48 89 F1 48 89 FA E8 ? ? ? ? 84 C0 74 3D">("RegionCode"); scanner.Add(regionCodePtrn, [this](PointerCalculator ptr) { RegionCode = ptr.Add(3).Rip().As(); }); constexpr auto networkObjectMgrPtrn = Pattern<"41 83 7E FA 02 40 0F 9C C5 C1 E5 02">("NetworkObjectMgr&GetSyncTreeForType"); scanner.Add(networkObjectMgrPtrn, [this](PointerCalculator ptr) { NetworkObjectMgr = ptr.Add(0xC).Add(3).Rip().As(); GetSyncTreeForType = ptr.Add(0x13).Add(1).Rip().As(); }); constexpr auto writeNodeDataPtrn = Pattern<"48 8B 89 A8 00 00 00 48 8B 01 48 8B 40 10 48 FF E0">("WriteNodeData"); scanner.Add(writeNodeDataPtrn, [this](PointerCalculator ptr) { WriteNodeData = ptr.As(); }); constexpr auto shouldUseNodeCachePtrn = Pattern<"83 FA 20 74 1D 48 89 CE">("ShouldUseNodeCache&Nullsub"); scanner.Add(shouldUseNodeCachePtrn, [this](PointerCalculator ptr) { ShouldUseNodeCache = ptr.Sub(5).As(); Nullsub = ptr.Add(0x29).As(); }); constexpr auto isNodeInScopePtrn = Pattern<"41 83 F9 02 74 22 48 8B 06">("IsNodeInScope"); scanner.Add(isNodeInScopePtrn, [this](PointerCalculator ptr) { IsNodeInScope = ptr.Sub(0x26).As(); }); constexpr auto writeSyncTreePtrn = Pattern<"4D 89 CD 45 89 C6 41 89 D7 48 89 CF 8B 05 ? ? ? ? 65 48 8B 0C 25 58 00 00 00">("WriteSyncTree"); scanner.Add(writeSyncTreePtrn, [this](PointerCalculator ptr) { WriteSyncTree = ptr.Sub(0x10).As(); }); constexpr auto migrateObjectPtrn = Pattern<"48 8B 96 D0 00 00 00 4C 89 F9 41 B8 03 00 00 00">("MigrateObject"); scanner.Add(migrateObjectPtrn, [this](PointerCalculator ptr) { MigrateObject = ptr.Add(0x10).Add(1).Rip().As(); }); constexpr auto networkPlayerMgrPtrn = Pattern<"75 0E 48 8B 05 ? ? ? ? 48 8B 88 F0 00 00 00">("NetworkPlayerMgr"); scanner.Add(networkPlayerMgrPtrn, [this](PointerCalculator ptr) { NetworkPlayerMgr = ptr.Add(2).Add(3).Rip().As(); }); constexpr auto queuePacketPtrn = Pattern<"45 89 F1 E8 ? ? ? ? 84 C0 74 25">("QueuePacket"); scanner.Add(queuePacketPtrn, [this](PointerCalculator ptr) { QueuePacket = ptr.Add(3).Add(1).Rip().As(); }); constexpr auto getNetObjectByIdPtrn = Pattern<"0F B7 4E 60 E8">("GetNetObjectById"); scanner.Add(getNetObjectByIdPtrn, [this](PointerCalculator ptr) { GetNetObjectById = ptr.Add(4).Add(1).Rip().As(); }); constexpr auto requestControlPtrn = Pattern<"74 0A 48 89 F9 E8 ? ? ? ? 31 F6 89 F0 48 83 C4 20">("RequestControl"); scanner.Add(requestControlPtrn, [this](PointerCalculator ptr) { RequestControl = ptr.Add(5).Add(1).Rip().As(); }); constexpr auto spectatePatchPtrn = Pattern<"74 ? 66 83 FF 0D">("SpectatePatch"); scanner.Add(spectatePatchPtrn, [this](PointerCalculator ptr) { SpectatePatch = BytePatches::Add(ptr.As(), 0xEB); }); constexpr auto modelSpawnBypassPtrn = Pattern<"E8 ? ? ? ? 48 8B 78 48">("ModelSpawnBypass"); scanner.Add(modelSpawnBypassPtrn, [this](PointerCalculator ptr) { ModelSpawnBypass = BytePatches::Add(ptr.Add(1).Rip().Add(0x2B).As(), 0xEB); }); constexpr auto worldModelSpawnBypassPtrn = Pattern<"4C 8B 2C 01 4D 85 ED 0F 84 ? ? ? ?">("WorldModelSpawnBypass"); scanner.Add(worldModelSpawnBypassPtrn, [this](PointerCalculator ptr) { WorldModelSpawnBypass = BytePatches::Add(ptr.Add(4).As(), std::to_array({0xEB, 0x12, 0x90})); }); constexpr auto receiveNetMessagePtrn = Pattern<"48 81 C1 00 03 00 00 4C 89 E2">("ReceiveNetMessage"); scanner.Add(receiveNetMessagePtrn, [this](PointerCalculator ptr) { ReceiveNetMessage = ptr.Add(0xD).Add(1).Rip().As(); }); constexpr auto netEventMgrPtrn = Pattern<"4C 8B 05 ? ? ? ? 44 0F B7 CA">("NetEventMgr"); scanner.Add(netEventMgrPtrn, [this](PointerCalculator ptr) { NetEventMgr = ptr.Add(3).Rip().As(); }); constexpr auto sendEventAckPtrn = Pattern<"E8 ? ? ? ? 84 C0 75 ? 44 89 F5">("SendEventAck"); scanner.Add(sendEventAckPtrn, [this](PointerCalculator ptr) { EventAck = ptr.Add(1).Rip().As(); SendEventAck = ptr.Add(0x1A).Add(1).Rip().As(); }); constexpr auto queueDependencyPtrn = Pattern<"0F 29 46 50 48 8D 05">("QueueDependency&SigScanMemory"); scanner.Add(queueDependencyPtrn, [this](PointerCalculator ptr) { QueueDependency = ptr.Add(0x71).Add(1).Rip().As(); SigScanMemory = ptr.Add(4).Add(3).Rip().As(); }); constexpr auto scriptVMPtrn = Pattern<"49 63 41 1C">("ScriptVM"); scanner.Add(scriptVMPtrn, [this](PointerCalculator ptr) { ScriptVM = ptr.Sub(0x24).As(); }); constexpr auto prepareMetricForSendingPtrn = Pattern<"41 56 56 57 55 53 48 83 EC ? 4C 89 CB 4C 89 C6">("PrepareMetricForSending"); scanner.Add(prepareMetricForSendingPtrn, [this](PointerCalculator ptr) { PrepareMetricForSending = ptr.As(); }); constexpr auto beDataPtrn = Pattern<"48 C7 05 ? ? ? ? 00 00 00 00 E8 ? ? ? ? 48 89 C1 E8 ? ? ? ? E8 ? ? ? ? BD 0A 00 00 00">("BEData"); scanner.Add(beDataPtrn, [this](PointerCalculator ptr) { BERestartStatus = ptr.Add(3).Rip().Add(8).Add(4).As(); NeedsBERestart = ptr.Add(3).Rip().Add(8).Add(4).Add(8).As(); IsBEBanned = ptr.Add(3).Rip().Add(8).Add(4).Add(8).Add(4).As(); }); constexpr auto battlEyeStatusUpdatePatchPtrn = Pattern<"C6 05 ? ? ? ? 00 84 C0 0F 84 ? ? ? ? E9">("BattlEyeStatusUpdatePatch"); scanner.Add(battlEyeStatusUpdatePatchPtrn, [this](PointerCalculator ptr) { BattlEyeStatusUpdatePatch = BytePatches::Add(ptr.Add(11).Rip().Add(1).Rip().As(), std::to_array({0xC3})); }); constexpr auto writeNetArrayDataPtrn = Pattern<"0F 84 06 03 00 00 0F B6 83">("WriteNetArrayData"); scanner.Add(writeNetArrayDataPtrn, [this](PointerCalculator ptr) { WriteNetArrayData = ptr.Sub(0x4E).As(); NetArrayMgr = ptr.Sub(0x32).Add(3).As(); }); constexpr auto netArrayCachedDataPatchPtrn = Pattern<"0F 84 64 FE FF FF FF">("NetArrayCachedDataPatch"); scanner.Add(netArrayCachedDataPatchPtrn, [this](PointerCalculator ptr) { NetArrayCachedDataPatch = BytePatches::Add(ptr.As(), std::to_array({0xE9, 0x65, 0xFE, 0xFF, 0xFF, 0x90})); }); constexpr auto statsMgrPtrn = Pattern<"89 6C 24 28 48 8D 0D ? ? ? ? 48 8D">("CStatsMgr"); scanner.Add(statsMgrPtrn, [this](PointerCalculator ptr) { StatsMgr = ptr.Add(4).Add(3).Rip().As(); }); constexpr auto getPackedStatDataPtrn = Pattern<"8D 81 37 FE FF FF">("GetPackedStatData"); scanner.Add(getPackedStatDataPtrn, [this](PointerCalculator ptr) { GetPackedStatData = ptr.Sub(0xE).As(); }); constexpr auto getCatalogItemPtrn = Pattern<"0F 82 55 FF FF FF 44 89 7C 24 30">("NetCatalog&GetCatalogItem"); scanner.Add(getCatalogItemPtrn, [this](PointerCalculator ptr) { NetCatalog = ptr.Add(0xB).Add(3).Rip().As(); GetCatalogItem = ptr.Add(0x17).Add(1).Rip().As(); }); constexpr auto transactionMgrPtrn = Pattern<"48 8B 05 ? ? ? ? 80 78 39 00 74 2D">("TransactionMgr"); scanner.Add(transactionMgrPtrn, [this](PointerCalculator ptr) { TransactionMgr = ptr.Add(3).Rip().As(); }); constexpr auto getActiveBasketPtrn = Pattern<"48 8B 40 10 81 7B 0C AE A0 A9 04">("GetActiveBasket"); scanner.Add(getActiveBasketPtrn, [this](PointerCalculator ptr) { GetActiveBasket = ptr.Sub(0x39).As(); }); constexpr auto pedPoolPtrn = Pattern<"80 79 4B 00 0F 84 F5 00 00 00 48 89 F1">("PedPool"); scanner.Add(pedPoolPtrn, [this](PointerCalculator ptr) { PedPool = ptr.Add(0x18).Add(3).Rip().As(); }); constexpr auto vehiclePoolPtrn = Pattern<"48 83 78 18 0D">("VehiclePool"); scanner.Add(vehiclePoolPtrn, [this](PointerCalculator ptr) { VehiclePool = ptr.Sub(0xA).Add(3).Rip().As(); }); constexpr auto objectPoolPtrn = Pattern<"48 8B 04 0A C3 0F B6 05">("ObjectPool"); scanner.Add(objectPoolPtrn, [this](PointerCalculator ptr) { ObjectPool = ptr.Add(5).Add(3).Rip().As(); }); constexpr auto httpStartRequestPtrn = Pattern<"56 57 48 83 EC 28 48 89 CE 8B 81 ? ? ? ? FF C8 83 F8 04 0F 87">("HttpStartRequest"); scanner.Add(httpStartRequestPtrn, [this](PointerCalculator ptr) { HttpStartRequest = ptr.As(); }); constexpr auto networkSessionPtrn = Pattern<"49 C7 86 F8 00 00 00 00 00 00 00 48 8B 05">("NetworkSession"); scanner.Add(networkSessionPtrn, [this](PointerCalculator ptr) { NetworkSession = ptr.Add(0x17).Add(3).Rip().As(); }); constexpr auto joinSessionByInfoPtrn = Pattern<"E8 ? ? ? ? 0F 10 87 ? ? ? ? 0F 11 86 ? ? ? ? 88 86 ? ? ? ? 84 C0">("JoinSessionByInfo"); scanner.Add(joinSessionByInfoPtrn, [this](PointerCalculator ptr) { JoinSessionByInfo = ptr.Add(1).Rip().As(); }); constexpr auto getSessionByGamerHandle = Pattern<"48 C7 84 24 80 00 00 00 10 00 00 08">("GetSessionByGamerHandle"); scanner.Add(getSessionByGamerHandle, [this](PointerCalculator ptr) { GetSessionByGamerHandle = ptr.Sub(0x4A).Add(1).Rip().As(); }); constexpr auto networkTimePtrn = Pattern<"89 05 ? ? ? ? 80 3D ? ? ? ? ? 0F 84 ? ? ? ? E9">("NetworkTime"); scanner.Add(networkTimePtrn, [this](PointerCalculator ptr) { NetworkTime = ptr.Add(2).Rip().As(); }); constexpr auto gameTimerPtrn = Pattern<"3B 2D ? ? ? ? 76 ? 89 D9">("GameTimer"); scanner.Add(gameTimerPtrn, [this](PointerCalculator ptr) { GameTimer = ptr.Add(2).Rip().As(); }); constexpr auto formatIntCaller1Ptrn = Pattern<"48 89 35 ? ? ? ? 48 8B 74 24">("FormatIntCaller1"); scanner.Add(formatIntCaller1Ptrn, [this](PointerCalculator ptr) { FormatIntCaller1 = ptr.Add(0x5D).As(); }); constexpr auto formatIntCaller2Ptrn = Pattern<"48 B8 20 73 69 7A 65 3D 27 32 48 89 84 24">("FormatIntCaller2"); scanner.Add(formatIntCaller2Ptrn, [this](PointerCalculator ptr) { FormatIntCaller2 = ptr.Sub(0x11).As(); }); constexpr auto shouldTargetEntityPatchPtrn = Pattern<"F6 80 A9 14 00 00 01">("ShouldNotTargetEntityPatch"); scanner.Add(shouldTargetEntityPatchPtrn, [this](PointerCalculator ptr) { ShouldNotTargetEntityPatch = BytePatches::Add(ptr.Sub(0x53).As(), std::to_array({0xB0, 0x00, 0xC3})); }); constexpr auto getAssistedAimTypePatchPtrn = Pattern<"FF E0 48 8D 86">("GetAssistedAimTypePatch"); scanner.Add(getAssistedAimTypePatchPtrn, [this](PointerCalculator ptr) { GetAssistedAimTypePatch = BytePatches::Add(ptr.Sub(0x15).As(), std::to_array({0xBD, 0x01, 0x00, 0x00, 0x00})); }); constexpr auto getLockOnPosPatchPtrn = Pattern<"0F 29 74 24 ? 48 89 D6 48 89 CF 48 8B 05">("GetLockOnPosPatch"); scanner.Add(getLockOnPosPatchPtrn, [this](PointerCalculator ptr) { GetLockOnPosPatch = BytePatches::Add(ptr.Add(0x22).As(), 0xEB); }); constexpr auto shouldAllowDriverLockOnPatchPtrn = Pattern<"75 ? 45 89 C7 49 89 CE">("ShouldAllowDriverLockOnPatch"); scanner.Add(shouldAllowDriverLockOnPatchPtrn, [this](PointerCalculator ptr) { ShouldAllowDriverLockOnPatch = BytePatches::Add(ptr.Sub(0x2C).As(), std::to_array({0xB0, 0x01, 0xC3})); }); constexpr auto allowPausingInSessionPatchPtrn = Pattern<"80 88 ? ? ? ? ? EB ? E8">("AllowPausingInSessionPatch"); scanner.Add(allowPausingInSessionPatchPtrn, [this](PointerCalculator ptr) { AllowPausingInSessionPatch = BytePatches::Add(ptr.Sub(0x1E).As(), 0xEB); }); constexpr auto getPoolTypePtrn = Pattern<"BA CE 94 A6 ED E8">("GetPoolType"); scanner.Add(getPoolTypePtrn, [this](PointerCalculator ptr) { GetPoolType = ptr.Sub(19).As(); }); constexpr auto setJoinRequestPoolTypePatchPtrn = Pattern<"89 86 ? ? ? ? E8 ? ? ? ? 89 C0">("SetJoinRequestPoolTypePatch"); scanner.Add(setJoinRequestPoolTypePatchPtrn, [this](PointerCalculator ptr) { // MOV EAX, 0; 0 is the normal pool SetJoinRequestPoolTypePatch = BytePatches::Add(ptr.Sub(5).As(), std::to_array({0xB8, 0x00, 0x00, 0x00, 0x00})); }); constexpr auto handleJoinRequestIgnorePoolPatchPtrn = Pattern<"41 83 FF 05 0F 84 ? ? ? ? 8B 84 F7">("HandleJoinRequestIgnorePoolPatch"); scanner.Add(handleJoinRequestIgnorePoolPatchPtrn, [this](PointerCalculator ptr) { HandleJoinRequestIgnorePoolPatch = BytePatches::Add(ptr.As(), std::to_array({0x39, 0xC9, 0x90, 0x90})); }); constexpr auto statsMpCharacterMappingDataPtrn = Pattern<"48 8D 0D ? ? ? ? 89 F2 0F 28 74 24 ? 48 83 C4 38">("CStatsMpCharacterMappingData"); scanner.Add(statsMpCharacterMappingDataPtrn, [this](PointerCalculator ptr) { StatsMpCharacterMappingData = ptr.Add(3).Rip().As(); }); static constexpr auto scMembershipStuffPtrn = Pattern<"48 8D 15 ? ? ? ? 41 B8 18 02 00 00 E8">("ScMembershipStuff"); scanner.Add(scMembershipStuffPtrn, [this](PointerCalculator addr) { HasGTAPlus = addr.Add(3).Rip().As(); }); constexpr auto battlEyeServerProcessPlayerJoinPtrn = Pattern<"48 89 10 48 89 48 10 89 F9">("BattlEyeServerProcessPlayerJoin"); scanner.Add(battlEyeServerProcessPlayerJoinPtrn, [this](PointerCalculator ptr) { BattlEyeServerProcessPlayerJoin = ptr.Sub(4).Rip().As()[1]; }); constexpr auto gameDataHashPtrn = Pattern<"48 8D 3D ? ? ? ? 69 C9">("GameDataHash"); scanner.Add(gameDataHashPtrn, [this](PointerCalculator ptr) { GameDataHash = ptr.Add(3).Rip().As(); }); constexpr auto getDLCHashPtrn = Pattern<"31 D2 E8 ? ? ? ? 3B 84">("GetDLCHash&DLCManager"); scanner.Add(getDLCHashPtrn, [this](PointerCalculator ptr) { DLCManager = ptr.Sub(4).Rip().As(); GetDLCHash = ptr.Add(3).Rip().As(); }); constexpr auto assistedAimShouldReleaseEntityPtrn = Pattern<"80 7F 28 04 75 6A">("AssistedAimShouldReleaseEntity"); scanner.Add(assistedAimShouldReleaseEntityPtrn, [this](PointerCalculator ptr) { AssistedAimShouldReleaseEntity = ptr.Sub(0xF).As(); }); constexpr auto assistedAimFindNewTargetPtrn = Pattern<"0F 84 C9 00 00 00 48 89 CE 48 89 F9">("AssistedAimFindNewTarget"); scanner.Add(assistedAimFindNewTargetPtrn, [this](PointerCalculator ptr) { AssistedAimFindNewTarget = ptr.Sub(0x33).As(); }); constexpr auto anticheatInitializedHashPtrn = Pattern<"89 9E C8 00 00 00 48 8B 0D ? ? ? ? 48 85 C9 74 46">("AnticheatInitializedHash&GetAnticheatInitializedHash"); scanner.Add(anticheatInitializedHashPtrn, [this](PointerCalculator ptr) { AnticheatInitializedHash = ptr.Add(9).Rip().As(); GetAnticheatInitializedHash = ptr.Add(0x13).Rip().As(); }); constexpr auto anticheatContextPtrn = Pattern<"48 8D BB 70 0A 00 00 4C 8D 35 ? ? ? ? 66 90">("AnticheatContext"); scanner.Add(anticheatContextPtrn, [this](PointerCalculator ptr) { AnticheatContext = ptr.Sub(0x12).Add(3).Rip().As(); }); constexpr auto getAnticheatInitializedHash2Ptrn = Pattern<"89 9E E8 00 00 00 89 C2 E8 ? ? ? ? 69">("GetAnticheatInitializedHash2"); scanner.Add(getAnticheatInitializedHash2Ptrn, [this](PointerCalculator ptr) { GetAnticheatInitializedHash2 = ptr.Add(0x9).Rip().As(); }); constexpr auto abilityBarPatchPtrn = Pattern<"75 39 48 85 F6 74 1A 48 89 F1 E8">("AbilityBarPatch"); scanner.Add(abilityBarPatchPtrn, [this](PointerCalculator ptr) { AbilityBarPatch = BytePatches::Add(ptr.As(), 0x9090); }); static constexpr auto doMatchmakingAdvertisePtrn = Pattern<"C7 47 30 01 00 00 00 E9 92">("MatchmakingAdvertise"); scanner.Add(doMatchmakingAdvertisePtrn, [this](PointerCalculator addr) { MatchmakingAdvertise = addr.Sub(0xC).Rip().As(); }); static constexpr auto doMatchmakingUpdatePtrn = Pattern<"C7 47 30 02 00 00 00 EB 7A">("MatchmakingUpdate"); scanner.Add(doMatchmakingUpdatePtrn, [this](PointerCalculator addr) { MatchmakingUpdate = addr.Sub(0x8).Rip().As(); }); static constexpr auto doMatchmakingUnadvertisePtrn = Pattern<"C7 86 C8 01 00 00 04 00 00 00">("MatchmakingUnadvertise"); scanner.Add(doMatchmakingUnadvertisePtrn, [this](PointerCalculator addr) { MatchmakingUnadvertise = addr.Sub(0xC).Rip().As(); }); static constexpr auto matchmakingSessionDetailSendResponsePtrn = Pattern<"48 B8 01 00 00 00 0D 00 00 00">("SessionDetailSendResponse"); scanner.Add(matchmakingSessionDetailSendResponsePtrn, [this](PointerCalculator addr) { MatchmakingSessionDetailSendResponse = addr.Add(0x2F).Rip().As(); }); static constexpr auto gameSkeletonUpdatePtrn = Pattern<"56 48 83 EC 20 48 8B 81 40 01 00 00 48 85 C0">("GameSkeletonUpdate"); scanner.Add(gameSkeletonUpdatePtrn, [this](PointerCalculator addr) { GameSkeletonUpdate = addr.As(); }); if (!scanner.Scan()) { LOG(FATAL) << "Some patterns could not be found, unloading."; return false; } PatternCache::Update(); return true; } bool Pointers::LateInit() { auto sc = ModuleMgr.Get("socialclub.dll"_J); while (!sc) { LOG(WARNING) << "Waiting for socialclub.dll"; std::this_thread::sleep_for(1s); if (IsSocialClubNeverGoingToLoad()) { LOG(WARNING) << "Timed out checking for socialclub.dll"; return false; } ModuleMgr.LoadModules(); sc = ModuleMgr.Get("socialclub.dll"_J); } auto scanner = PatternScanner(sc); constexpr auto getPresenceAttributesPtrn = Pattern<"48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 54 41 56 41 57 48 83 EC 40 33 DB 49">("GetPresenceAttributes"); scanner.Add(getPresenceAttributesPtrn, [this](PointerCalculator ptr) { GetPresenceAttributes = ptr.As(); }); constexpr auto numHandlesPatchPtrn = Pattern<"83 FD 20 0F 87 54 02 00 00">("NumHandlesPatch"); scanner.Add(numHandlesPatchPtrn, [this](PointerCalculator ptr) { BytePatches::Add(ptr.Add(2).As(), 100)->Apply(); // change handle limit to 100 }); constexpr auto readAttributePatchPtrn = Pattern<"75 70 EB 23">("ReadAttributesPatch"); scanner.Add(readAttributePatchPtrn, [this](PointerCalculator ptr) { BytePatches::Add(ptr.As(), std::to_array({0x90, 0x90}))->Apply(); }); constexpr auto readAttributePatch2Ptrn = Pattern<"32 C0 EB ? C7 83">("ReadAttributesPatch2"); scanner.Add(readAttributePatch2Ptrn, [this](PointerCalculator ptr) { BytePatches::Add(ptr.As(), std::to_array({0xB0, 0x01}))->Apply(); }); constexpr auto getAvatarsPtrn = Pattern<"89 4B ? 48 8B CB E8 ? ? ? ? 84 C0">("GetAvatars"); scanner.Add(getAvatarsPtrn, [this](PointerCalculator ptr) { GetAvatars = ptr.Add(6).Add(1).Rip().As(); }); if (!scanner.Scan()) { LOG(WARNING) << "Some socialclub patterns could not be found"; return false; } PatternCache::Update(); return true; } }