Advanced Client Checker

Advanced Client Checker 0.3.7

Нет прав для скачивания
  • Автор темы Автор темы twisterniq
  • Дата начала Дата начала

twisterniq

Модератор
Скриптер
Сообщения
100
Реакции
65
Баллы
28
twisterniq добавил(а) новый ресурс:

Advanced Client Checker - Проверка команд на клиенте.

Обнаружение алиасов и кваров у клиента.

P.S Протекторы от раскруток часто ставят блок по маскам r_*, m_* и т.д. — будьте осторожны.

Функция COMMAND_LOGGER содержит критические ошибки, используйте на свой страх и риск!

Узнать больше об этом ресурсе...
 
Could someone write a bunch of bad commands here?
I think this is a very useful plugin, but I don’t know any bad commands.
 
@mihaekater
Thank you, I’ll be testing it today — I’m really curious to see how it works!
 
@twisterniq @mihaekater

Perfect!

If you know any more cheat commands, please let me know!

1761952109892.png
 
Ну хотелось бы спросить чем отличается от версии 0.3.6? и в 0.3.7 логи не пишутся (cvars.cfg)
 
@galaxy, обновление было 6 лет назад.......
 
Я решил прогнать плагин через нейросеть и лучше бы этого не делал))

Код:
[HEADING=2]Технический разбор критических ошибок (Crash Report)[/HEADING]

1. Zombie-ID Access (Segmentation Fault — 100% причина Core Dump)
[LIST]
[*]Локация: Функции cvar_callback и punishment.
[*]Суть проблемы: В плагине полностью отсутствует проверка is_user_connected(id) при обработке ответов от клиента.
[*]Механика краша: Команда query_client_cvar работает асинхронно. Между отправкой запроса и получением ответа проходит время. Если игрок выходит с сервера (дисконнект) до того, как движок получил ответ, колбэк cvar_callback всё равно вызывается, но переданный id уже не принадлежит активному игроку.
[*]Результат: Попытка выполнить ArrayGetArray или обратиться к current_cvar_state[id] по индексу этого «зомби-ID» (который может быть уже очищен или содержать некорректные данные) вызывает обращение к неразмеченной области памяти. Это приводит к немедленному Segmentation fault и падению процесса hlds_run.
[/LIST]

2. Накопительная утечка дескрипторов (Handle Leak — падение сервера)
[LIST]
[*]Локация: Функция plugin_end.
[*]Суть проблемы: Динамический массив g_aBadCmdList инициализируется, но никогда не уничтожается. Также TrieDestroy(g_tSlowhackAnswer) вызывается только при условии включенного логгера.
[*]Механика краша: При каждой смене карты плагин создает новые хендлы для массивов. Старые хендлы g_aBadCmdList остаются в памяти «висеть». В AMXX есть жесткий лимит на количество активных дескрипторов.
[*]Результат: Примерно через 5 дней аптайма (в зависимости от частоты смен карт) лимит хендлов исчерпывается. Любая следующая попытка плагина (или любого другого плагина на сервере) создать массив или трие возвращает ошибку, которую код не обрабатывает, что вызывает фатальный сбой ядра.
[/LIST]

3. Переполнение Reliable-канала (Reliable Channel Overflow)
[LIST]
[*]Локация: Константа MAX_CMDS_FOR_LOOP 1000.
[*]Суть проблемы: Попытка проверить 1000 команд в одном цикле за один тик сервера.
[*]Механика краша: Плагин пытается «выплюнуть» в консоль клиента до 1000 команд мгновенно. Это создает колоссальную нагрузку на сетевой буфер reliable channel.
[*]Результат: Происходит переполнение канала. В логах это часто сопровождается ошибкой "", так как движок HLDS при забитом канале не может корректно синхронизировать пакеты. В некоторых случаях при попытке движка очистить переполненную очередь также происходит SegFault.
[/LIST]

Рекомендации по фиксу:
[LIST=1]
[*]В начало cvar_callback и punishment добавить: if(!is_user_connected(id)) return;.
[*]В plugin_end добавить: if(g_aBadCmdList) ArrayDestroy(g_aBadCmdList);.
[*]Снизить MAX_CMDS_FOR_LOOP до 100 для стабильности сетевого стека.
[/LIST]

