<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Merune Fleur</title>
    <description>The latest articles on DEV Community by Merune Fleur (@merunefleuruwu).</description>
    <link>https://dev.to/merunefleuruwu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4199437%2Fff55249d-1363-4e5d-9fa7-8d73dc4b50d9.gif</url>
      <title>DEV Community: Merune Fleur</title>
      <link>https://dev.to/merunefleuruwu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/merunefleuruwu"/>
    <language>en</language>
    <item>
      <title>Reading an Undocumented Game Protocol Off the Wire: A Guided Dissection</title>
      <dc:creator>Merune Fleur</dc:creator>
      <pubDate>Thu, 22 Oct 2026 02:51:18 +0000</pubDate>
      <link>https://dev.to/merunefleuruwu/reading-an-undocumented-game-protocol-off-the-wire-a-guided-dissection-26d</link>
      <guid>https://dev.to/merunefleuruwu/reading-an-undocumented-game-protocol-off-the-wire-a-guided-dissection-26d</guid>
      <description>&lt;p&gt;Every multiplayer game speaks a protocol nobody documented for you. Deriving it from raw packets is one of the most useful skills in game modding, private-server development and network tooling — and there is almost no honest practice material for it. Malware and crackmes, sure. A real game protocol, laid out to be learned from? Not really.&lt;/p&gt;

&lt;p&gt;So I built one. &lt;strong&gt;DRIFTLIGHT&lt;/strong&gt; is a tiny UDP arena game written for a single purpose: to be reverse engineered. Stripped client and server binaries, a recorded session of 1,976 packets, and zero documentation. This article walks the first steps of dissecting it — the same steps Lab 1 of the pack guides you through.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first packet
&lt;/h2&gt;

&lt;p&gt;Here is a real frame from the capture, a client introducing itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;11 7a 1f d2 01 01 01 00 0a 00 06 00 53 43 52 49 42 45 c6 68
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four bytes repeat at the start of nearly every packet in the capture: &lt;code&gt;11 7a 1f d2&lt;/code&gt;. That is a magic number — written little-endian, &lt;code&gt;0xD21F7A11&lt;/code&gt;. After it, a version byte (&lt;code&gt;01&lt;/code&gt;) and a byte that takes only ten distinct values across the whole capture. Ten values, in a game protocol, means a message-type field: an opcode. This frame is type 1, and the ASCII hiding near the end (&lt;code&gt;SCRIBE&lt;/code&gt;, the player's name) tells you what type 1 is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The length that lies (a little)
&lt;/h2&gt;

&lt;p&gt;Two bytes after the opcode read &lt;code&gt;0a 00&lt;/code&gt; — ten, little-endian. The payload that follows is indeed ten bytes. But count the whole UDP payload and you get 28 bytes, not 24: the length field counts the payload only, and the difference — 14 — is the frame around it: magic, version, opcode, a sequence number, the length itself, and a 2-byte trailer at the very end that changes with every packet and validates nothing yet. You derived the header size by subtraction, without a single line of documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A census, not a guess
&lt;/h2&gt;

&lt;p&gt;Group all 1,976 packets by their opcode byte and a picture emerges: one type is ~75% of all traffic and appears exactly 20 times per second (world snapshots), two types pair up as request/response, one carries the player names, one appears exactly once per player at the start. Frequency and timing alone reconstruct most of the architecture before you decode a single payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;Lab 1 is &lt;strong&gt;free&lt;/strong&gt;: the full guided dissection, the binaries, the capture, and a final exercise where you write a working Wireshark dissector in Lua.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://solana63.gumroad.com/l/driftlight-lab1" rel="noopener noreferrer"&gt;https://solana63.gumroad.com/l/driftlight-lab1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full pack (Labs 2–5) continues from there: recovering the trailer's CRC parameters black-box, breaking the chat's session-key obfuscation, Ghidra and Frida on the stripped client, and reimplementing the client in Python against the real server. It's on early-bird pre-order for $29 — and if the pack doesn't ship, every pre-order is refunded automatically.&lt;/p&gt;

&lt;p&gt;Details: &lt;a href="https://merunefleuruwu.github.io/driftlight/" rel="noopener noreferrer"&gt;https://merunefleuruwu.github.io/driftlight/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything in DRIFTLIGHT is my own code, written as a legal, safe target. The techniques are the real ones; the playground is honest.&lt;/p&gt;

</description>
      <category>reverseengineering</category>
      <category>networking</category>
      <category>gamedev</category>
      <category>wireshark</category>
    </item>
  </channel>
</rss>
