凌语丶
本帖最后由 零寂Zero 于 2021-8-7 17:35 编辑

下面是截获的端对服聊天通信中发送的数据包:
  1. {17,131,2,120,156,99,110,96,210,79,28,217,0,0,8,109,97,84}#/+255个a
  2. {17,130,2,120,156,99,254,207,168,159,56,162,1,0,37,152,97,113}#/+254个a
  3. {17,129,2,120,156,99,254,199,168,159,56,146,1,0,195,24,97,15}#/+253个a
  4. {17,128,2,120,156,99,254,203,168,159,56,130,1,0,97,10,96,173}#/+252个a
  5. {128,2,0,3,252,1,47,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97}#/+251个a
复制代码
很明显 在252个字符后 发送的字符数超过了数据包长度限制 因此客户端对数据进行了压缩
请问超过252个字符后的数据包规律?
  1. 补充:
  2. {132,2,0,3,128,2,47,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97}#/+255个a
  3. 在不同的服务器进行测试的结果
复制代码

不够对比?这里还有
  1. {17,131,2,120,156,99,110,96,210,79,25,217,0,0,134,252,100,81}#/+255个d
复制代码





纱夜
本帖最后由 阴阳师元素祭祀 于 2021-8-7 17:56 编辑

http://infozip.sourceforge.net/doc/appnote-19970311-iz.zip


应该就是zip的压缩【java 自带的压缩算法】
以下内容需要积分高于 1000 才可浏览

相关代码:
  1.       int i = p_encode_2_.readableBytes();
  2.       PacketBuffer packetbuffer = new PacketBuffer(p_encode_3_);
  3.       if (i < this.threshold) {
  4.          packetbuffer.writeVarInt(0);
  5.          packetbuffer.writeBytes(p_encode_2_);
  6.       } else {
  7.          byte[] abyte = new byte[i];
  8.          p_encode_2_.readBytes(abyte);
  9.          packetbuffer.writeVarInt(abyte.length);
  10.          this.deflater.setInput(abyte, 0, i);
  11.          this.deflater.finish();

  12.          while(!this.deflater.finished()) {
  13.             int j = this.deflater.deflate(this.encodeBuf);
  14.             packetbuffer.writeBytes(this.encodeBuf, 0, j);
  15.          }

  16.          this.deflater.reset();
  17.       }
复制代码




应该是zip压缩:
var b = new ByteArrayOutputStream(256);
b.write(132);
b.write(2);
b.write(0);
b.write(3);
b.write(128);
b.write(2);
b.write(47);
for (int i = 0; i < 252; i++) {
    b.write(97);
}
var d = new Deflater();
var cache = new byte[8192];
var bytes = b.toByteArray();
d.setInput(bytes);
d.finish();
var out = new ByteArrayOutputStream();
while(!d.finished()) {
    int len = d.deflate(cache);
    out.write(cache, 0, len);
}
d.reset();
System.out.println(Arrays.toString(out.toByteArray()));

[120, -100, 107, 97, 98, 96, 110, 96, -46, 79, 28, -63, 0, 0, 109, 24, 96, -73]
{17,128,2,120,156,99,254,203,168,159,56,130,1,0,97,10,96,173}
然后带上mc的header...


xmdhs
本帖最后由 xmdhs 于 2021-8-7 18:02 编辑

你没看过 https://wiki.vg/Protocol#With_compression

先上代码。
  1. package main

  2. import (
  3.         "bytes"
  4.         "compress/zlib"
  5.         "errors"
  6.         "fmt"
  7.         "io"
  8. )

  9. func main() {
  10.         b := []byte{17, 130, 2, 120, 156, 99, 254, 207, 168, 159, 56, 162, 1, 0, 37, 152, 97, 113}
  11.         var v VarInt
  12.         r := bytes.NewReader(b)

  13.         f := func(r io.Reader) {
  14.                 i, err := v.ReadFrom(r)
  15.                 if err != nil {
  16.                         panic(err)
  17.                 }
  18.                 fmt.Println(i, v)
  19.         }

  20.         f(r)
  21.         f(r)

  22.         zr, err := zlib.NewReader(r)
  23.         if err != nil {
  24.                 panic(err)
  25.         }
  26.         defer zr.Close()
  27.         f(zr)

  28.         zb, err := io.ReadAll(zr)
  29.         if err != nil {
  30.                 panic(err)
  31.         }
  32.         fmt.Println(string(zb))
  33. }

  34. // https://github.com/Tnze/go-mc
  35. const MaxVarIntLen = 5

  36. type VarInt int32

  37. func (v *VarInt) ReadFrom(r io.Reader) (n int64, err error) {
  38.         var V uint32
  39.         for sec := byte(0x80); sec&0x80 != 0; n++ {
  40.                 if n > MaxVarIntLen {
  41.                         return n, errors.New("VarInt is too big")
  42.                 }

  43.                 sec, err = readByte(r)
  44.                 if err != nil {
  45.                         return n, err
  46.                 }

  47.                 V |= uint32(sec&0x7F) << uint32(7*n)
  48.         }

  49.         *v = VarInt(V)
  50.         return
  51. }

  52. func readByte(r io.Reader) (byte, error) {
  53.         if r, ok := r.(io.ByteReader); ok {
  54.                 return r.ReadByte()
  55.         }
  56.         var v [1]byte
  57.         _, err := io.ReadFull(r, v[:])
  58.         return v[0], err
  59. }

复制代码


可以得到
1 17
2 259

也就是这一大堆 byte 里,第一个 VarInt 是 17,也就是之后的长度,可以简单验证


之后的两个 byte 转换成 VarInt 的值就是 259,也就是 Data Length        

然后使用 zlib 解压后面的数据

得到



a1393629072
1111111111111111111111111ss1s1s

第一页 上一页 下一页 最后一页