Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос FunTime - странное поведение хука на проверку движения/реверс AC

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
19 Окт 2025
Сообщения
96
Реакции
4
Народ, кто ковырялся в античите FunTime, нужна адекватная точка зрения, а то уже не понимаю, это я тупой или они реально накрутили какую-то Franken-систему поверх старого говнокода.

Речь про FunTime (MC-сервер, их кастомный античит на движке плагинов, но часть логики явно вынесена в отдельный модуль/серверную часть). Я сел поковырять их проверки на движение/комбат, потому что поведение античита иногда вообще нелогичное: один и тот же скрипт/клиент ведёт себя по-разному на разных сессиях.

Что именно делал: лез в трафик между клиентом и сервером через сниффер, отслеживал, как сервер реагирует на пачки `position / look / attack` пакетов. Пытался понять, где именно срабатывает античит: сервер сначала просто флагает (резкие “откаты” назад), потом добавляет “резиновость” движения, и только после нескольких одинаковых паттернов уже кикает/банит. По ощущениям, у них несколько уровней проверок, и они не всегда срабатывают в одном и том же порядке.

Что заметил по поведению:

- На чистом клиенте одни и те же действия (спринт + стрейф + прыжки) иногда вообще не триггерят античит, а иногда ловишь микро-откат в одно и то же место. Такое ощущение, будто часть проверок идёт по старому модулю, часть по новому, и какой из них сработает — зависит от нагрузки или очереди обработки.
- Прогонял записанный дамп (одинаковая последовательность пакетов) через реиграв: один раз сервер просто игнорит, второй раз уже флагует как подозрительное движение. Либо у них какой-то stateful-анализ с накоплением статистики, либо реально работают два разных обработчика параллельно.
- По логике очень похоже, что старые проверки (условный “legacy-античит” в плагинах) всё ещё живут на сервере, а сверху навешан новый модуль, который тоже лезет в те же данные. В итоге на одни и те же действия реакция идёт то от старого блока, то от нового. Такое чувство, что FunTime выкатывали обнову античита поэтапно, часть проверок дописали, а старое не до конца выпилили, и теперь оно в некоторых сценариях пересекается.

Что уже пробовал:

менял паттерны движения/комбата, пытался подвести под “границу” срабатывания — порог триггера одной и той же последовательности пакетов плавает. Игрался с задержками между пакетами (искусственный ping и jitter): при ровном пинге иногда вообще тишина, при лёгком рандомном джиттере триггер получается воспроизводить стабильнее. Плюс смотрел, не завязан ли античит на время сессии / количество действий — есть ощущение, что система “прогревается” и начинает агрессивнее реагировать ближе к середине игры.

Для дебага движения на своей стороне набросал такой черновой код (условно логер движения, чтобы потом сравнивать с моментами, когда сервер начинает “кусаться”):

Код:
Expand Collapse Copy
struct Vec3 {
    double x, y, z;
};

struct MoveSample {
    Vec3    pos;
    double  serverTime;
    double  speed;
};

std::vector<MoveSample> g_samples;

void log_move(const Vec3& prev, const Vec3& cur, double serverTime) {
    double dx = cur.x - prev.x;
    double dy = cur.y - prev.y;
    double dz = cur.z - prev.z;

    double dist = std::sqrt(dx * dx + dy * dy + dz * dz);
    double dt   = std::max(0.0001, serverTime - (g_samples.empty() ? serverTime : g_samples.back().serverTime));

    MoveSample s;
    s.pos        = cur;
    s.serverTime = serverTime;
    s.speed      = dist / dt;

    g_samples.push_back(s);
}

// Деобфусцированный код для поиска "подозрительных" скачков скорости относительно предыдущих значений
std::vector<MoveSample> find_suspicious(double maxLegitSpeed, double spikeFactor) {
    std::vector<MoveSample> out;
    for (size_t i = 1; i < g_samples.size(); ++i) {
        double v_prev = g_samples[i - 1].speed;
        double v_cur  = g_samples[i].speed;

        if (v_cur > maxLegitSpeed && v_prev > 0.0 && (v_cur / v_prev) > spikeFactor) {
            out.push_back(g_samples[i]);
        }
    }
    return out;
}

Смысл в том, чтобы логировать то, как выглядит движение “глазами сервера” (позиция + время), считать фактическую скорость и искать аномальные скачки, а потом сравнивать эти моменты с тем, когда FunTime начинает откатывать/лагать/кикать.

Собственно вопросы к тем, кто плотно ковырял FunTime и их античит:

1. У них реально гибридный античит (старый + новый модуль), или я просто не туда смотрю?
2. Есть ли подтверждённая инфа, что часть проверок до сих пор держится на старых плагинах/конфиге, а сверху докручен отдельный “античит-сервис”?
3. Замечали нестабильное поведение: один и тот же клиент/паттерн то спокойно проходит, то ловит флаг без каких-либо изменений?
4. Куда логичнее копать дальше: в сторону анализа серверных тиков и очередей обработки пакетов или в сторону какого-то накопительного профиля игрока (античит, который “усиливает” проверки по ходу сессии)?

