-
Notifications
You must be signed in to change notification settings - Fork 5
Home
In this wiki, I will attempt to describe as easy to understand as possible, while retaining the details, the Among Us protocol, so you can make your own implementation, or just to understand what's happening behind the scenes. If this is your first time learning about the Among Us protocol, I suggest you read the pages carefully as it is full important details that can be easy to miss out.
I will attempt to keep the documentation as consistent and as simple as possible, although as the wiki gets rather large, this can be quite cumbersome and not always possible, if you have any issues with the wiki, please file an issue for this repository.
Among Us uses this fork of Hazel, so look there for more detailed descriptions and usage.
If you wish you try yourself at reverse-engineering the game, I suggest the following programs for packet capturing, disassembly or dumping game data.
- Wireshark - For capturing game packets.
- IDA Pro - For disassembly.
- Il2CppDumper - For dumping enums and class structures.
Most of the information in this wiki I have compiled from other sources, and some is from my own reversing.
- https://wiki.weewoo.net/wiki
- https://github.com/alexis-evelyn/Among-Us-Protocol/wiki
- Impostor Discord server
The protocol connects through the User Datagram Protocol to any of the game's Master servers.
For the most part, the protocol uses standard types and integers and floats are usually in Little Endian. Strings are prefixed by the length of the string, typically as a packed int
. This applies to all packets unless noted otherwise.
Types and structures are detailed below.
Name | Size | Description |
---|---|---|
unknown |
N/A |
Unknown bytes of X length, usually for values that don't seem to have an effect on the game. |
byte |
1 byte |
A single byte, used for enums and bitfields. |
uint8 |
1 byte |
An unsigned 8-bit integer, used for enums. |
int8 |
1 byte |
A signed 8-bit integer. |
uint16 |
2 bytes |
An unsigned 16-bit integer, used for buffer lengths. |
int16 |
2 bytes |
A signed 16-bit integer. |
uint32 |
4 bytes |
An unsigned 32-bit integer, used for IDs. |
int32 |
4 bytes |
A signed 32-bit integer. |
float16 |
4 bytes |
A half-precision floating point number, used for velocity and other low-precision values. |
float |
4 bytes |
A floating point number. |
string |
N/A |
A string prefixed by it's length, usually as a packed int
|
packed int |
N/A |
A packed integer used for storing integers of variable size. |
Game code |
4 bytes |
A Game Codes used to identify games unique to each region. |
Game options |
N/A |
Game options for hosting or syncing settings for games. |
Every Hazel message follows a specific format, the most basic of which is the first byte, which represents the opcode of the message. Most messages will be sent either using the Unreliable or Reliable opcode, in the form of a Payload, however other messages are considered Special, and usually follow less strict structures and affect the connection rather than the client or game. The actual data for the packet is passed after the first byte.
Packet Opcode | Description |
---|---|
Unreliable |
0x00 Used to transfer client or game data in an unreliable way, e.g. movement packets which don't need to be acknowledged and the client is OK with missing out on one or two. |
Reliable |
0x01 Used to transfer client or game data in a reliable way, including a nonce that must be sent back to acknowledge that the packet has been received, else the packet is sent over again until acknowledged. |
Hello |
0x08 Used to identify the client's connection with a username, the first packet that a client wanting to connect might send. |
Disconnect |
0x09 Used by either the client or the server to signal a disconnect to stop receiving and sending packets. |
Acknowledge |
0x0a Used to acknowledge that reliable packets have been received. |
Ping |
0x0c Used for checking the connection is still active and alive. If pings are repeatedly missed, the server sends a disconnect opcode packet with no reason. |