Saltfire
Постоялец-
Публикаций
642 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Saltfire стал победителем дня 8 мая
Saltfire имел наиболее популярный контент!
Репутация
104Информация о Saltfire
-
Звание
Построил домик
Посетители профиля
Блок последних пользователей отключён и не показывается другим пользователям.
-
Короче, пацаны, давайте снимем розовые очки. Защищать клиент - это диагноз. Всё, что крутится на стороне игрока, априори принадлежит реверсеру с Ring 0 драйвером наперевес. Обфускация, протекторы, античиты - это просто ширма для самоуспокоения админов. Единственный путь к тотальному контролю - жесткий, авторитарный серверный бэкенд. Но главная боль даже не в читах, а в том, какое беспросветное говно скрывается под капотом самой Линейки. Неважно, Java-эмули это или оригинальный C++ PTS — архитектура там родом из каменного века, написанная через колено. Этот легаси-код годами передавался по кругу как переходящее знамя: корейцы навелосипедили, приватные команды отреверсили, Вася-кодер допилил костыль, Петя-админ прикрутил заплатку поверх заплатки. В итоге мы имеем циклический ад из спагетти-кода. В чём главный технический зашквар архитектуры L2? Тотальный оверлоадинг памяти: Эта дичь при старте тупо выкачивает всю БД в ОЗУ. Квесты, которые никто никогда не пройдет, итемы, которые никто не выбьет, весь спавн и гигабайты геодаты - всё это мертвым грузом висит в памяти. Никакого Lazy Loading (ленивой загрузки), никакого динамического кэширования. Сервер жрет гигабайты оперативки просто потому, что архитекторы начала 2000-х не слышали про оптимизацию пулов. Сломанный сетевой код движения: Движок движения - это вообще клиника. Клиент шлет пакет MoveToLocation, и сервер ему слепо верит, пытаясь догнать чара в своем потоке. Отсюда все эти клик-хаки, телепорты на гео-дате, полеты и пакетные прыжки. А если ты попытаешься закрутить гайки и жестко валидировать координаты на сервере - легитные игроки при малейшем пинге превращаются в резиновых мячиков из-за корявого тикрейта. Адская связанность: Там нарушены вообще все принципы SOLID. Класс на классе, синглтон на синглтоне. Логика квеста намертво завязана на пакетную часть, расчет урона переплетен с инвентарем. Ты меняешь копеечный конфиг в одном месте - и у тебя раком встает движок Олимпиады или спавн эпиков, потому что код связан как узлы на морском канате. Как должен выглядеть нормальный, здоровый бэкенд L2? Если мы хотим спать спокойно, старый монолит надо не латать, а пускать под нож и переписывать по канонам современного Highload-бэкенда: Дата-центричный подход: Чар зашел в игру - только тогда его профиль, инвентарь и квесты поднимаются из БД. Чар вышел - всё в кэш или обратно в базу. Квестовые скрипты должны инициализироваться только тогда, когда первый бедолага на сервере вообще нажал на этот квест у NPC. Изоляция и Микросервисы: Логику мира надо дробить на независимые сервисы. Чат, Олимпиада, Рынок, Квесты - это не должно висеть в одном общем потоке ядра и ронять весь сервер при малейшем эксепшене. Серверный авторитаризм и ECS: Клиент - это просто тупой, слепой терминал для отрисовки полигонов. Он не имеет права голоса. Клиент шлет только намерения (клики), а сервер жестко считает вектор скорости, радиус легитного перемещения и делает рейкастинг (Raycast) луча видимости по геодате до того, как пропустить пакет. Потоковая фильтрация видимости: Если моб или враг находится за стеной или вне радиуса обзора - сервер вообще НЕ должен отправлять пакет CharInfo на клиент. Нет пакета в памяти процесса - никакие радары, ВХ и Ring 0 читы физически не смогут его отрисовать. Хватит тратить миллионы на защиту клиента и латание этого дырявого решета. Старый кодовый базис L2 безнадежен. Единственное рабочее решение - это тотальный серверный контроль, жесткий менеджмент памяти и архитектура нулевого доверия к тому, что прилетает из сети.
-
За ухом себе почеши. Уровень понимания 2000-х годов. Читай что такое DMA-карты и KVM. Ага и про моники читерские почитай!
-
Игра и античит работают на компьютере игрока. Тот, у кого есть физический доступ к железу и права администратора, всегда сможет расковырять память, снять дамп и обойти любой хук. Ваши защиты - это пустышки. Сверять хеши файлов - бесполезно, бот не трогает файлы клиента. А настройка защиты через config.xml без пересборки сервера, означает, что этот гвард отвязывается от процесса игры за пару минут. Всё остальное - просто мусорные свистелки вроде Ctrl+V и Discord RPC. Хваленые баны по HWID (железу) обходятся копеечными спуферами за секунды. Как только код игры расшифрован в памяти для процессора - он расшифрован и для создателя бота. Блокировка Adrenaline - миф. Все эти гварды банят только старый бесплатный софт. Платный, приватный Адреналин - это огромный бизнес. Его авторы выпускают обходы быстрее, чем античиты обновляют свои базы. Тадань... Админы покупают эти защиты только ради красивой плашки при запуске, чтобы успокоить наивных игроков. Защитить сервер от умного ботовода со стороны клиента технически невозможно.
-
Чувак, твой пост - это классический манифест дилетанта, который год изобретал велосипед в подвале и словил синдром Бога. Запомни базу: безопасность через неясность (Security through obscurity) не работает. Если твоя "непробиваемость" держится на том, что ты "не будешь писать, на чем она завязана", то грош ей цена. Погугли принцип Керкгоффса: надежная система остается безопасной, даже если противнику известен весь её алгоритм. Твой L2j — это Java. Она декомпилируется в читаемый исходный код тремя кликами в Bytecode Viewer или jadx. Любой реверсер средней руки вскроет твою "хитрую логику" за час, просто лениво листая код под пиво. Ты проверил защиту на себе и друзьях? Это не тест, это клоунада. Покажи софт парням, которые ломали SmartGuard и Strix. Они тебе за 15 минут объяснят, почему NCSoft за 20 лет не смогли сделать непробиваемый клиент, а Вася после года изучения мануалов - "смог". Спустись на землю, не позорься.
-
Чувак, твой пост - это классический манифест дилетанта, который год изобретал велосипед в подвале и словил синдром Бога. Запомни базу: безопасность через неясность (Security through obscurity) не работает. Если твоя "непробиваемость" держится на том, что ты "не будешь писать, на чем она завязана", то грош ей цена. Погугли принцип Керкгоффса: надежная система остается безопасной, даже если противнику известен весь её алгоритм. Твой L2j — это Java. Она декомпилируется в читаемый исходный код тремя кликами в Bytecode Viewer или jadx. Любой реверсер средней руки вскроет твою "хитрую логику" за час, просто лениво листая код под пиво. Ты проверил защиту на себе и друзьях? Это не тест, это клоунада. Покажи софт парням, которые ломали SmartGuard и Strix. Они тебе за 15 минут объяснят, почему NCSoft за 20 лет не смогли сделать непробиваемый клиент, а Вася после года изучения мануалов - "смог". Спустись на землю, не позорься.
-
Да бросьте, когда это было-то? Неужели ни у кого это до сих пор не реализовано в клиенте на серверах?
-
Автор чешит. https://acis.i-live.eu/index.php?topic=1974.0 https://gitlab.com/Tryskell/acis_public
- 3 ответа
-
- 1
-
-
Ты сам виноват. В следующий раз не плати авансы незнакомцам. Иди в банк и оспаривай платежи, если еще не поздно. А здесь никто твои проблемы решать не будет.
-
Еще однин, чудо, - юдо, некрофил. Под подушку себе положи - этот кусок говна.
-
Зачем и для чего ты возвращаешь темы к жизни!? Уходи! Некрик.
-
ШТА? Кого, что ты с нуля там начал? Не смеши мои тапочки.
-
Размеры коллайдера исправьте. Дагер не может быть таких размеров.
-
а к чему тогда остальное все там лежит?
-
Свойства-системы -> Переменные среды -> Системные переменные среды: Path <- дабл-клик, и в самый вверх списка, создай или подними если уже есть javapath адрес в среде. (видимо могут быть конфликты между сборками явы, ты можешь менять версии явы путем поднятия пути выше списком, чем предыдущий путь) Если нет, добавь: C:\Program Files\Common Files\Oracle\Java\javapath (измени на свой путь) Перезапусти комп.
-
А что ты сделал то? Как было все плохо, так и осталось. Как был распухший до боли Region с IBlock[] массивом который сжирает сотни и тысячи мегабайт, так и осталось. Теперь сравни с моим: private final ByteBuffer types; @Override public int getNearestZ(int x, int y, int z) { final int offset = getBlockOffset(x, y); final byte type = types.get(offset); return switch (type) { case FLAT -> readFlatZ(offset + 1); case COMPLEX -> readComplexZ(offset + 1, x, y, z); ////////.................. }; }
