本帖最后由 零寂Zero 于 2021-8-7 17:35 编辑 
下面是截获的端对服聊天通信中发送的数据包:
复制代码很明显 在252个字符后 发送的字符数超过了数据包长度限制 因此客户端对数据进行了压缩
请问超过252个字符后的数据包规律?
复制代码
不够对比?这里还有
复制代码
下面是截获的端对服聊天通信中发送的数据包:
- {17,131,2,120,156,99,110,96,210,79,28,217,0,0,8,109,97,84}#/+255个a
 
- {17,130,2,120,156,99,254,207,168,159,56,162,1,0,37,152,97,113}#/+254个a
 
- {17,129,2,120,156,99,254,199,168,159,56,146,1,0,195,24,97,15}#/+253个a
 
- {17,128,2,120,156,99,254,203,168,159,56,130,1,0,97,10,96,173}#/+252个a
 
- {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个字符后的数据包规律?
- 补充:
 
- {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
 
- 在不同的服务器进行测试的结果
不够对比?这里还有
- {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 自带的压缩算法】
相关代码:
复制代码
应该是zip压缩:
[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...
http://infozip.sourceforge.net/doc/appnote-19970311-iz.zip
应该就是zip的压缩【java 自带的压缩算法】
以下内容需要积分高于 1000 才可浏览
相关代码:
-       int i = p_encode_2_.readableBytes();
 
-       PacketBuffer packetbuffer = new PacketBuffer(p_encode_3_);
 
-       if (i < this.threshold) {
 
-          packetbuffer.writeVarInt(0);
 
-          packetbuffer.writeBytes(p_encode_2_);
 
-       } else {
 
-          byte[] abyte = new byte[i];
 
-          p_encode_2_.readBytes(abyte);
 
-          packetbuffer.writeVarInt(abyte.length);
 
-          this.deflater.setInput(abyte, 0, i);
 
-          this.deflater.finish();
 
 
-          while(!this.deflater.finished()) {
 
-             int j = this.deflater.deflate(this.encodeBuf);
 
-             packetbuffer.writeBytes(this.encodeBuf, 0, j);
 
-          }
 
 
-          this.deflater.reset();
 
- }
应该是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 于 2021-8-7 18:02 编辑 
你没看过 https://wiki.vg/Protocol#With_compression 吗
先上代码。
复制代码
可以得到
1 17
2 259
也就是这一大堆 byte 里,第一个 VarInt 是 17,也就是之后的长度,可以简单验证
 
 
之后的两个 byte 转换成 VarInt 的值就是 259,也就是 Data Length
然后使用 zlib 解压后面的数据
得到
 
 
你没看过 https://wiki.vg/Protocol#With_compression 吗
先上代码。
- package main
 
 
- import (
 
-         "bytes"
 
-         "compress/zlib"
 
-         "errors"
 
-         "fmt"
 
-         "io"
 
- )
 
 
- func main() {
 
-         b := []byte{17, 130, 2, 120, 156, 99, 254, 207, 168, 159, 56, 162, 1, 0, 37, 152, 97, 113}
 
-         var v VarInt
 
-         r := bytes.NewReader(b)
 
 
-         f := func(r io.Reader) {
 
-                 i, err := v.ReadFrom(r)
 
-                 if err != nil {
 
-                         panic(err)
 
-                 }
 
-                 fmt.Println(i, v)
 
-         }
 
 
-         f(r)
 
-         f(r)
 
 
-         zr, err := zlib.NewReader(r)
 
-         if err != nil {
 
-                 panic(err)
 
-         }
 
-         defer zr.Close()
 
-         f(zr)
 
 
-         zb, err := io.ReadAll(zr)
 
-         if err != nil {
 
-                 panic(err)
 
-         }
 
-         fmt.Println(string(zb))
 
- }
 
 
- // https://github.com/Tnze/go-mc
 
- const MaxVarIntLen = 5
 
 
- type VarInt int32
 
 
- func (v *VarInt) ReadFrom(r io.Reader) (n int64, err error) {
 
-         var V uint32
 
-         for sec := byte(0x80); sec&0x80 != 0; n++ {
 
-                 if n > MaxVarIntLen {
 
-                         return n, errors.New("VarInt is too big")
 
-                 }
 
 
-                 sec, err = readByte(r)
 
-                 if err != nil {
 
-                         return n, err
 
-                 }
 
 
-                 V |= uint32(sec&0x7F) << uint32(7*n)
 
-         }
 
 
-         *v = VarInt(V)
 
-         return
 
- }
 
 
- func readByte(r io.Reader) (byte, error) {
 
-         if r, ok := r.(io.ByteReader); ok {
 
-                 return r.ReadByte()
 
-         }
 
-         var v [1]byte
 
-         _, err := io.ReadFull(r, v[:])
 
-         return v[0], err
 
- }
 
 
可以得到
1 17
2 259
也就是这一大堆 byte 里,第一个 VarInt 是 17,也就是之后的长度,可以简单验证
 
之后的两个 byte 转换成 VarInt 的值就是 259,也就是 Data Length
然后使用 zlib 解压后面的数据
得到
 
1111111111111111111111111ss1s1s