Распаковываем rechecker_X_X.zip в папку вашей игры.
Добавляем библиотеку rechecker_mm_i386.so или rechecker_mm.dll в зависимости от используемой ОС в конфиг MetaMod. Для этого открываем /addons/metamod/plugins.ini (если его нет, создаем сами) и пишем: Linux:
linux addons/rechecker/rechecker_mm_i386.so
Windows:
win32 addons\rechecker\rechecker_mm.dll
Из извлеченного архива rechecker_X_X.zip будет присутствовать файл resources.ini который должен лежать рядом с библиотекой rechecker_mm.dll или rechecker_mm_i386.so
Запускаем сервер и командой meta list проверяем статус Linux:
Currently loaded plugins: description stat pend file vers src load unlod [ 1] Rechecker RUN - rechecker_mm_i386.so vX.X ini Chlvl Any …
Windows
Currently loaded plugins: description stat pend file vers src load unlod [ 1] Rechecker RUN - rechecker_mm.dll vX.X ini Chlvl Any …
Установка Rechecker завершена
Настройки
Описание флагов:
UNKNOWN - Если вам неизвестен хэш, при таком флаге будет искать файл с любым хэшем.
IGNORE - Это флаг который помечает данный файл с хэшем в игнорируемый список.
MISSING - Обнаружение отсутствие файла у клиента.
Если 2 файла с указанным хэшем и с флагом IGNORE были обнаружены, то для UNKNOWN они будут проигнорированы "../qwerty.dll" 099b3b06 IGNORE "../qwerty.dll" f284f878 IGNORE "../qwerty.dll" UNKNOWN "addip 1440 [ip]"
BREAK - Этот флаг выходит из всех проверок если файл был обнаружен или наоборот отсутствует.
Ниже предоставлен пример, при обнаружении файла antichet.dll будет выход из цикла, дальнейшие проверки выполняться не будут. "../anticheat.dll" bdc52384 BREAK "../opengl32.dll" 0ee4e274 "addip 1440 [ip]"
Разбор лога:
exphash - expected hash хэш который ожидает получить
got - хэш который пришел от клиента
typeFind- тип обнаружения
exists - сравнение хэша exphash == got
missing - проверка на отсутствие файла prevhash == got
ignore - файлы помеченные в игнор
hash_any - проверка на любой хэш prevhash != got
prevhash - хэш предыдущего файла prevfile
prevfile - предыдущий файл
md5hex - хэш как указан в resources.ini, тоже самое что и exphash - разница только в порядке байтов от младшего к старшему
findathash - встречался ли ранее такой хэш во всех проверяемых файлов
Форматирование строк:
[name] - Имя игрока
[ip] - IP Адрес игрока
[userid] - идентификатор игрока
[steamid] - Steamid игрока
[file_name] - имя проверяемого файла
[file_hash] - хэш проверяемого файла который вернул клиент (Внимание: этот хэш big-endian, если вы хотите получить хеш для последующего применения в resources.ini то используйте file_md5hash)
[file_md5hash] - хэш проверяемого файла который вернул клиент
Полезные примечания:
Причину наказания или оповещения можно заключать в одинарные кавычки. "amx_kick [userid] 'Opengl32 Detected'"
md5 хэш c8005c526355d8015d462dc7f4ddb159 достаточно иметь первые 4 байта (c8005c52)
#if defined _reapi_rechecker_included
#endinput
#endif
#define _reapi_rechecker_included
enum ResourceType
{
RES_TYPE_NONE = 0,
RES_TYPE_EXISTS, // to comparison with the specified hash value
RES_TYPE_MISSING, // check it missing file on client
RES_TYPE_IGNORE, // ignore the specified hash value
RES_TYPE_HASH_ANY, // any file with any the hash value
};
enum ReCheckerFunc
{
/*
* Description: -
* Params: (const client, const filename[], const cmd[], const ResourceType:type, const responseHash, bool:isBreak)
*/
RC_FileConsistencyProcess = BEGIN_FUNC_REGION(rechecker),
/*
* Description: -
* Params: (const client)
*/
RC_FileConsistencyFinal,
/*
* Description: -
* Params: (const client, const filename[], const cmd[], const responseHash)
*/
RC_CmdExec,
// [...]
};
/*
* Send request the file for the client to get hash
*
@param file The file (Can contain a relative path to the file)
@param function The forward to call
@param type The request type, can be only RES_TYPE_EXISTS, RES_TYPE_MISSING or RES_TYPE_HASH_ANY
@param hash Hash of file to request.
*
* @return Returns a hook handle. Use UnRegisterQueryFile to remove the forward
*
*/
native QueryFileHook:RegisterQueryFile(const file[], const function[], const ResourceType:type, const hash = -1);
/*
Unregister the forward.
Use the return value from RegisterQueryFile as the parameter here!
*
* @param hook The hook to remove
*
* @return Returns true if the hook is successfully removed, otherwise false
*
*/
native bool:UnRegisterQueryFile(QueryFileHook:hook);