本帖最后由 零寂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