Если кто-то уже делал реверс именно FunTime и может хотя бы в общих чертах описать архитектуру их античита (без слива всего подчистую), буду благодарен за любые наводки. Сейчас это выглядит как типичный кейс “новый античит натянули поверх старого, а поведение стало непредсказуемым”.

Логи/дампы движений могу закинуть в ЛС, если кто-то реально хочет поразбираться, а не просто написать “играй без софта”.
 
Народ, кто ковырялся в античите FunTime, нужна адекватная точка зрения, а то уже не понимаю, это я тупой или они реально накрутили какую-то Franken-систему поверх старого говнокода.

Речь про FunTime (MC-сервер, их кастомный античит на движке плагинов, но часть логики явно вынесена в отдельный модуль/серверную часть). Я сел поковырять их проверки на движение/комбат, потому что поведение античита иногда вообще нелогичное: один и тот же скрипт/клиент ведёт себя по-разному на разных сессиях.

Что именно делал: лез в трафик между клиентом и сервером через сниффер, отслеживал, как сервер реагирует на пачки `position / look / attack` пакетов. Пытался понять, где именно срабатывает античит: сервер сначала просто флагает (резкие “откаты” назад), потом добавляет “резиновость” движения, и только после нескольких одинаковых паттернов уже кикает/банит. По ощущениям, у них несколько уровней проверок, и они не всегда срабатывают в одном и том же порядке.

Что заметил по поведению:

- На чистом клиенте одни и те же действия (спринт + стрейф + прыжки) иногда вообще не триггерят античит, а иногда ловишь микро-откат в одно и то же место. Такое ощущение, будто часть проверок идёт по старому модулю, часть по новому, и какой из них сработает — зависит от нагрузки или очереди обработки.
- Прогонял записанный дамп (одинаковая последовательность пакетов) через реиграв: один раз сервер просто игнорит, второй раз уже флагует как подозрительное движение. Либо у них какой-то stateful-анализ с накоплением статистики, либо реально работают два разных обработчика параллельно.
- По логике очень похоже, что старые проверки (условный “legacy-античит” в плагинах) всё ещё живут на сервере, а сверху навешан новый модуль, который тоже лезет в те же данные. В итоге на одни и те же действия реакция идёт то от старого блока, то от нового. Такое чувство, что FunTime выкатывали обнову античита поэтапно, часть проверок дописали, а старое не до конца выпилили, и теперь оно в некоторых сценариях пересекается.

Что уже пробовал:

менял паттерны движения/комбата, пытался подвести под “границу” срабатывания — порог триггера одной и той же последовательности пакетов плавает. Игрался с задержками между пакетами (искусственный ping и jitter): при ровном пинге иногда вообще тишина, при лёгком рандомном джиттере триггер получается воспроизводить стабильнее. Плюс смотрел, не завязан ли античит на время сессии / количество действий — есть ощущение, что система “прогревается” и начинает агрессивнее реагировать ближе к середине игры.

Для дебага движения на своей стороне набросал такой черновой код (условно логер движения, чтобы потом сравнивать с моментами, когда сервер начинает “кусаться”):

Код:
Expand Collapse Copy
struct Vec3 {
    double x, y, z;
};

struct MoveSample {
    Vec3    pos;
    double  serverTime;
    double  speed;
};

std::vector<MoveSample> g_samples;

void log_move(const Vec3& prev, const Vec3& cur, double serverTime) {
    double dx = cur.x - prev.x;
    double dy = cur.y - prev.y;
    double dz = cur.z - prev.z;

    double dist = std::sqrt(dx * dx + dy * dy + dz * dz);
    double dt   = std::max(0.0001, serverTime - (g_samples.empty() ? serverTime : g_samples.back().serverTime));

    MoveSample s;
    s.pos        = cur;
    s.serverTime = serverTime;
    s.speed      = dist / dt;

    g_samples.push_back(s);
}

// Деобфусцированный код для поиска "подозрительных" скачков скорости относительно предыдущих значений
std::vector<MoveSample> find_suspicious(double maxLegitSpeed, double spikeFactor) {
    std::vector<MoveSample> out;
    for (size_t i = 1; i < g_samples.size(); ++i) {
        double v_prev = g_samples[i - 1].speed;
        double v_cur  = g_samples[i].speed;

        if (v_cur > maxLegitSpeed && v_prev > 0.0 && (v_cur / v_prev) > spikeFactor) {
            out.push_back(g_samples[i]);
        }
    }
    return out;
}

Смысл в том, чтобы логировать то, как выглядит движение “глазами сервера” (позиция + время), считать фактическую скорость и искать аномальные скачки, а потом сравнивать эти моменты с тем, когда FunTime начинает откатывать/лагать/кикать.

Собственно вопросы к тем, кто плотно ковырял FunTime и их античит:

1. У них реально гибридный античит (старый + новый модуль), или я просто не туда смотрю?
2. Есть ли подтверждённая инфа, что часть проверок до сих пор держится на старых плагинах/конфиге, а сверху докручен отдельный “античит-сервис”?
3. Замечали нестабильное поведение: один и тот же клиент/паттерн то спокойно проходит, то ловит флаг без каких-либо изменений?
4. Куда логичнее копать дальше: в сторону анализа серверных тиков и очередей обработки пакетов или в сторону какого-то накопительного профиля игрока (античит, который “усиливает” проверки по ходу сессии)?

