Перейти к содержанию

Создаем internal мультихак, на примере CryEngine3 SDK [6 часть]

JustHack

420 просмотров

 

1.thumb.png.5eebdd2c57b7d173efcb983c1dc80bcd.png

 

В данной статье мы с вами создадим АнтиАфк. Cуществуют разные проверки, в том числе активен игрок в данный момент или нет. Если игрок находится в созданной комнате и не активен в течении 90с(это значение меняется каждое обновление), то он автоматически исключается из комнаты и на его место может зайти другой игрок. Однако, у него сохраняется возможность заново присоединиться в комнату, из которой его исключили за бездействие. Также, помимо проверки активности игрока в комнате, существует проверка игрока в любом бою, будь то PvP матч или PvE миссия. Если в бою игрок не активен более 120с(это значение меняется каждое обновление), то система автоматически исключает его за бездействие и присоединиться в бой, из которого его исключили он уже не может. Проверки осуществляются в 2 этапа. Первая проверка локальная и её можно просто отключить. Вторая проверка зашита в античит и чтобы отключить её, нужно отключить IN-GAME античит или передавать необходимые значения. Если вы просто отключите проверку, IN-GAME античита, вы получили бан в течении 10 минут. В данной статье, мы будем передавать нужные нам значения, а отключение IN-GAME античита мы осуществим в одной(или двух) из будущих статей. Для того, чтобы обойти эти 3 проверки, нам нужно просто получить указатель на нашего игрока, отключить локальную проверку активности и установить нужные значения на проверку от античита. Адрес ICvar вы найдётё вот так:

 

Спойлер

d5ada98dce3e479b1f9bd56116777d92.bmp

 

Спойлер

69dabfdcd6260963d5bc5eae129fdb1e.jpg

 

Спойлер

a7177a2f6b3cf63205747f70fc55d8cf.bmp

 

Спойлер

17cc4eb1f950e46ca55bdadef0a46c12.bmp

 

Спойлер

36ce3182652a2d3db47a776fd4d34b9d.bmp

 

С остальным, у вас не должно возникнуть проблем, т.к мы уже изучали поиск всего необходимого для создания этого проекта.

 

Спойлер

#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


5 Комментариев


Рекомендуемые комментарии

Статья отличная, спасибо! Только за одно глаз зацепился

T VirtualF(PVOID Base, DWORD64 Index) { return (*(T**)Base)[Index / 8]; }

Правильно было бы назвать не Index, а Offset, как мне кажется, ведь ты от смещения, поделенного на 8, находишь индекс функции.

Поделиться этим комментарием


Ссылка на комментарий

Мы вычисляем индекс в вирт таблице, поэтому Index. В любом случае, каждый может назвать это так, как считает нужным.

Поделиться этим комментарием


Ссылка на комментарий

Так я же о  том и говорю - мы вычисляем индекс в виртуальной таблице, но на вход берем смещение, и делим его на 8 ) А тут получается, мы берем какой-то индекс, делим его на восемь, и получаем другой индекс ) 

Поделиться этим комментарием


Ссылка на комментарий

Держи

#define SSGE_ADDR				0x141E112E0
#define IGAMEFRAMEWORK_ADDR			0x14211AE28
#define ICVAR_ADDR				0x141046DD0

Остальные адреса и смещения не изменились.

Поделиться этим комментарием


Ссылка на комментарий
Гость
Эта запись блога заблокирована для комментирования.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.