Создаем internal мультихак, на примере CryEngine3 SDK [AntiAFK]
В данной статье мы с вами создадим АнтиАфк. Cуществуют разные проверки, в том числе активен игрок в данный момент или нет. Если игрок находится в созданной комнате и не активен в течении 90с(это значение меняется каждое обновление), то он автоматически исключается из комнаты и на его место может зайти другой игрок. Однако, у него сохраняется возможность заново присоединиться в комнату, из которой его исключили за бездействие. Также, помимо проверки активности игрока в комнате, существует проверка игрока в любом бою, будь то PvP матч или PvE миссия. Если в бою игрок не активен более 120с(это значение меняется каждое обновление), то система автоматически исключает его за бездействие и присоединиться в бой, из которого его исключили он уже не может. Проверки осуществляются в 2 этапа. Первая проверка локальная и её можно просто отключить. Вторая проверка зашита в античит и чтобы отключить её, нужно отключить IN-GAME античит или передавать необходимые значения. Если вы просто отключите проверку, IN-GAME античита, вы получили бан в течении 10 минут. В данной статье, мы будем передавать нужные нам значения, а отключение IN-GAME античита мы осуществим в одной(или двух) из будущих статей. Для того, чтобы обойти эти 3 проверки, нам нужно просто получить указатель на нашего игрока, отключить локальную проверку активности и установить нужные значения на проверку от античита. Адрес ICvar вы найдётё вот так:
С остальным, у вас не должно возникнуть проблем, т.к мы уже изучали поиск всего необходимого для создания этого проекта.
#define ICVAR_ADDR 0x14100E5D0 #define IGAMEFRAMEWORK_ADDR 0x1420DE108 #define ICVAR_OFFS_IDLECHECK 0x168 #define ICVAR_OFFS_LOBBYAFK 0x7B0 #define ICVAR_OFFS_INGAMEAFK 0x5D0 #define IGAMEFRAMEWORK_GETCLIENTACTOR 0x470 template <typename T> T VirtualF(PVOID Base, DWORD64 Index) { return (*(T**)Base)[Index / 8]; } enum eCvarOffsets : DWORD64 { E_IDLECHECK = ICVAR_OFFS_IDLECHECK, E_LOBBYAFK = ICVAR_OFFS_LOBBYAFK, E_INGAMEAFK = ICVAR_OFFS_INGAMEAFK, }; class ICvar { public: template <class T> inline void SetValue(DWORD64 Offset, T Value){*(T*)((DWORD64)this + Offset) = Value;} static ICvar* Base() { return *(ICvar**)ICVAR_ADDR; } }; class IGameFramework { public: bool GetClientActor(IActor** pActor) { return VirtualF<bool(__thiscall*)(PVOID, IActor**)>(this, IGAMEFRAMEWORK_GETCLIENTACTOR)(this, pActor); } static IGameFramework* Base() { return *(IGameFramework**)IGAMEFRAMEWORK_ADDR; } }; void AntiAfk() { IGameFramework* pGameFramework = IGameFramework::Base(); if (!pGameFramework) return; ICvar* pCvar = ICvar::Base(); if (!pCvar) return; IActor* pActor = nullptr; if (pGameFramework->GetClientActor(&pActor)) { pCvar->SetValue(eCvarOffsets::E_LOBBYAFK, INT_MAX); pCvar->SetValue(eCvarOffsets::E_INGAMEAFK, INT_MAX); pCvar->SetValue(eCvarOffsets::E_IDLECHECK, FALSE); } }
Если вам что-то не понятно, не стесняйтесь задавать свои вопросы в ЛС Discord или ниже в комментариях.
-
2
3 Комментария
Рекомендуемые комментарии