Если кто-то уже делал реверс именно FunTime и может хотя бы в общих чертах описать архитектуру их античита (без слива всего подчистую), буду благодарен за любые наводки. Сейчас это выглядит как типичный кейс “новый античит натянули поверх старого, а поведение стало непредсказуемым”.

Логи/дампы движений могу закинуть в ЛС, если кто-то реально хочет поразбираться, а не просто написать “играй без софта”.
/del
 
Слушай, ты максимально точно подметил саму суть этого франкенштейна. Те, кто хоть немного декомпилил их последние версии, прекрасно понимают, о чём ты говоришь. Ты не «тупой», ты просто наткнулся на классическую проблему легаси-проектов, которые пытаются «залатать» современными решениями без рефакторинга базы.

Коротко по твоим вопросам, основываясь на том, что там происходит под капотом:

1. Гибрид или нет?​

Да, это чистокровный гибрид. У них сейчас реально работает «бутерброд». Старое ядро (Legacy) всё ещё занимается первичной фильтрацией и примитивной сверкой координат (на уровне обычного Bukkit-плагина), а сверху, в отдельном потоке (или даже на уровне прослойки между Netty и игровым логическим циклом), висит тот самый новый «модуль».

2. Почему проверки конфликтуют?​

Ты абсолютно прав насчёт «натянули поверх». Старая система не знает про состояние новой, и наоборот. Они не делят единый контекст игрока.

  • Конфликт: Старый плагин может триггернуться на какое-то микро-смещение, которое новый модуль по своим эвристикам считает «допустимым джиттером». В итоге сервер делает откат, новый модуль видит, что игрока «телепортнуло» (из-за отката старого модуля), и начинает подозревать тебя в читерстве уже на своей стороне. Это и создает тот самый эффект, когда ты чист, но всё равно ловишь «резиновость».

3. Про «прогрев» и нестабильность​

Тут дело не столько в «прогреве», сколько в буферизации и динамических порогах.

  • Они используют накопительный анализ (назовем это Violation Level или VL). У них есть очередь пакетов, и когда ты создаешь джиттер (как ты заметил, он стабильнее триггерит античит), ты заполняешь буфер обработки.
  • Когда очередь переполняется или возникает микро-лаг на стороне сервера (обработка тика затягивается), античит начинает «нервничать» и задирает планку чувствительности. В итоге одна и та же последовательность пакетов в «спокойный» момент проходит, а в момент нагрузки на сервер (когда твой джиттер накладывается на лаг сервера) — летит флаг.

4. Куда копать?​

Не трать время на попытки выровнять паттерны под «идеальный» проход.

  • Серверные тики — это ключ. Твой код для логирования — тема, но попробуй добавить в структуру MoveSample ещё и tickDelta или processingDelay (время от получения пакета сервером до момента ответа). Ты увидишь, что флагает именно тогда, когда processingDelay начинает плавать.
  • Stateful-анализ: У них явно есть что-то вроде локального скоринга для игрока. Если ты хочешь дальше реверсить, смотри не на сами пакеты, а на то, как их система хранит состояние (состояние движения, последнее время атаки, историю «валидности» пакетов).
Совет: Забей на попытки воспроизвести идеальный паттерн. С таким античитом единственный путь — эмулировать поведение «неидеального» игрока с плавающим (но естественным) распределением пакетов, чтобы не попадать под их фильтры резких скачков скорости. Они буквально превратили борьбу с софтом в попытку предсказать хаос, но сами же стали жертвами этого хаоса из-за кривого наследования.

Если будешь дальше ковырять дампы, обрати внимание, как они обрабатывают ClientLook при прыжках — там обычно самая «грязная» часть их кода, где старые и новые методы пересекаются чаще всего. Удачи в дебаге, зрелище там действительно специфическое.
 
Народ, кто ковырялся в античите FunTime, нужна адекватная точка зрения, а то уже не понимаю, это я тупой или они реально накрутили какую-то Franken-систему поверх старого говнокода.

Речь про FunTime (MC-сервер, их кастомный античит на движке плагинов, но часть логики явно вынесена в отдельный модуль/серверную часть). Я сел поковырять их проверки на движение/комбат, потому что поведение античита иногда вообще нелогичное: один и тот же скрипт/клиент ведёт себя по-разному на разных сессиях.

Что именно делал: лез в трафик между клиентом и сервером через сниффер, отслеживал, как сервер реагирует на пачки `position / look / attack` пакетов. Пытался понять, где именно срабатывает античит: сервер сначала просто флагает (резкие “откаты” назад), потом добавляет “резиновость” движения, и только после нескольких одинаковых паттернов уже кикает/банит. По ощущениям, у них несколько уровней проверок, и они не всегда срабатывают в одном и том же порядке.

Что заметил по поведению:

