/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef _WARDENCHECKMGR_H
#define _WARDENCHECKMGR_H
#include "Define.h"
#include "World.h"
#include
#include
// EnumUtils: DESCRIBE THIS
enum WardenActions : uint8
{
WARDEN_ACTION_LOG, // TITLE Log
WARDEN_ACTION_KICK, // TITLE Kick
WARDEN_ACTION_BAN // TITLE Ban
};
// EnumUtils: DESCRIBE THIS
enum WardenCheckCategory : uint8
{
INJECT_CHECK_CATEGORY = 0, // checks that test whether the client's execution has been interfered with
LUA_CHECK_CATEGORY, // checks that test whether the lua sandbox has been modified
MODDED_CHECK_CATEGORY, // checks that test whether the client has been modified
NUM_CHECK_CATEGORIES // SKIP
};
// EnumUtils: DESCRIBE THIS
enum WardenCheckType : uint8
{
NONE_CHECK = 0, // SKIP
TIMING_CHECK = 87, // nyi
DRIVER_CHECK = 113, // uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)
PROC_CHECK = 126, // nyi
LUA_EVAL_CHECK = 139, // evaluate arbitrary Lua check
MPQ_CHECK = 152, // get hash of MPQ file (to check it is not modified)
PAGE_CHECK_A = 178, // scans all pages for specified SHA1 hash
PAGE_CHECK_B = 191, // scans only pages starts with MZ+PE headers for specified hash
MODULE_CHECK = 217, // check to make sure module isn't injected
MEM_CHECK = 243, // retrieve specific memory
};
constexpr WardenCheckCategory GetWardenCheckCategory(WardenCheckType type)
{
switch (type)
{
case TIMING_CHECK: return NUM_CHECK_CATEGORIES;
case DRIVER_CHECK: return INJECT_CHECK_CATEGORY;
case PROC_CHECK: return NUM_CHECK_CATEGORIES;
case LUA_EVAL_CHECK: return LUA_CHECK_CATEGORY;
case MPQ_CHECK: return MODDED_CHECK_CATEGORY;
case PAGE_CHECK_A: return INJECT_CHECK_CATEGORY;
case PAGE_CHECK_B: return INJECT_CHECK_CATEGORY;
case MODULE_CHECK: return INJECT_CHECK_CATEGORY;
case MEM_CHECK: return MODDED_CHECK_CATEGORY;
default: return NUM_CHECK_CATEGORIES;
}
}
constexpr WorldIntConfigs GetWardenCategoryCountConfig(WardenCheckCategory category)
{
switch (category)
{
case INJECT_CHECK_CATEGORY: return CONFIG_WARDEN_NUM_INJECT_CHECKS;
case LUA_CHECK_CATEGORY: return CONFIG_WARDEN_NUM_LUA_CHECKS;
case MODDED_CHECK_CATEGORY: return CONFIG_WARDEN_NUM_CLIENT_MOD_CHECKS;
default: return INT_CONFIG_VALUE_COUNT;
}
}
constexpr bool IsWardenCategoryInWorldOnly(WardenCheckCategory category)
{
switch (category)
{
case INJECT_CHECK_CATEGORY: return false;
case LUA_CHECK_CATEGORY: return true;
case MODDED_CHECK_CATEGORY: return false;
default: return false;
}
}
struct WardenCheck
{
uint16 CheckId = 0;
WardenCheckType Type = NONE_CHECK;
std::vector Data;
uint32 Address = 0; // PROC_CHECK, MEM_CHECK, PAGE_CHECK
uint8 Length = 0; // PROC_CHECK, MEM_CHECK, PAGE_CHECK
std::string Str; // LUA, MPQ, DRIVER
std::string Comment;
std::array IdStr = {}; // LUA
WardenActions Action = WARDEN_ACTION_LOG;
};
constexpr uint8 WARDEN_MAX_LUA_CHECK_LENGTH = 170;
using WardenCheckResult = std::vector;
class TC_GAME_API WardenCheckMgr
{
private:
WardenCheckMgr();
public:
WardenCheckMgr(WardenCheckMgr const&) = delete;
WardenCheckMgr(WardenCheckMgr&&) = delete;
WardenCheckMgr& operator=(WardenCheckMgr const&) = delete;
WardenCheckMgr& operator=(WardenCheckMgr&&) = delete;
static WardenCheckMgr* instance();
uint16 GetMaxValidCheckId() const { return static_cast(_checks.size()); }
WardenCheck const& GetCheckData(uint16 Id) const;
WardenCheckResult const& GetCheckResult(uint16 Id) const;
std::vector const& GetAvailableChecks(WardenCheckCategory category) { return _pools[category]; }
void LoadWardenChecks();
void LoadWardenOverrides();
private:
std::vector _checks;
std::unordered_map _checkResults;
std::array, NUM_CHECK_CATEGORIES> _pools;
};
#define sWardenCheckMgr WardenCheckMgr::instance()
#endif