Модификация UDP пакета через NFQueue

Я пытаюсь модифицировать исходящий пинг пакет от сервера Minecraft PE через NFQueue и gopacket (golang)

configOutcoming := nfqueue.Config{
  NfQueue:      1001,
  MaxPacketLen: 0xFFFF,
  MaxQueueLen:  0xFF,
  Copymode:     nfqueue.NfQnlCopyPacket,
  ReadTimeout:  100 * time.Millisecond,
  WriteTimeout: 150 * time.Millisecond,
 }

nfOut, errOut := nfqueue.Open(&configOutcoming)
 if errOut != nil {
  fmt.Println("could not open outcoming socket:", errOut)
  return
 }
 defer nfOut.Close()

 ctxOut := context.Background()
 outReceiver := func(a nfqueue.Attribute) int {
  id := *a.PacketID
  packet := gopacket.NewPacket(*a.Payload, layers.LayerTypeIPv4, gopacket.Default)
  if udpLayer := packet.Layer(layers.LayerTypeUDP); udpLayer != nil {
     ipLayer := packet.Layer(layers.LayerTypeIPv4); 
     ip, _ := ipLayer.(*layers.IPv4)
     udp, _ := udpLayer.(*layers.UDP)
     //получен исходящий пакет от сервера
     if GetRakLibPacket(udp.Payload, ip.SrcIP.String(), udp.SrcPort.String()).Header == UnconnectedPong { //проверка на то что пакет именно пинг от сервера
       splittedPing := strings.Split(string(GetRakLibPacket([]byte(udp.Payload), ip.SrcIP.String(), udp.SrcPort.String()).Buffer), ";") //разделение пакета по ; чтобы достать MOTD строку из пинга
       hijackedPing := "124" + splittedPing[1] //добавляю 124 к MOTD строке
       splittedPing[1] = hijackedPing //заменяем старую строку на новую
       hijackedBuffer := strings.Join(splittedPing, ";") //возращаем все обратно в пакет пинга

       *packet.ApplicationLayer().(*gopacket.Payload) = []byte(hijackedBuffer)
       ip.Length = uint16(ip.Length + 4)
       err := udp.SetNetworkLayerForChecksum(packet.NetworkLayer())
       if err != nil {
          panic(err)
       }

       buffer := gopacket.NewSerializeBuffer()
       options := gopacket.SerializeOptions{
         ComputeChecksums: true,
         FixLengths: true,
       }


      if err := gopacket.SerializePacket(buffer, options, packet); err != nil {
        log.Fatalln(err)
      }
      packetBytes := buffer.Bytes() //результат


      nfOut.SetVerdictModPacket(id, nfqueue.NfAccept, packetBytes) //изменяем исходящий пакет 
      return 0
   }

     nfOut.SetVerdict(id, nfqueue.NfAccept)
  }
 return 0
}

 // Запуск прослушивания
 errOut = nfOut.Register(ctxOut, outReceiver)
 if errOut != nil {
  fmt.Println(errOut)
  return
 }


После модификации игра показывает модифицированный пакет, но последние цифры теряются (я так думаю что размер пакета не изменился и игра обрезает пакет пинга до полученного размера) результат

Если проверять пинг через сторонних ботов, то пакет не обрезается и показывает измененную информацию введите сюда описание изображения

Команда iptables:

iptables -I OUTPUT -p udp --sport 19132 -j NFQUEUE --queue-num 1001

Что я делаю не так?


Ответы (0 шт):