- На чистом клиенте одни и те же действия (спринт + стрейф + прыжки) иногда вообще не триггерят античит, а иногда ловишь микро-откат в одно и то же место. Такое ощущение, будто часть проверок идёт по старому модулю, часть по новому, и какой из них сработает — зависит от нагрузки или очереди обработки.
- Прогонял записанный дамп (одинаковая последовательность пакетов) через реиграв: один раз сервер просто игнорит, второй раз уже флагует как подозрительное движение. Либо у них какой-то stateful-анализ с накоплением статистики, либо реально работают два разных обработчика параллельно.
- По логике очень похоже, что старые проверки (условный “legacy-античит” в плагинах) всё ещё живут на сервере, а сверху навешан новый модуль, который тоже лезет в те же данные. В итоге на одни и те же действия реакция идёт то от старого блока, то от нового. Такое чувство, что FunTime выкатывали обнову античита поэтапно, часть проверок дописали, а старое не до конца выпилили, и теперь оно в некоторых сценариях пересекается.

Что уже пробовал:

менял паттерны движения/комбата, пытался подвести под “границу” срабатывания — порог триггера одной и той же последовательности пакетов плавает. Игрался с задержками между пакетами (искусственный ping и jitter): при ровном пинге иногда вообще тишина, при лёгком рандомном джиттере триггер получается воспроизводить стабильнее. Плюс смотрел, не завязан ли античит на время сессии / количество действий — есть ощущение, что система “прогревается” и начинает агрессивнее реагировать ближе к середине игры.

Для дебага движения на своей стороне набросал такой черновой код (условно логер движения, чтобы потом сравнивать с моментами, когда сервер начинает “кусаться”):

Код:
Expand Collapse Copy
struct Vec3 {
    double x, y, z;
};

struct MoveSample {
    Vec3    pos;
    double  serverTime;
    double  speed;
};

std::vector<MoveSample> g_samples;

void log_move(const Vec3& prev, const Vec3& cur, double serverTime) {
    double dx = cur.x - prev.x;
    double dy = cur.y - prev.y;
    double dz = cur.z - prev.z;

    double dist = std::sqrt(dx * dx + dy * dy + dz * dz);
    double dt   = std::max(0.0001, serverTime - (g_samples.empty() ? serverTime : g_samples.back().serverTime));

    MoveSample s;
    s.pos        = cur;
    s.serverTime = serverTime;
    s.speed      = dist / dt;

    g_samples.push_back(s);
}

// Деобфусцированный код для поиска "подозрительных" скачков скорости относительно предыдущих значений
std::vector<MoveSample> find_suspicious(double maxLegitSpeed, double spikeFactor) {
    std::vector<MoveSample> out;
    for (size_t i = 1; i < g_samples.size(); ++i) {
        double v_prev = g_samples[i - 1].speed;
        double v_cur  = g_samples[i].speed;

        if (v_cur > maxLegitSpeed && v_prev > 0.0 && (v_cur / v_prev) > spikeFactor) {
            out.push_back(g_samples[i]);
        }
    }
    return out;
}

Смысл в том, чтобы логировать то, как выглядит движение “глазами сервера” (позиция + время), считать фактическую скорость и искать аномальные скачки, а потом сравнивать эти моменты с тем, когда FunTime начинает откатывать/лагать/кикать.

Собственно вопросы к тем, кто плотно ковырял FunTime и их античит:

1. У них реально гибридный античит (старый + новый модуль), или я просто не туда смотрю?
2. Есть ли подтверждённая инфа, что часть проверок до сих пор держится на старых плагинах/конфиге, а сверху докручен отдельный “античит-сервис”?
3. Замечали нестабильное поведение: один и тот же клиент/паттерн то спокойно проходит, то ловит флаг без каких-либо изменений?
4. Куда логичнее копать дальше: в сторону анализа серверных тиков и очередей обработки пакетов или в сторону какого-то накопительного профиля игрока (античит, который “усиливает” проверки по ходу сессии)?

Если кто-то уже делал реверс именно FunTime и может хотя бы в общих чертах описать архитектуру их античита (без слива всего подчистую), буду благодарен за любые наводки. Сейчас это выглядит как типичный кейс “новый античит натянули поверх старого, а поведение стало непредсказуемым”.

Логи/дампы движений могу закинуть в ЛС, если кто-то реально хочет поразбираться, а не просто написать “играй без софта”.
Тебе бы read only не помешал
 
Народ, кто ковырялся в античите FunTime, нужна адекватная точка зрения, а то уже не понимаю, это я тупой или они реально накрутили какую-то Franken-систему поверх старого говнокода.

Речь про FunTime (MC-сервер, их кастомный античит на движке плагинов, но часть логики явно вынесена в отдельный модуль/серверную часть). Я сел поковырять их проверки на движение/комбат, потому что поведение античита иногда вообще нелогичное: один и тот же скрипт/клиент ведёт себя по-разному на разных сессиях.

Что именно делал: лез в трафик между клиентом и сервером через сниффер, отслеживал, как сервер реагирует на пачки `position / look / attack` пакетов. Пытался понять, где именно срабатывает античит: сервер сначала просто флагает (резкие “откаты” назад), потом добавляет “резиновость” движения, и только после нескольких одинаковых паттернов уже кикает/банит. По ощущениям, у них несколько уровней проверок, и они не всегда срабатывают в одном и том же порядке.