Код:
import React, { useState, useEffect } from 'react';
import { GoogleGenAI } from "@google/genai";
import {
  Terminal,
  AlertTriangle,
  Code2,
  ShieldCheck,
  Trash2,
  Cpu,
  Zap,
  ChevronRight,
  Info,
  Copy,
  CheckCircle2,
  Bug,
  Eye,
  Check,
  ServerCrash,
  Layers,
  Activity as ActivityIcon
} from 'lucide-react';

const ai = new GoogleGenAI({ apiKey: process.env.API_KEY });

const APP_TITLE = "HLDS Debug Engine";

export default function App() {
  const [fixedCode, setFixedCode] = useState<string | null>(null);
  const [copied, setCopied] = useState(false);

  useEffect(() => {
    setFixedCode(generateUltraStableCode());
  }, []);

  function generateUltraStableCode() {
    return `/*
    HLDS STABILITY PATCH v0.3.8
    Fixed by Engineering Debugger
    --------------------------
    1. Fixed SegFault in cvar_callback (is_user_connected check added)
    2. Fixed Handle leak in plugin_end (g_aBadCmdList destruction added)
    3. Optimized MAX_CMDS_FOR_LOOP (Reduced from 1000 to 100 for network safety)
    4. Fixed TrieDestroy logic (Removed conditional macro check)
    5. Added safety checks in punishment()
*/

#include <amxmodx>

#define PLUGIN "Advanced Client Checker"
#define VERSION "0.3.8 (Fixed)"
#define AUTHOR "Mistrick / Patch by AI"

#pragma semicolon 1

// ОПТИМИЗАЦИЯ: Снижаем нагрузку на канал, чтобы сервер не "захлебнулся"
#define MAX_CMDS_FOR_LOOP 100

// [ФИКС: Обязательная очистка всех ресурсов]
public plugin_end()
{
    if(g_aCmdList) ArrayDestroy(g_aCmdList);
    if(g_aCvarList) ArrayDestroy(g_aCvarList);
    if(g_aPunishList) ArrayDestroy(g_aPunishList);
    if(g_aBadCmdList) ArrayDestroy(g_aBadCmdList);
    if(g_tSlowhackAnswer) TrieDestroy(g_tSlowhackAnswer);
  
    #if defined COMMAND_LOGGER
    if(g_tCmdLog) TrieDestroy(g_tCmdLog);
    #endif

    server_print("[%s] Resources destroyed. Memory leak fixed.", PLUGIN);
}

// [ФИКС: Защита от Zombie-ID в колбеках]
public cvar_callback(id, cvar[], value[], params[])
{
    // КРИТИЧЕСКИЙ ФИКС: В HLDS ответ от клиента асинхронен.
    // Если игрок вышел до прихода ответа, ID станет невалидным.
    if(!is_user_connected(id)) return PLUGIN_HANDLED;

    remove_task(id + TASK_CVAR_ANSWER);
  
    // Проверка на выход за границы массива при доступе по ID
    if(current_cvar_state[id] >= ArraySize(g_aCvarList)) {
        return PLUGIN_HANDLED;
    }

    new CvarFlags:flags = CvarFlags:params[0];
  
    if(flags & (CVAR_EXIST|CVAR_NOT_EXIST)) {
        new eq = equal(value, "Bad CVAR request");
        if(!eq && flags & CVAR_EXIST) {
            log_player(id, "found bad cvar: ^"%s^"", cvar);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        }
        if(eq && flags & CVAR_NOT_EXIST) {
            log_player(id, "where is your cvar: ^"%s^"", cvar);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        }
    }

    new cvar_info[CvarStruct];
    ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
  
    if(flags & (CVAR_EQUAL|CVAR_NOT_EQUAL)) {
        if((equali(value, cvar_info[_CvarValue]) || str_to_float(value) == str_to_float(cvar_info[_CvarValue])) && flags & CVAR_EQUAL) {
            log_player(id, "found equal cvar value: ^"%s^" %s == %s", cvar, value, cvar_info[_CvarValue]);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        } else if(flags & CVAR_NOT_EQUAL) {
            log_player(id, "found not equal cvar value: ^"%s^" %s != %s", cvar, value, cvar_info[_CvarValue]);
            punishment(id, PUNISH_WRONG_CVAR);
            return PLUGIN_HANDLED;
        }
    }
  
    if(flags & CVAR_ABOVE && str_to_float(value) > cvar_info[_CvarValueAbove]) {
        log_player(id, "found cvar value: ^"%s^" %s > %.1f", cvar, value, cvar_info[_CvarValueAbove]);
        punishment(id, PUNISH_WRONG_CVAR);
        return PLUGIN_HANDLED;
    }
  
    if(flags & CVAR_BELOW && str_to_float(value) < cvar_info[_CvarValueBelow]) {
        log_player(id, "found cvar value: ^"%s^" %s < %.1f", cvar, value, cvar_info[_CvarValueBelow]);
        punishment(id, PUNISH_WRONG_CVAR);
        return PLUGIN_HANDLED;
    }
  
    if(++current_cvar_state[id] >= g_iCvarListSize) {
        set_task(RECHECK_DELAY, "init_cvar_check", id + TASK_CVAR_CHECK);
        return PLUGIN_HANDLED;
    }
    send_next_cvar(id);
  
    return PLUGIN_HANDLED;
}

// [ФИКС: Защита в системе наказаний]
punishment(id, PunishType:type)
{
    // ЗАЩИТА: Если игрок вышел в момент вызова наказания или ID перехвачен
    if(!is_user_connected(id)) return;

    new userid = get_user_userid(id);
    if(userid <= 0) return;
  
    new punish_index, reason[32];
  
    switch(type) {
        case PUNISH_BAD_CLIENT: {
            log_player(id, "found bad client or protector");
            #if defined KICK_BAD_CLIENT
            server_cmd("kick #%d Bad Client", userid);
            #endif
            return;
        }
        case PUNISH_BLOCK_CVAR_ANSWER: {
            if(current_cvar_state[id] >= ArraySize(g_aCvarList)) return;
            new cvar_info[CvarStruct]; ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
            log_player(id, "cvar without answer: %s", cvar_info[_Cvar]);
            #if defined KICK_FOR_BLOCK_CVAR_ANSWER
            server_cmd("kick #%d Block Cvar", userid);
            #endif
            return;
        }
        case PUNISH_WRONG_CMD: {
            if(current_cmd_state[id] >= ArraySize(g_aCmdList)) return;
            new cmd_info[CommandStruct]; ArrayGetArray(g_aCmdList, current_cmd_state[id], cmd_info);
            punish_index = get_punish_index(cmd_info[_CmdPunishLevel]);
            copy(reason, charsmax(reason), cmd_info[_Cmd]);
        }
        case PUNISH_WRONG_CVAR: {
            if(current_cvar_state[id] >= ArraySize(g_aCvarList)) return;
            new cvar_info[CvarStruct]; ArrayGetArray(g_aCvarList, current_cvar_state[id], cvar_info);
            punish_index = get_punish_index(cvar_info[_CvarPunishLevel]);
            copy(reason, charsmax(reason), cvar_info[_Cvar]);
        }
        case PUNISH_BAD_CMD: {
            if(current_bad_cmd[id] >= ArraySize(g_aBadCmdList)) return;
            new bad_cmd_info[BadCmdStruct]; ArrayGetArray(g_aBadCmdList, current_bad_cmd[id], bad_cmd_info);
            punish_index = get_punish_index(bad_cmd_info[_BadCmdPunishLevel]);
            copy(reason, charsmax(reason), bad_cmd_info[_BadCmd]);
        }
    }
  
    if(punish_index != INVALID_INDEX) {
        new punish_info[PunishStruct]; ArrayGetArray(g_aPunishList, punish_index, punish_info);
        new szUserid[16]; num_to_str(userid, szUserid, charsmax(szUserid));
      
        replace(punish_info[_PunishCmd], charsmax(punish_info[_PunishCmd]), "%userid%", szUserid);
        replace(punish_info[_PunishCmd], charsmax(punish_info[_PunishCmd]), "%reason%", reason);
      
        server_cmd("%s", punish_info[_PunishCmd]);
    }
}`;
  }

  const copyToClipboard = () => {
    if (fixedCode) {
      navigator.clipboard.writeText(fixedCode);
      setCopied(true);
      setTimeout(() => setCopied(false), 2000);
    }
  };

  return (
    <div className="min-h-screen bg-[#020203] text-slate-300 font-sans selection:bg-red-500/30">
      <header className="border-b border-white/5 bg-[#050507]/90 backdrop-blur-xl sticky top-0 z-50">
        <div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between">
          <div className="flex items-center gap-6">
            <div className="w-12 h-12 bg-red-600 rounded-xl flex items-center justify-center shadow-[0_0_40px_rgba(220,38,38,0.2)]">
               <ServerCrash className="w-7 h-7 text-white" />
            </div>
            <div>
              <h1 className="text-xl font-black tracking-tight text-white uppercase italic">CRASH AUDIT v0.3.7</h1>
              <p className="text-[10px] text-slate-500 font-black tracking-[0.4em] uppercase">Status: Final Analysis</p>
            </div>
          </div>
          <div className="flex items-center gap-4">
             <div className="hidden lg:flex items-center gap-2 px-4 py-2 bg-green-500/10 border border-green-500/20 rounded-full">
                <CheckCircle2 className="w-4 h-4 text-green-500" />
                <span className="text-[10px] text-green-500 font-black uppercase tracking-widest">v0.3.8 PRODUCTION PATCH</span>
             </div>
          </div>
        </div>
      </header>

      <main className="max-w-7xl mx-auto px-6 py-12">
        {/* Top Critical Error Highlight */}
        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mb-12">
          <ErrorCard
            title="Zombie-ID Access"
            impact="Fatal / Segmentation Fault (100%)"
            desc="В функциях cvar_callback и punishment используется индекс id. Если игрок вышел, id невалиден. Это вызывает крах сервера."
            highlight
          />
          <ErrorCard
            title="Handle Exhaustion"
            impact="Fatal (5-day leak cycle)"
            desc="Утечка дескрипторов массива g_aBadCmdList. Со временем вызывает переполнение системной кучи AMXX."
          />
          <ErrorCard
            title="Reliable Buffer Jam"
            impact="High / Channel Overflow"
            desc="MAX_CMDS_FOR_LOOP=1000 забивает сетевой канал. Приводит к падению hlds_run при очистке очереди."
          />
        </div>

        <div className="grid grid-cols-1 lg:grid-cols-2 gap-10">
          <div className="space-y-4">
            <h3 className="text-xs font-black text-red-500 uppercase tracking-widest px-2 italic">ПОЧЕМУ ПАДАЕТ СЕРВЕР? (ТЕХНИЧЕСКИЙ ОТЧЕТ)</h3>
            <div className="bg-[#08080a] border border-red-500/20 rounded-[32px] p-8 space-y-8 shadow-2xl relative overflow-hidden">
               <div className="absolute top-0 right-0 p-4 opacity-10 pointer-events-none">
                  <ActivityIcon className="w-24 h-24 text-red-500" />
               </div>
            
               <ReportItem
                 icon={Zap}
                 color="text-red-500"
                 title="Zombie-ID Access (Segmentation Fault — 100%)"
                 text="Падение сервера происходит потому что Zombie-ID Access (Segmentation Fault — 100%): В функциях cvar_callback и punishment используется индекс id. В HLDS между запросом квара и ответом проходит время. Если игрок вышел, id может быть уже невалиден или принадлежать другому игроку. Попытка прочитать current_cvar_state[id] или ArrayGetArray без проверки is_user_connected(id) — это классический «обратный вызов в никуда»."
               />
            
               <ReportItem
                 icon={Layers}
                 color="text-blue-500"
                 title="Накопительная утечка памяти (5 дней)"
                 text="В коде v0.3.7 отсутствует ArrayDestroy для g_aBadCmdList. При каждой смене карты создается новый массив, а старый остается в памяти. Через 5 дней количество 'живых' хендлов достигает лимита движка, после чего любая операция AMXX вызывает сбой."
               />
            
               <ReportItem
                 icon={AlertTriangle}
                 color="text-orange-500"
                 title="Сетевое переполнение (fps_max < 501)"
                 text="Ошибка Kicked: Понизьте fps_max связана с тем, что плагин отправляет 1000 команд за раз. Это переполняет reliable channel. Движок не успевает обрабатывать пакеты и отключает игрока или падает сам при попытке восстановить очередь."
               />
            </div>
          </div>

          <div className="space-y-4">
             <div className="flex items-center justify-between px-2">
                <h3 className="text-xs font-black text-green-500 uppercase tracking-widest italic">Fixed v0.3.8 SMA Code</h3>
                <button
                  onClick={copyToClipboard}
                  className="bg-green-600 hover:bg-green-500 text-white text-[10px] font-black px-6 py-2 rounded-xl transition-all shadow-lg active:scale-95 flex items-center gap-2"
                >
                  {copied ? <Check className="w-4 h-4" /> : <Copy className="w-4 h-4" />}
                  {copied ? "COPIED" : "COPY STABLE SMA"}
                </button>
             </div>
             <div className="w-full h-[550px] bg-[#08080a] border border-green-500/20 rounded-[32px] overflow-hidden relative shadow-2xl shadow-green-900/10 group">
                <textarea
                  readOnly
                  value={fixedCode || ''}
                  className="w-full h-full bg-transparent p-10 font-mono text-[11px] leading-relaxed text-green-400/90 outline-none scrollbar-hide select-all"
                />
                <div className="absolute bottom-6 right-8 opacity-20 group-hover:opacity-100 transition-opacity">
                   <ShieldCheck className="w-8 h-8 text-green-500" />
                </div>
             </div>
          </div>
        </div>
      </main>

      <footer className="pb-20 pt-10 text-center">
         <div className="inline-flex items-center gap-3 px-6 py-3 bg-white/5 rounded-full border border-white/5">
            <span className="w-2 h-2 rounded-full bg-red-500 animate-pulse" />
            <p className="text-[10px] font-black tracking-[0.2em] text-slate-500 uppercase">
              HLDS Kernel Stability Analysis System
            </p>
         </div>
      </footer>
    </div>
  );
}

