jmhobbs

DayZ Server Browsers - Part Two

Two years ago I wrote a post on DayZ server browsers and the A2S protocol (you should read that first). At the end of the post I mentioned the A2S_RULES query and a follow up post to cover how DayZ packs data into that response. Well, it's much later than I intended, but here it is!

To begin with, we will extend our existing Go code for sending Steam Server Queries. Instead of sending A2S_INFO this time, we will instead send A2S_RULES, which is 0x56. This is, again, guarded by the challenge system, so that code stays in place. Our example server this time is the WILDLANDZ Green County server at 51.81.8.81:27017.

package main

import (
	"bytes"
	"fmt"
	"net"
	"os"
)

func main() {
	var rulesPacket bytes.Buffer

	// packet type
	rulesPacket.Write([]byte{0xFF, 0xFF, 0xFF, 0xFF})
	// request type
	rulesPacket.WriteByte(0x56)
	// payload (0xFFFFFFFF to get challenge)
	rulesPacket.Write([]byte{0xFF, 0xFF, 0xFF, 0xFF})

	conn, err := net.Dial("udp", "51.81.8.81:27017")
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	response := sendPacket(conn, rulesPacket.Bytes())

	if response[4] == 0x41 {
		fmt.Println("Challenge packet received")
		challenge := response[5:]
		fmt.Printf("Challenge: %v\n", challenge)

		// clear challenge request bytes
		rulesPacket.Truncate(5)
		// add the challenge bytes
		rulesPacket.Write(challenge)

		response = sendPacket(conn, rulesPacket.Bytes())
	} else {
		fmt.Println("Challenge packet not received")
	}

	fmt.Printf("Response: %v\n", response)
}

func sendPacket(conn net.Conn, pkt []byte) []byte {
	_, err := conn.Write(pkt)
	if err != nil {
		panic(err)
	}

	response := make([]byte, 1024)

	n, err := conn.Read(response)
	if err != nil {
		panic(err)
	}

	return response[:n]
}

A2S_RULES - Name / Value Pairs

This returns a relatively large block of information compared to A2S_INFO. At a glance, there are plenty of strings in there, with recognizable values. We can already tell this has mod names in it.

