Кто владеет информацией, тот владеет миром. (Натан Ротшильд)
Данный эксплойт не даёт преимущества нечестным путём в самой игре, он предоставляет информацию о самой игре, то что обычному игроку знать не положено.
Предисловие
Версия игры 1.12.2 ядро Paper
Псевдоанархия на сервере 2Tools2Builders (2b2t): почти любую нужную вещь в интернете можно купить в размере ~1728 (абсолютно одинаковых) для игры на сервере всего за 1~2$. Представьте, что центральный гектар в мире это пустота и случайно висящие блоки в ней: от кубов(1×1м) камня до разлитой магмы, воды и множества всякой фигни
Люди платят за вход без очереди 20-60 человек за 20$ в месяц, чтобы попасть на сервер, миру которого более 12 лет и весит более ~14 терабайт и один админ, оплачивающий расходы сервера, закрывающий некоторые читы и недовольных по самым разным причинам.
К нечестной игре отношение на сервере положительное, если оно не наносит вред серверу, в противном случае аннулирование приоритетной очереди и бан.
Главная идея
Когда игрок ударяет по блоку, игра логгирует тип блока, который ударили, наименование блока, его состав/тип(земля, золото, вода...) и находится ли в зоне прорисовки какого-то игрока.
В игре блоки объединены в зоны взаимодействия-чанки:р азмеры одного чанка — 16 блоков в ширину, 16 блоков в длину и ~384 блока в высоту (зависит от версии), что составляет 98 304 блока. При прогрузке новой области карты, генерируется и становится активным 441 чанк вокруг игрока, или больше, если была установлена дальность прорисовки свыше 10 чанков.
Бот (находясь на игровом сервере) может отправить запрос вне своей зоны прорисовки/прогрузки, получить информацию о блоке и узнать есть ли игрок в определённом чанке и если да, то локализовать зону местоположения игрока. Можно следить за игроками, что является классным стратегическим преимуществом.
Все передвижения игрока пишутся в треки. Трек в данном контексте это передвижение игрока с момента обнаружения до момента потери с радара.
Спиральный вид поиска
Клетки — чанки
Зеленые границы — зона блоков-"онлайн" для игрока и бота
"Bot"— центр спирали, не местоположение аккаунта бота
Красные цифры — радиусы чанков относительно игрока
Применение — общий поиск игроков
Поиск Монте-Карло (фильтр частиц)
Точное определение местоположения медленных игроков
Преследование определенных игроков
Поиск баз и часто-посещаемых мест
Кластерный метод поиска
Поиск баз
Оценка сторонней территории к принадлежности базы
-
Ссылка на проверку общего списка онлайн игроков
Определение конкретных игроков: Наблюдения подключений игрока к серверу позволяет установить кто принадлежит к определённым координатам спустя некоторое время.
Вездесущий контроль
Если бот следит за игроком, и тут он резко пропадает с "радара", но от сервера никто не отключился. Игрок решил сменить мир сервера: у игры есть миры.
Для того, чтобы не потерять игроков приходилось следить постоянно за Верхним миром и Нижним График в виде событий-проверок
Если игрок обнаружен и бегает в одних и тех же чанках на протяжении 90 минут бот начинает запрашивать части 9×9 из чанка вокруг игрока и искать атрибуты дома или хранилища.
Тепловая карта (след) "Нижнего" мира
-
Соотношение 1:1 пиксель-чанк, темнее пиксель - чаще посещают чанк
Темные точки как раз базы хранения различных вещей
Код создания картинки
public static void makeHeatmap(int radius) throws Exception {
Scanner scan = new Scanner(new File("/Users/leijurv/Downloads/heatmap_overworld_full.csv"));
// from -radius to +radius-1
BufferedImage output = new BufferedImage(radius * 2, radius * 2, BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = output.getRaster();
SampleModel model = raster.getSampleModel();
DataBuffer buffer = raster.getDataBuffer();
for (int x = 0; x < 2 * radius; x++) {
for (int y = 0; y < 2 * radius; y++) {
model.setSample(x, y, 0, 255, buffer);
}
}
int i = 0;
while (scan.hasNextLine()) {
if (++i % 1000000 == 0) {
System.out.println(i);
}
String line = scan.nextLine();
String[] split = line.split(",");
int chunkX = Integer.parseInt(split[0]);
int chunkZ = Integer.parseInt(split[1]);
int imageX = chunkX + radius;
int imageY = chunkZ + radius;
if (imageX < 0 || imageX >= 2 * radius || imageY < 0 || imageY >= 2 * radius) {
continue;
}
int weight = Integer.parseInt(split[2]);
int color = 255 - (int) (50 * Math.log(weight)) - 50;
if (color < 0) {
color = 0;
}
if (color > 255) {
color = 255;
}
model.setSample(imageX, imageY, 0, color, buffer);
}
File o = new File("/Users/leijurv/Downloads/heatmap_overworld_full.png");
ImageIO.write(output, "png", o);
}
Любопытные факты
Был игрок, который догадался о существовании эксплойта и обвинил создателей чита, но ему не поверили, а создатели отправляли ему сообщения для разжигания паранойи с содержанием символов в виде азбуки Морзе: ссылка на модуль
С июля 2018 года по август 2019 года и с марта 2020 года по июль 2021 года в радиусе несколько миллионов блоков от центра верхнего мира более миллиона редких баз и складов, в том числе и хранилища магазинов были в базе Postegre (1,7 терабайт и 13,5 биллионов строк)
более 200 миллионов единиц вещей разграблено/уничтожено
более 300 тысяч игроков записаны в базу данных
более 15 тысяч баз подвержены атаке
Чтобы можно было отправлять запрос на "онлайн" чанка - сервер пришлось "уронить" десятки раз для введения ограничений на проверку
Название эксплойта выбрано для сохранения отстраненности от событий
С Новым Годом!
segment
Можете, пожалуйста, объяснить простым языком для тех кто не играл в эту игру?
Tungsten017 Автор
Середина статьи-общий принцип работы:
Боты запрашивают координаты матриц прогрузки игры и отправляют результаты перемещения врагов и их складов ценных вещей
segment
То есть в протоколе есть информация о наличии других игроков в доступной зоне, но как ее достают? Есть ли защита от подобного или на уровне клиента это нерешаемая задача?
Tungsten017 Автор
У ядра Paper MC вышло обновление с фиксом
segment
Как это пофиксили?
Tungsten017 Автор
Закрыли возможность отправлять запрос за пределы прогрузки чанков бота, а чанки бота и так прогружены
mambet
Да понимаете, в чём проблема, тут и тем, кто в эту игру играет не очень понятно :(
vanxant
Как я понял, тырили чужие вещи и продавали за реальные деньги.