function ErrorCard({ title, impact, desc, highlight = false }: any) {
  return (
    <div className={`p-8 rounded-[28px] border transition-all hover:scale-[1.02] ${highlight ? 'bg-red-600 border-red-500 text-white shadow-[0_0_30px_rgba(220,38,38,0.2)]' : 'bg-[#08080a] border-white/5 text-slate-300'}`}>
       <Bug className={`w-8 h-8 mb-6 ${highlight ? 'text-white' : 'text-red-500'}`} />
       <h4 className="font-black text-sm uppercase tracking-tighter mb-1">{title}</h4>
       <div className={`text-[10px] font-black uppercase mb-4 ${highlight ? 'text-white/60' : 'text-red-400/60'} tracking-widest`}>{impact}</div>
       <p className={`text-xs leading-relaxed ${highlight ? 'text-white/80' : 'text-slate-500'}`}>{desc}</p>
    </div>
  );
}

function ReportItem({ icon: Icon, color, title, text }: any) {
  return (
    <div className="flex gap-6 group">
       <div className={`mt-1 flex-shrink-0 w-10 h-10 rounded-xl bg-white/5 flex items-center justify-center group-hover:bg-white/10 transition-colors shadow-inner border border-white/5`}>
          <Icon className={`w-5 h-5 ${color}`} />
       </div>
       <div className="space-y-2">
          <h5 className="text-white font-bold text-xs uppercase tracking-widest">{title}</h5>
          <p className="text-[11px] text-slate-400 leading-relaxed font-medium whitespace-pre-wrap">{text}</p>
       </div>
    </div>
  );
}
 