┌────────┬─────────────────────────┬─────────────────────────┬────────┬────────┐
│00000000ff ff ff ff 45 0d 00 0104 00 02 01 02 01 02 01××××E_••••••│
│0000001002 0c 97 cb a7 48 04 7632 5b df 11 53 75 6d 6d•_×××Hv2[×Summ│
│0000002065 72 20 49 6e 20 41 6d65 72 69 63 61 3c af 03er In America<×│
│00000030bf 04 0e 0b b9 da 0f 575a 20 47 72 65 65 6e 20ו••××WZ Green │
│0000004043 6f 75 6e 74 79 7b 034a a9 04 4e 0a b9 da 0eCounty{J×N_××│
│0000005057 5a 20 41 6e 6e 69 7665 72 73 61 72 79 c3 dcWZ Anniversary××│
│0000006009 a9 04 a3 09 b9 da 0757 5a 20 43 6f 72 65 8b_××_××WZ Core×│
│0000007001 02 74 e0 04 a0 8a 59aa 16 5a 65 6e 61 72 63••t×××Y×Zenarc│
│0000008068 69 73 74 27 73 20 4e6f 00 02 04 00 74 65 73hist's No••tes│
│0000009020 4d 6f 64 c1 8f 3a f704 ec 72 ae dc 15 5a 65 Mod××:××r××Ze│
│000000a06e 61 72 63 68 69 73 7427 73 20 43 6f 72 65 20narchist's Core │
│000000b04d 6f 64 8f 13 c8 2e 04a4 97 73 6c 09 45 61 72Mod××.××sl_Ear│
│000000c020 50 6c 75 67 73 9a a2b7 3d 04 97 28 a9 87 12 Plugs×××=×(××│
│000000d044 61 79 5a 20 45 64 6974 6f 72 20 4c 6f 61 64DayZ Editor Load│
│000000e065 72 a7 2e e7 10 04 209e b6 97 0e 44 61 62 73er×.ו• ×××Dabs│
│000000f020 46 72 61 6d 65 77 6f72 6b e0 db 9d 1c 04 54 Framework××ו•T│
│00000100c4 fb 6c 0d 56 50 50 4164 6d 69 6e 00 03 04 00××l_VPPAdmin••│
│0000011054 6f 6f 6c 73 c1 c6 af68 04 04 b0 ef 5c 13 43Tools×××h••××\C│
│000001206f 6d 6d 75 6e 69 74 7920 46 72 61 6d 65 77 6fommunity Framewo│
│0000013072 6b e3 82 d6 16 04 4434 d8 7e 0c 47 72 65 65rk××ו•D4×~_Gree│
│000001406e 20 43 6f 75 6e 74 7909 0b 43 6f 6f 6c 74 72n County_•Cooltr│
│0000015061 69 6e 56 33 03 64 6162 04 64 61 79 7a 0b 47ainV3dabdayzG│
│0000016072 65 65 6e 43 6f 75 6e74 79 05 48 6f 70 70 73reenCountyHopps│
│000001700e 4a 61 63 6f 62 5f 4d61 6e 67 6f 5f 56 33 06Jacob_Mango_V3│
│000001804b 6f 54 39 70 41 03 5650 50 0a 5a 65 6e 61 00KoT9pAVPP_Zena│
│0000019004 04 00 72 63 68 69 7374 19 50 76 50 20 7c 20••rchistPvP | │
│000001a053 75 72 76 69 76 61 6c20 7c 20 4e 6f 20 42 61Survival | No Ba│
│000001b073 65 73 00 61 6c 6c 6f77 65 64 42 75 69 6c 64sesallowedBuild│
│000001c000 30 00 63 6c 69 65 6e74 50 6f 72 74 00 30 000clientPort0│
│000001d064 65 64 69 63 61 74 6564 00 31 00 69 73 6c 61dedicated1isla│
│000001e06e 64 00 47 72 65 65 6e43 6f 75 6e 74 79 00 6cndGreenCountyl│
│000001f061 6e 67 75 61 67 65 0036 35 35 34 35 00 70 6canguage65545pl│
│0000020061 74 66 6f 72 6d 00 7769 6e 00 72 65 71 75 69atformwinrequi│
│0000021072 65 64 42 75 69 6c 6400 30 00 72 65 71 75 69redBuild0requi│
│0000022072 65 64 56 65 72 73 696f 6e 00 31 32 39 00 74redVersion129t│
│0000023069 6d 65 4c 65 66 74 0031 35 00               imeLeft15│
└────────┴─────────────────────────┴─────────────────────────┴────────┴────────┘

The docs for A2S_RULES show a very simple name/value system. There is the response and packet type headers, then a uint16 of how many pairs are in the response.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━┓
┃00000000ff ff ff ff             ┊                         │xxxx    ┊        │ Response Type ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000000445                      ┊                         │E       ┊        │ Packet Type   ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃000000050d 00                   ┊                         │x      ┊        │ Rule Count    ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━┛

Each name/value is a null-terminated string, let's see what we've got for the first one.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━┓
┃0000000701 04 00                ┊                         │xx     ┊        │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000001002 01 02 01 02 01 02 0c97 cb a7 48 04 76 32 5bxxxxxxxxxxxHxv2[│ Value ┃
┃00000026df 11 53 75 6d 6d 65 7220 49 6e 20 41 6d 65 72xxSummer In Amer│       ┃
┃0000004269 63 61 3c af 03 bf 040e 0b b9 da 0f 57 5a 20ica<xxxxxxxxxWZ │       ┃
┃0000005847 72 65 65 6e 20 43 6f75 6e 74 79 7b 03 4a a9Green County{xJx│       ┃
┃0000007404 4e 0a b9 da 0e 57 5a20 41 6e 6e 69 76 65 72xNxxxxWZ Anniver│       ┃
┃0000009073 61 72 79 c3 dc 09 a904 a3 09 b9 da 07 57 5asaryxxxxxxxxxxWZ│       ┃
┃0000010620 43 6f 72 65 8b 01 0274 e0 04 a0 8a 59 aa 16 CorexxxtxxxxYxx│       ┃
┃000001225a 65 6e 61 72 63 68 6973 74 27 73 20 4e 6f 00Zenarchist's No│       ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━┛

Oh, uh, that's not very helpful.

Metadata Smuggling

Turns out, Bohemia is using the A2S_RULES response...creatively. There is a second data structure which is then packed into the response in chunks. Once the chunks are reassembled they can be parsed as their own data structure. This is something that is only very lightly documented, but has been used with other games. The main information I can find on it is on their wiki and specific to Arma 3; Arma 3: ServerBrowserProtocol2 and Arma 3: ServerBrowserProtocol3

Based on those documents, each chunk has a metadata header which contains two uint8 that are the number of chunks and which chunk this is (the index). Then, the value has binary data packed in as a null-terminated string. The largest size for these chunks appears to be 128 bytes, or 127 bytes of data plus the null termination.

One last complication is escape sequences. The docs show that there are three escape sequences, though it is not clear why. Obviously the null byte can not be sent as data, but it is not included in an escape sequence. This is quite probably a legacy issue and it doesn't bear thinking about too much.

Escaped Unescaped
0x01 0x01 0x01
0x01 0x02 0x02
0x01 0x03 0x03

DayZ Packed Data

With our chunks unescaped and combined into one block of data, we can begin decoding things. First up is some headers. We have a protocol version, some bytes that I can't find any reference to, and finally a count of mods included in this data. You may think that protocol version aligns to the v2 or v3 docs for Arma 3, but sadly it does not. The format shares some shape, but they do not overlap in general.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━┓
┃0000000002                      ┊                         │x       ┊        │ Protocol Version ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000000102 02 02                ┊                         │xxx     ┊        │ Flags?           ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃000000040c                      ┊                         │x       ┊        │ Mod Count        ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━┛

Mods

After this comes our first mod information block. This does match up to the documents above. We get a 4-byte hash of the mod (how to generate this on the client is unknown), then we have length encoded values for the Steam ID and the mod name. This is important for the Steam ID to conserve space, and the mod name because we can't include any null bytes, so the usual C strings won't work here.

The Steam ID length is number of bytes, so a 1 means read a uint8, a 2 means read a uint16 and a 3 or 4 means read a uint32. I am unsure if a value of 5 and use of a uint64 is possible, but the mod Steam ID's are still far away from the max uint32. The most recent DayZ mod on Steam at the time of writing this was 3_760_884_271, which leaves room for about 534 million more mods.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━┓
┃0000000597 cb a7 48             ┊                         │xxxH    ┊        │ Mod Hash        ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000000904                      ┊                         │x       ┊        │ Steam ID Length ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000001076 32 5b df             ┊                         │v2[x    ┊        │ Steam ID        ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000001411                      ┊                         │x       ┊        │ Name Length     ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000001553 75 6d 6d 65 72 20 496e 20 41 6d 65 72 69 63Summer In Americ│ Name            ┃
┃0000003161                      ┊                         │a       ┊        │                 ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━┛

Keys

After we have enumerated all the mods, we get to signing key names. It starts with an uint8 of the number of keys, and then the length / value dance of strings for each.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━┓
┃0000030609                      ┊                         │x       ┊        │ Signing Keys Count ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃000003070b                      ┊                         │x       ┊        │ Key Name Length    ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000030843 6f 6f 6c 74 72 61 696e 56 33CooltrainV3     │ Name               ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━┛

I'm not sure of the utility here, as there is no enforcement of key authority being unique across all mods, so it's possible to have two Cooltrainv3 keys on your system, you just can't load them at the same time. Another mystery!

Description

Lastly, we get the server description, which can be set in the server configuration file

This is an arbitrary string and does the same length value encoding as all the others.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━┓
┃0000038319                      ┊                         │x       ┊        │ Description Length ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨
┃0000038450 76 50 20 7c 20 53 7572 76 69 76 61 6c 20 7cPvP | Survival |│ Description        ┃
┃0000040020 4e 6f 20 42 61 73 6573 No Bases       │                    ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━┛

Other Keys

Interestingly, DayZ doesn't just use its special packed data format, it uses the name/value pairs for other information after the chunks as well.

┏━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━┯━━━━━━━━┯━━━━━━━┓
┃0000043661 6c 6c 6f 77 65 64 4275 69 6c 64 00allowedBuild   │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000044930 00                   ┊                         │0      ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000045163 6c 69 65 6e 74 50 6f72 74 00clientPort     │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000046230 00                   ┊                         │0      ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000046464 65 64 69 63 61 74 6564 00dedicated      │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000047431 00                   ┊                         │1      ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000047669 73 6c 61 6e 64 00    ┊                         │island ┊        │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000048347 72 65 65 6e 43 6f 756e 74 79 00GreenCounty    │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃000004956c 61 6e 67 75 61 67 6500language       │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000050436 35 35 34 35 00       ┊                         │65545  ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000051070 6c 61 74 66 6f 72 6d00platform       │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000051977 69 6e 00             ┊                         │win    ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000052372 65 71 75 69 72 65 6442 75 69 6c 64 00requiredBuild  │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000053730 00                   ┊                         │0      ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000053972 65 71 75 69 72 65 6456 65 72 73 69 6f 6e 00requiredVersion│ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000055531 32 39 00             ┊                         │129    ┊        │ Value ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000055974 69 6d 65 4c 65 66 7400timeLeft       │ Name  ┃
┠┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┄┼┄┄┄┄┄┄┄┨
┃0000056831 35 00                ┊                         │15     ┊        │ Value ┃
┗━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━┷━━━━━━━━┷━━━━━━━┛

There are a couple things in here that are clear while also confusing, like island being the name of the map, GreenCounty. That said, nothing here seems worth the bytes, but perhaps there is value here I just don't understand.

Conclusion

That's it, that's the data. There are some loose ends here, but this plus A2S_INFO gets us the core information about the server and what mods it is running, more than enough to populate the server browsers and tools like BattleMetrics. If you know more about these formats, please share!