FastBreak Block Destruction Exploit

Fast_Break_Exploit Эксплойты (Exploits) HIGH +8 очков

🎮 Влияние на механику Minecraft

В режиме выживания время добычи блока определяется его твердостью, характеристиками инструмента и эффектами игрока (Спешка, Утомление). При разрушении клиент отправляет серверу пакеты PlayerActionC2SPacket со статусами START_DESTROY_BLOCK, ABORT_DESTROY_BLOCK и STOP_DESTROY_BLOCK. На стороне сервера метод ServerPlayerInteractionManager.processBlockBreakingAction() подсчитывает прошедшие тики с момента начала копки и рассчитывает прогресс через calcBlockBreakingDelta(). Сервер подтверждает поломку только при достижении прогресса 1.0 (100%).

В исследованном модуле (com.example.timer.mixin.ServerPlayerInteractionManagerMixin) метод timer$scaleStopValidation служит сервером компенсации ускорения таймера. При получении действия STOP_DESTROY_BLOCK миксин вычисляет эффективные тики копки, умножая разницу времени на множитель чита: scaledTicks = Math.max(1, Math.round((field_14000 - field_20326) * multiplier)). Если полученный прогресс превышает 0.7F (70%), метод досрочно вызывает завершение поломки this.method_21717(pos, sequence, "destroyed") и отменяет стандартную проверку через ci.cancel(), снижая требуемый объем работы на 30% сверх ускорения тиков.

Поскольку класс ServerPlayerInteractionManager относится к логике сервера, этот миксин работает исключительно в одиночной игре, на интегрированном LAN-сервере или при установке мода на сам сервер. На удаленных выделенных серверах проверка выполняется независимо от клиента, поэтому клиентские читы FastBreak воздействуют на клиентский класс ClientPlayerInteractionManager (обнуляя задержку между блоками blockBreakDelay в 5 тиков).

В легитимных модах библиотека Fabric API (ServerPlayerGameModeMixin) также подключается к processBlockBreakingAction для вызова событий AttackBlockCallback и PlayerBlockBreakEvents.Before, однако не изменяет прогресс разрушения и не вызывает method_21717.

🔍 Анализируемые функции и API

ServerPlayerInteractionManager.method_14263 / processBlockBreakingAction

Проверяет корректность действий игрока и количество затраченных тиков при разрушении блока на сервере.

ServerPlayerInteractionManager.method_21717 / finishBlockBreakingAction

Завершает процесс разрушения блока и обновляет состояние мира на сервере.

BlockState.method_26165 / calcBlockBreakingDelta

Вычисляет прирост прогресса разрушения блока за один тик с учетом инструмента и прочности блока.

⚙️ Декомпилированный вид (Vineflower)

@Mixin(class_3225.class)
public abstract class ServerPlayerInteractionManagerMixin {
   @Shadow
   protected class_3218 field_14007;
   @Shadow
   protected class_3222 field_14008;
   @Shadow
   private boolean field_14003;
   @Shadow
   private int field_20326;
   @Shadow
   private class_2338 field_20327;
   @Shadow
   private int field_14000;
   @Shadow
   private boolean field_20328;
   @Shadow
   private class_2338 field_20329;
   @Shadow
   private int field_20330;

   @Shadow
   public abstract void method_21717(class_2338 var1, int var2, String var3);

   @Inject(method = "method_14263", at = @At("HEAD"), cancellable = true)
   private void timer$scaleStopValidation(class_2338 pos, class_2847 action, class_2350 direction, int worldHeight, int sequence, CallbackInfo ci) {
      if (action == class_2847.field_12973) {
         float multiplier = TimerState.get().tickMultiplier();
         if (multiplier != 1.0F) {
            if (this.field_14008.method_56093(pos, 1.0) && pos.method_10264() <= worldHeight && pos.equals(this.field_20327)) {
               class_2680 blockState = this.field_14007.method_8320(pos);
               if (blockState.method_26215()) {
                  ci.cancel();
               } else {
                  int scaledTicks = Math.max(1, Math.round((this.field_14000 - this.field_20326) * multiplier));
                  float progress = blockState.method_26165(this.field_14008, this.field_14008.method_51469(), pos) * (scaledTicks + 1);
                  this.field_14003 = false;
                  this.field_14007.method_8517(this.field_14008.method_5628(), pos, -1);
                  if (progress >= 0.7F) {
                     this.method_21717(pos, sequence, "destroyed");
                  } else if (!this.field_20328) {
                     this.field_20328 = true;
                     this.field_20329 = pos;
                     this.field_20330 = this.field_20326;
                  }

                  ci.cancel();
               }
            }
         }
      }
   }
}

🛡️ Сигнатура байткода и статический детект

Детектор анализирует байткод классов на наличие Mixin-инъекций в серверную обработку разрушения блоков, совмещенных с прямыми вызовами методов завершения поломки или расчета дельты прогресса:

  • Аннотацию инъекции (@Inject, @ModifyReturnValue, @ModifyExpressionValue, @Redirect или @Overwrite), нацеленную на method_14263 (processBlockBreakingAction).
  • Вызов методов уничтожения блока или расчета прогресса: method_21717 (finishBlockBreakingAction / destroyBlock) или method_26165 (calcBlockBreakingDelta).

Такая комбинация выявляет алгоритмы, масштабирующие тики копки и форсирующие преждевременное разрушение блоков. Правило сфокусировано на серверной логике проверки взаимодействий (ServerPlayerInteractionManager), активной в одиночной игре, на интегрированном LAN-хосте или при установке мода на выделенный сервер.