MCBE 一些基于网络数据包的作弊功能实现 3(杀戮/连击/空中跳跃/喷气背包)

你可能在找
在 Node.js 上代理 MCBE 服务器并中间人(MITM)攻击(基于 bedrock-protocol) | TheChuan1503’s blog

  • 示例 Minecraft 版本: Bedrock 1.20.80

  • C -> S 表示客户端发往服务器的数据包

  • S -> C 表示服务器发往客户端的数据包

杀戮/KillAura

  1. 获取所有的实体(entities)
    这里通过一个简单的方法获取
  • 进入 S -> C move_entity_delta
  • 获取 runtime_entity_id 字段(runtime_entity_id)
  • 通过 x, y, z 字段(其中之二可能会不存在)获取实体变化的向量轴,与 runtime_entity_id 一同保存到一个映射表中
  1. 处理攻击
  • 遍历映射表,获取所有实体的 runtime_entity_id 及其坐标(entityPos)
    1. 计算玩家到实体的距离,如果实体在玩家攻击范围内
    2. 构造 C -> S inventory_transactiontransaction 字段传入一个 InventoryTransaction,其中:
    • legacy 设为 { legacy_request_id: 0 }
    • transaction_type 设为 item_use_on_entity
    • actions 设为空数组([])
    • transaction_data 设为一个 InventoryTransactionData,其中:
      • action_type 设为 attack
      • click_pos 设为一个空 Vec3
      • entity_runtime_id 设为实体的 runtime_entity_id
      • held_item 为手持物品数据,空手可填 { network_id: 0 }
      • hotbar_slot 为手持物品槽位(0-9),槽位对不上则无法攻击
      • player_pos 为玩家位置 Vec3
    1. 发送数据包给服务器
  • 等待一段时间后重复以上操作

连击/Combo

  1. 进入 C -> S inventory_transaction
  2. 如果 transaction_data/action_typeattack,则继续
  3. 创建若干个依次等待片刻的延时器,延时器内:
  • 把当前 C -> S inventory_transaction 复制一份
  • 重写新数据包的 transaction_data/player_pos 为当前玩家位置 Vec3
  • 发送新数据包给服务器

空中跳跃/AirJump

本质是个仅向上动量的喷气背包

  1. 进入 C -> S player_auth_input
  2. 如果 input_data/want_uptrue,则继续
  3. 构造 S -> C set_entity_motion,其中:
  • runtime_entity_id 设为当前玩家的 runtime_entity_id
  • velocity 设为一个 Vec3,其中:
    • x 设为原 player_auth_input 数据包的 delta/x
    • y 设为 0.42
    • z 设为原 player_auth_input 数据包的 delta/z
  • tick 设为 0n (BigInt)
  1. 发送数据包给客户端

喷气背包/Jetpack

  1. 进入 C -> S player_auth_input
  2. 获取并记录玩家的俯仰角(pitch)和头部偏航角(head_yaw)
  3. 通过 head_yaw 计算水平动量(mX, mZ)
    可参考 MCBE 偏航角到坐标移动向量的计算
    (input 仅设置 uptrue)
  4. 通过 pitch 计算垂直动量(mY)
    正弦函数简单计算(弧度制)
    sin(-pitch * (π / 180)) * speed
  5. 构造 S -> C set_entity_motion,其中:
  • runtime_entity_id 设为当前玩家的 runtime_entity_id
  • velocity 设为一个 Vec3(mX, mY, mZ)
  • tick 设为 0n (BigInt)
  1. 发送数据包给客户端

参考文献