Что заметил по поведению:

- На чистом клиенте одни и те же действия (спринт + стрейф + прыжки) иногда вообще не триггерят античит, а иногда ловишь микро-откат в одно и то же место. Такое ощущение, будто часть проверок идёт по старому модулю, часть по новому, и какой из них сработает — зависит от нагрузки или очереди обработки.
- Прогонял записанный дамп (одинаковая последовательность пакетов) через реиграв: один раз сервер просто игнорит, второй раз уже флагует как подозрительное движение. Либо у них какой-то stateful-анализ с накоплением статистики, либо реально работают два разных обработчика параллельно.
- По логике очень похоже, что старые проверки (условный “legacy-античит” в плагинах) всё ещё живут на сервере, а сверху навешан новый модуль, который тоже лезет в те же данные. В итоге на одни и те же действия реакция идёт то от старого блока, то от нового. Такое чувство, что FunTime выкатывали обнову античита поэтапно, часть проверок дописали, а старое не до конца выпилили, и теперь оно в некоторых сценариях пересекается.

Что уже пробовал:

менял паттерны движения/комбата, пытался подвести под “границу” срабатывания — порог триггера одной и той же последовательности пакетов плавает. Игрался с задержками между пакетами (искусственный ping и jitter): при ровном пинге иногда вообще тишина, при лёгком рандомном джиттере триггер получается воспроизводить стабильнее. Плюс смотрел, не завязан ли античит на время сессии / количество действий — есть ощущение, что система “прогревается” и начинает агрессивнее реагировать ближе к середине игры.

Для дебага движения на своей стороне набросал такой черновой код (условно логер движения, чтобы потом сравнивать с моментами, когда сервер начинает “кусаться”):

Код:
Expand Collapse Copy
struct Vec3 {
    double x, y, z;
};

struct MoveSample {
    Vec3    pos;
    double  serverTime;
    double  speed;
};

std::vector<MoveSample> g_samples;

void log_move(const Vec3& prev, const Vec3& cur, double serverTime) {
    double dx = cur.x - prev.x;
    double dy = cur.y - prev.y;
    double dz = cur.z - prev.z;

    double dist = std::sqrt(dx * dx + dy * dy + dz * dz);
    double dt   = std::max(0.0001, serverTime - (g_samples.empty() ? serverTime : g_samples.back().serverTime));

    MoveSample s;
    s.pos        = cur;
    s.serverTime = serverTime;
    s.speed      = dist / dt;

    g_samples.push_back(s);
}

// Деобфусцированный код для поиска "подозрительных" скачков скорости относительно предыдущих значений
std::vector<MoveSample> find_suspicious(double maxLegitSpeed, double spikeFactor) {
    std::vector<MoveSample> out;
    for (size_t i = 1; i < g_samples.size(); ++i) {
        double v_prev = g_samples[i - 1].speed;
        double v_cur  = g_samples[i].speed;

        if (v_cur > maxLegitSpeed && v_prev > 0.0 && (v_cur / v_prev) > spikeFactor) {
            out.push_back(g_samples[i]);
        }
    }
    return out;
}

Смысл в том, чтобы логировать то, как выглядит движение “глазами сервера” (позиция + время), считать фактическую скорость и искать аномальные скачки, а потом сравнивать эти моменты с тем, когда FunTime начинает откатывать/лагать/кикать.

Собственно вопросы к тем, кто плотно ковырял FunTime и их античит:

1. У них реально гибридный античит (старый + новый модуль), или я просто не туда смотрю?
2. Есть ли подтверждённая инфа, что часть проверок до сих пор держится на старых плагинах/конфиге, а сверху докручен отдельный “античит-сервис”?
3. Замечали нестабильное поведение: один и тот же клиент/паттерн то спокойно проходит, то ловит флаг без каких-либо изменений?
4. Куда логичнее копать дальше: в сторону анализа серверных тиков и очередей обработки пакетов или в сторону какого-то накопительного профиля игрока (античит, который “усиливает” проверки по ходу сессии)?

Если кто-то уже делал реверс именно FunTime и может хотя бы в общих чертах описать архитектуру их античита (без слива всего подчистую), буду благодарен за любые наводки. Сейчас это выглядит как типичный кейс “новый античит натянули поверх старого, а поведение стало непредсказуемым”.

Логи/дампы движений могу закинуть в ЛС, если кто-то реально хочет поразбираться, а не просто написать “играй без софта”.
ты хочеш сделать флай под фт или что?
 
Слушай, ты максимально точно подметил саму суть этого франкенштейна. Те, кто хоть немного декомпилил их последние версии, прекрасно понимают, о чём ты говоришь. Ты не «тупой», ты просто наткнулся на классическую проблему легаси-проектов, которые пытаются «залатать» современными решениями без рефакторинга базы.

Коротко по твоим вопросам, основываясь на том, что там происходит под капотом:

1. Гибрид или нет?​