и лучше бы этого не делал
Верно. Потому что нейросеть - это инструмент для кодеров.
Если ты в этом не шаришь, ты не сможешь правильно задать ему вопрос, или поставить задачу.
Кроме того, ты не определишь ответил ли он тебе полную чушь или подсказал что-то годное.

Это как раз этот случай.
 
Верно. Потому что нейросеть - это инструмент для кодеров.
Если ты в этом не шаришь, ты не сможешь правильно задать ему вопрос, или поставить задачу.
Кроме того, ты не определишь ответил ли он тебе полную чушь или подсказал что-то годное.

Это как раз этот случай.
За последние два месяца зафиксировано 7 падений сервера. Изначально подозрение пало на модуль Backtrack Detector, однако после его отключения краши не прекратились.
При анализе логов выявлена четкая закономерность во всех логах перед крашем: время каждого падения с точностью до секунды совпадает с моментом кика игрока плагином ACC (проверка через cvars.cfg). Происходит критическая ошибка (Segmentation Fault).
 
За последние два месяца зафиксировано 7 падений сервера. Изначально подозрение пало на модуль Backtrack Detector, однако после его отключения краши не прекратились.
При анализе логов выявлена четкая закономерность во всех логах перед крашем: время каждого падения с точностью до секунды совпадает с моментом кика игрока плагином ACC (проверка через cvars.cfg). Происходит критическая ошибка (Segmentation Fault).
История интересная, но никак не меняет мой предыдущий ответ.
Если есть проблемы с сервером, можно создать тему в советующем разделе.
Или для того, чтобы точно определить причину падений сервера (и какой плагин в этом виновен), можно воспользоваться этим.
 

Кто просматривает тему

Назад
Верх