Да, это чистокровный гибрид. У них сейчас реально работает «бутерброд». Старое ядро (Legacy) всё ещё занимается первичной фильтрацией и примитивной сверкой координат (на уровне обычного Bukkit-плагина), а сверху, в отдельном потоке (или даже на уровне прослойки между Netty и игровым логическим циклом), висит тот самый новый «модуль».

2. Почему проверки конфликтуют?​

Ты абсолютно прав насчёт «натянули поверх». Старая система не знает про состояние новой, и наоборот. Они не делят единый контекст игрока.

  • Конфликт: Старый плагин может триггернуться на какое-то микро-смещение, которое новый модуль по своим эвристикам считает «допустимым джиттером». В итоге сервер делает откат, новый модуль видит, что игрока «телепортнуло» (из-за отката старого модуля), и начинает подозревать тебя в читерстве уже на своей стороне. Это и создает тот самый эффект, когда ты чист, но всё равно ловишь «резиновость».

3. Про «прогрев» и нестабильность​

Тут дело не столько в «прогреве», сколько в буферизации и динамических порогах.

  • Они используют накопительный анализ (назовем это Violation Level или VL). У них есть очередь пакетов, и когда ты создаешь джиттер (как ты заметил, он стабильнее триггерит античит), ты заполняешь буфер обработки.
  • Когда очередь переполняется или возникает микро-лаг на стороне сервера (обработка тика затягивается), античит начинает «нервничать» и задирает планку чувствительности. В итоге одна и та же последовательность пакетов в «спокойный» момент проходит, а в момент нагрузки на сервер (когда твой джиттер накладывается на лаг сервера) — летит флаг.

4. Куда копать?​

Не трать время на попытки выровнять паттерны под «идеальный» проход.

  • Серверные тики — это ключ. Твой код для логирования — тема, но попробуй добавить в структуру MoveSample ещё и tickDelta или processingDelay (время от получения пакета сервером до момента ответа). Ты увидишь, что флагает именно тогда, когда processingDelay начинает плавать.
  • Stateful-анализ: У них явно есть что-то вроде локального скоринга для игрока. Если ты хочешь дальше реверсить, смотри не на сами пакеты, а на то, как их система хранит состояние (состояние движения, последнее время атаки, историю «валидности» пакетов).
Совет: Забей на попытки воспроизвести идеальный паттерн. С таким античитом единственный путь — эмулировать поведение «неидеального» игрока с плавающим (но естественным) распределением пакетов, чтобы не попадать под их фильтры резких скачков скорости. Они буквально превратили борьбу с софтом в попытку предсказать хаос, но сами же стали жертвами этого хаоса из-за кривого наследования.

Если будешь дальше ковырять дампы, обрати внимание, как они обрабатывают ClientLook при прыжках — там обычно самая «грязная» часть их кода, где старые и новые методы пересекаются чаще всего. Удачи в дебаге, зрелище там действительно специфическое.
Ну ты и поц
 
Народ, кто ковырялся в античите FunTime, нужна адекватная точка зрения, а то уже не понимаю, это я тупой или они реально накрутили какую-то Franken-систему поверх старого говнокода.

Речь про FunTime (MC-сервер, их кастомный античит на движке плагинов, но часть логики явно вынесена в отдельный модуль/серверную часть). Я сел поковырять их проверки на движение/комбат, потому что поведение античита иногда вообще нелогичное: один и тот же скрипт/клиент ведёт себя по-разному на разных сессиях.

Что именно делал: лез в трафик между клиентом и сервером через сниффер, отслеживал, как сервер реагирует на пачки `position / look / attack` пакетов. Пытался понять, где именно срабатывает античит: сервер сначала просто флагает (резкие “откаты” назад), потом добавляет “резиновость” движения, и только после нескольких одинаковых паттернов уже кикает/банит. По ощущениям, у них несколько уровней проверок, и они не всегда срабатывают в одном и том же порядке.

Что заметил по поведению:

- На чистом клиенте одни и те же действия (спринт + стрейф + прыжки) иногда вообще не триггерят античит, а иногда ловишь микро-откат в одно и то же место. Такое ощущение, будто часть проверок идёт по старому модулю, часть по новому, и какой из них сработает — зависит от нагрузки или очереди обработки.
- Прогонял записанный дамп (одинаковая последовательность пакетов) через реиграв: один раз сервер просто игнорит, второй раз уже флагует как подозрительное движение. Либо у них какой-то stateful-анализ с накоплением статистики, либо реально работают два разных обработчика параллельно.
- По логике очень похоже, что старые проверки (условный “legacy-античит” в плагинах) всё ещё живут на сервере, а сверху навешан новый модуль, который тоже лезет в те же данные. В итоге на одни и те же действия реакция идёт то от старого блока, то от нового. Такое чувство, что FunTime выкатывали обнову античита поэтапно, часть проверок дописали, а старое не до конца выпилили, и теперь оно в некоторых сценариях пересекается.

Что уже пробовал:

менял паттерны движения/комбата, пытался подвести под “границу” срабатывания — порог триггера одной и той же последовательности пакетов плавает. Игрался с задержками между пакетами (искусственный ping и jitter): при ровном пинге иногда вообще тишина, при лёгком рандомном джиттере триггер получается воспроизводить стабильнее. Плюс смотрел, не завязан ли античит на время сессии / количество действий — есть ощущение, что система “прогревается” и начинает агрессивнее реагировать ближе к середине игры.

Для дебага движения на своей стороне набросал такой черновой код (условно логер движения, чтобы потом сравнивать с моментами, когда сервер начинает “кусаться”):

Код:
Expand Collapse Copy
struct Vec3 {
    double x, y, z;
};

struct MoveSample {
    Vec3    pos;
    double  serverTime;
    double  speed;
};

std::vector<MoveSample> g_samples;

void log_move(const Vec3& prev, const Vec3& cur, double serverTime) {
    double dx = cur.x - prev.x;
    double dy = cur.y - prev.y;
    double dz = cur.z - prev.z;

    double dist = std::sqrt(dx * dx + dy * dy + dz * dz);
    double dt   = std::max(0.0001, serverTime - (g_samples.empty() ? serverTime : g_samples.back().serverTime));

    MoveSample s;
    s.pos        = cur;
    s.serverTime = serverTime;
    s.speed      = dist / dt;

    g_samples.push_back(s);
}

// Деобфусцированный код для поиска "подозрительных" скачков скорости относительно предыдущих значений
std::vector<MoveSample> find_suspicious(double maxLegitSpeed, double spikeFactor) {
    std::vector<MoveSample> out;
    for (size_t i = 1; i < g_samples.size(); ++i) {
        double v_prev = g_samples[i - 1].speed;
        double v_cur  = g_samples[i].speed;

        if (v_cur > maxLegitSpeed && v_prev > 0.0 && (v_cur / v_prev) > spikeFactor) {
            out.push_back(g_samples[i]);
        }
    }
    return out;
}

Смысл в том, чтобы логировать то, как выглядит движение “глазами сервера” (позиция + время), считать фактическую скорость и искать аномальные скачки, а потом сравнивать эти моменты с тем, когда FunTime начинает откатывать/лагать/кикать.

Собственно вопросы к тем, кто плотно ковырял FunTime и их античит:

1. У них реально гибридный античит (старый + новый модуль), или я просто не туда смотрю?
2. Есть ли подтверждённая инфа, что часть проверок до сих пор держится на старых плагинах/конфиге, а сверху докручен отдельный “античит-сервис”?
3. Замечали нестабильное поведение: один и тот же клиент/паттерн то спокойно проходит, то ловит флаг без каких-либо изменений?
4. Куда логичнее копать дальше: в сторону анализа серверных тиков и очередей обработки пакетов или в сторону какого-то накопительного профиля игрока (античит, который “усиливает” проверки по ходу сессии)?

Если кто-то уже делал реверс именно FunTime и может хотя бы в общих чертах описать архитектуру их античита (без слива всего подчистую), буду благодарен за любые наводки. Сейчас это выглядит как типичный кейс “новый античит натянули поверх старого, а поведение стало непредсказуемым”.

Логи/дампы движений могу закинуть в ЛС, если кто-то реально хочет поразбираться, а не просто написать “играй без софта”.
второй @hex_cat
 
Народ, кто ковырялся в античите FunTime, нужна адекватная точка зрения, а то уже не понимаю, это я тупой или они реально накрутили какую-то Franken-систему поверх старого говнокода.

Речь про FunTime (MC-сервер, их кастомный античит на движке плагинов, но часть логики явно вынесена в отдельный модуль/серверную часть). Я сел поковырять их проверки на движение/комбат, потому что поведение античита иногда вообще нелогичное: один и тот же скрипт/клиент ведёт себя по-разному на разных сессиях.

Что именно делал: лез в трафик между клиентом и сервером через сниффер, отслеживал, как сервер реагирует на пачки `position / look / attack` пакетов. Пытался понять, где именно срабатывает античит: сервер сначала просто флагает (резкие “откаты” назад), потом добавляет “резиновость” движения, и только после нескольких одинаковых паттернов уже кикает/банит. По ощущениям, у них несколько уровней проверок, и они не всегда срабатывают в одном и том же порядке.

Что заметил по поведению:

- На чистом клиенте одни и те же действия (спринт + стрейф + прыжки) иногда вообще не триггерят античит, а иногда ловишь микро-откат в одно и то же место. Такое ощущение, будто часть проверок идёт по старому модулю, часть по новому, и какой из них сработает — зависит от нагрузки или очереди обработки.
- Прогонял записанный дамп (одинаковая последовательность пакетов) через реиграв: один раз сервер просто игнорит, второй раз уже флагует как подозрительное движение. Либо у них какой-то stateful-анализ с накоплением статистики, либо реально работают два разных обработчика параллельно.
- По логике очень похоже, что старые проверки (условный “legacy-античит” в плагинах) всё ещё живут на сервере, а сверху навешан новый модуль, который тоже лезет в те же данные. В итоге на одни и те же действия реакция идёт то от старого блока, то от нового. Такое чувство, что FunTime выкатывали обнову античита поэтапно, часть проверок дописали, а старое не до конца выпилили, и теперь оно в некоторых сценариях пересекается.

Что уже пробовал:

менял паттерны движения/комбата, пытался подвести под “границу” срабатывания — порог триггера одной и той же последовательности пакетов плавает. Игрался с задержками между пакетами (искусственный ping и jitter): при ровном пинге иногда вообще тишина, при лёгком рандомном джиттере триггер получается воспроизводить стабильнее. Плюс смотрел, не завязан ли античит на время сессии / количество действий — есть ощущение, что система “прогревается” и начинает агрессивнее реагировать ближе к середине игры.

Для дебага движения на своей стороне набросал такой черновой код (условно логер движения, чтобы потом сравнивать с моментами, когда сервер начинает “кусаться”):

Код:
Expand Collapse Copy
struct Vec3 {
    double x, y, z;
};

struct MoveSample {
    Vec3    pos;
    double  serverTime;
    double  speed;
};

std::vector<MoveSample> g_samples;

void log_move(const Vec3& prev, const Vec3& cur, double serverTime) {
    double dx = cur.x - prev.x;
    double dy = cur.y - prev.y;
    double dz = cur.z - prev.z;

    double dist = std::sqrt(dx * dx + dy * dy + dz * dz);
    double dt   = std::max(0.0001, serverTime - (g_samples.empty() ? serverTime : g_samples.back().serverTime));

    MoveSample s;
    s.pos        = cur;
    s.serverTime = serverTime;
    s.speed      = dist / dt;

    g_samples.push_back(s);
}

// Деобфусцированный код для поиска "подозрительных" скачков скорости относительно предыдущих значений
std::vector<MoveSample> find_suspicious(double maxLegitSpeed, double spikeFactor) {
    std::vector<MoveSample> out;
    for (size_t i = 1; i < g_samples.size(); ++i) {
        double v_prev = g_samples[i - 1].speed;
        double v_cur  = g_samples[i].speed;

        if (v_cur > maxLegitSpeed && v_prev > 0.0 && (v_cur / v_prev) > spikeFactor) {
            out.push_back(g_samples[i]);
        }
    }
    return out;
}

Смысл в том, чтобы логировать то, как выглядит движение “глазами сервера” (позиция + время), считать фактическую скорость и искать аномальные скачки, а потом сравнивать эти моменты с тем, когда FunTime начинает откатывать/лагать/кикать.

Собственно вопросы к тем, кто плотно ковырял FunTime и их античит:

1. У них реально гибридный античит (старый + новый модуль), или я просто не туда смотрю?
2. Есть ли подтверждённая инфа, что часть проверок до сих пор держится на старых плагинах/конфиге, а сверху докручен отдельный “античит-сервис”?
3. Замечали нестабильное поведение: один и тот же клиент/паттерн то спокойно проходит, то ловит флаг без каких-либо изменений?
4. Куда логичнее копать дальше: в сторону анализа серверных тиков и очередей обработки пакетов или в сторону какого-то накопительного профиля игрока (античит, который “усиливает” проверки по ходу сессии)?

Если кто-то уже делал реверс именно FunTime и может хотя бы в общих чертах описать архитектуру их античита (без слива всего подчистую), буду благодарен за любые наводки. Сейчас это выглядит как типичный кейс “новый античит натянули поверх старого, а поведение стало непредсказуемым”.

Логи/дампы движений могу закинуть в ЛС, если кто-то реально хочет поразбираться, а не просто написать “играй без софта”.
начнем с того откуда у тебя античит фантайма?
 
начнем с того откуда у тебя античит фантайма?
Начнём с того, что античит как таковой мне и не нужен, я его не “достаю” ниоткуда. Я реверсю поведение сервера по факту, а не таскаю их бинарники из-под стола.

Я же в теме сразу писал, что копаю:
  • сетевой трафик (сниффер, реиграв записанных пакетов);
  • реакцию сервера на разные паттерны движения/комбата;
  • косвенные признаки работы античита: откаты, резина, кики.
Всё, что у меня есть — это логика “чёрного ящика”: что отправил клиент → как ответил сервер → в какой момент он начинает считать тебя подозрительным. Никаких “слитых античитов фантайма”, приваток и т.п. у меня нет и не было, я как раз пытаюсь понять, как оно устроено по факту, а не откуда-то его достать.
 
Начнём с того, что античит как таковой мне и не нужен, я его не “достаю” ниоткуда. Я реверсю поведение сервера по факту, а не таскаю их бинарники из-под стола.

Я же в теме сразу писал, что копаю:
  • сетевой трафик (сниффер, реиграв записанных пакетов);
  • реакцию сервера на разные паттерны движения/комбата;
  • косвенные признаки работы античита: откаты, резина, кики.
Всё, что у меня есть — это логика “чёрного ящика”: что отправил клиент → как ответил сервер → в какой момент он начинает считать тебя подозрительным. Никаких “слитых античитов фантайма”, приваток и т.п. у меня нет и не было, я как раз пытаюсь понять, как оно устроено по факту, а не откуда-то его достать.
что ты еще реверсюш
 
Назад
Сверху Снизу