<?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: Navier</title>
    <description>The latest articles on DEV Community by Navier (@navier_xoxo).</description>
    <link>https://dev.to/navier_xoxo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4217971%2F646d6063-417c-4617-a7ae-b6c71e1cd9f1.jpg</url>
      <title>DEV Community: Navier</title>
      <link>https://dev.to/navier_xoxo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/navier_xoxo"/>
    <language>en</language>
    <item>
      <title>Reverse Engineering a legacy MMO private server</title>
      <dc:creator>Navier</dc:creator>
      <pubDate>Sat, 31 Oct 2026 16:44:55 +0000</pubDate>
      <link>https://dev.to/navier_xoxo/reverse-engineering-a-legacy-mmo-private-server-3fjf</link>
      <guid>https://dev.to/navier_xoxo/reverse-engineering-a-legacy-mmo-private-server-3fjf</guid>
      <description>&lt;p&gt;When a highly anticipated private server for a legacy MMO (codenamed &lt;strong&gt;"Horse Museum"&lt;/strong&gt;) finally dropped, the community's excitement quickly turned into a panic. Security vendors were throwing generic flags, automated scanners were detecting massive encrypted payloads originating from rotating IP addresses, and rumors of a &lt;strong&gt;"Russian botnet"&lt;/strong&gt; and &lt;strong&gt;"Tor spyware"&lt;/strong&gt; spread like wildfire.&lt;/p&gt;

&lt;p&gt;Horse Museum was another Star Stable private server, that closed around the end of October. Star Stable (officially Star Stable Online, or SSO) is a 3D MMORPG focused on horses, adventure, friends and magic. The first server opened around 2011.&lt;br&gt;
Altough the game is gone, I still wanted to post my findings here. Maybe this is going to help someone, or clear the smoke a little bit.&lt;/p&gt;

&lt;p&gt;I have been playing this game since &lt;strong&gt;2012&lt;/strong&gt;, and seeing all that misinformation caused me physical pain. I’m not supporting this project, but calling it malware without any proper research is not okay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools used: Ghidra, Wireshark, UniExtract.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dropper, network analysis
&lt;/h3&gt;

&lt;p&gt;The first step was analyzing the &lt;strong&gt;setup.exe&lt;/strong&gt; installer. A quick &lt;strong&gt;SHA-256 hash check&lt;/strong&gt; on VirusTotal returned a 0/60 detection score. However, a clean score on an installer wrapper just means &lt;em&gt;the outer shell hasn't been fingerprinted yet.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;UniExtract&lt;/strong&gt;, I unpacked the executable. It contained no actual game assets, only standard Nullsoft Scriptable Install System (NSIS) components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;modern-wizard.bmp (UI graphics)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nsDialogs.dll (Custom dialog interfaces)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;System.dll (System-level command execution)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The setup.exe is a lightweight &lt;strong&gt;dropper stub&lt;/strong&gt; programmed to reach out to a remote server and inject the 1GB payload directly into the disk only when actively running.&lt;/p&gt;

&lt;p&gt;To see where the dropper was communicating, I loaded up Wireshark and applied a &lt;code&gt;tcp.flags.syn == 1 &amp;amp;&amp;amp; tcp.flags.ack == 0&lt;/code&gt; filter. The session captured 936,308 packets. Summing the transmitted bytes from the top six external IPs equaled exactly 956 MB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpuf8zmhh4uws25ltq8mq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpuf8zmhh4uws25ltq8mq.png" alt="Endpoints" width="798" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pulling 150 MB chunks from six completely random IP addresses simultaneously mimics the behavior of &lt;strong&gt;Peer-to-Peer (P2P) swarms&lt;/strong&gt; or &lt;strong&gt;botnets&lt;/strong&gt;, which triggered the community's malware alarms. Also, the launcher utilized &lt;strong&gt;Tor&lt;/strong&gt; routing protocols to obscure its initial backend handshake.&lt;/p&gt;

&lt;p&gt;Why use Tor? &lt;strong&gt;Copyright evasion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tor tunneling hides the backend authentication server's IP address from corporate lawyers attempting to send automated &lt;em&gt;Cease and Desist&lt;/em&gt; letters. The developers are using malware obfuscation techniques to survive DMCA takedowns. &lt;/p&gt;

&lt;p&gt;However, the bulk payload itself is &lt;strong&gt;not distributed via Tor&lt;/strong&gt;. I inspected the &lt;em&gt;TLSv1.2 Client Hello packets&lt;/em&gt;, and they revealed the true source in the Server Name Indication (SNI): SNI=gfs204n315.userstorage.mega.co.nz&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fssfbxh4wec5rmfqktnww.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fssfbxh4wec5rmfqktnww.JPG" alt="Mega.co.nz" width="483" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The installer is simply establishing an encrypted &lt;strong&gt;HTTPS&lt;/strong&gt; connection to MEGA.nz, which natively splits large downloads across multiple &lt;strong&gt;Content Delivery Network (CDN)&lt;/strong&gt; servers to maximize speed. &lt;strong&gt;It isn't a botnet.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DLL hijack
&lt;/h3&gt;

&lt;p&gt;Once the files were downloaded, looking at the root game folder revealed exactly how the developers intended to &lt;strong&gt;bypass&lt;/strong&gt; the game's original &lt;strong&gt;DRM&lt;/strong&gt; without permanently cracking the copyrighted .exe (which carries heavier legal penalties).&lt;/p&gt;

&lt;p&gt;Right next to the legit executable (&lt;em&gt;PXStudioRuntimeMMO.exe&lt;/em&gt;) was a tiny 50 KB &lt;em&gt;winmm.dll.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;winmm.dll&lt;/em&gt; is a standard Windows multimedia library that belongs inside C:\Windows\System32. Because Windows prioritizes &lt;strong&gt;local directory files&lt;/strong&gt; over system-level files during execution, the game unknowingly loads this custom &lt;em&gt;50 KB&lt;/em&gt; proxy instead of the safe Windows library.&lt;/p&gt;

&lt;p&gt;This is a what we call a &lt;strong&gt;DLL Hijack.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Decompiling this fake &lt;em&gt;winmm.dll&lt;/em&gt; in Ghidra shows a small script that side-loads a secondary custom payload called &lt;em&gt;patch.dll&lt;/em&gt; into the game's active memory, and then quietly passes all actual multimedia requests back to the real Windows system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static analysis
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;patch.dll&lt;/em&gt; is where the magic happens. It &lt;strong&gt;overwrites&lt;/strong&gt; the game's network functions in real-time, redirecting login attempts &lt;strong&gt;away&lt;/strong&gt; from the official servers and &lt;strong&gt;pointing them toward&lt;/strong&gt; the private server's backend.&lt;/p&gt;

&lt;p&gt;Tracing its execution from the entry point in Ghidra, I located a hooking engine utilizing the &lt;em&gt;Windows API VirtualProtect&lt;/em&gt; to unlock memory pages. It physically overwrites the first few bytes of the game's legitimate networking functions with the &lt;strong&gt;0xE9 (JMP)&lt;/strong&gt; assembly instruction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdmv6z4b5wlliepxu7gv4.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdmv6z4b5wlliepxu7gv4.JPG" alt="0xE9 JMP" width="484" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By following the function cross-references backward, I found the master setup function passing specific hexadecimal target offsets into this engine.&lt;br&gt;
The private server targets the offset &lt;em&gt;0x1D690&lt;/em&gt;.&lt;br&gt;
By loading the legacy game client into Ghidra and adding the standard base memory address, we find the exact injection point:&lt;br&gt;
&lt;em&gt;0x00400000 + 0x1D690 = 0x0041D690&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jumping to &lt;em&gt;0x0041D690&lt;/em&gt; in the original executable reveals the game's native &lt;strong&gt;XOR decryption loop&lt;/strong&gt;. The developers intentionally detoured the execution flow right before the game attempts to read its proprietary &lt;code&gt;.cch&lt;/code&gt; archive files.&lt;/p&gt;

&lt;h3&gt;
  
  
  DRM bypass
&lt;/h3&gt;

&lt;p&gt;By returning to &lt;em&gt;patch.dll&lt;/em&gt; and following the &lt;strong&gt;JMP&lt;/strong&gt; detour destination, I found the custom memory parser the developers wrote to replace the game's original cryptography.&lt;/p&gt;

&lt;p&gt;In legacy MMOs, network packets and game archive headers are often read in &lt;strong&gt;fixed-size structures&lt;/strong&gt;. &lt;br&gt;
The decompiled code utilizes a modulo operation pointing to &lt;em&gt;0x3c&lt;/em&gt; (equals to 60 in decimal), strongly suggesting that the custom &lt;em&gt;.hors&lt;/em&gt; archive files downloaded from MEGA contain headers that are &lt;strong&gt;exactly 60 bytes long.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inside this parser (labeled &lt;em&gt;FUN_10002a20&lt;/em&gt;), I found the final nail in the coffin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5xkdtgigafn4nzs0u2c.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5xkdtgigafn4nzs0u2c.JPG" alt="FNV-1a" width="313" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uVar5 is seeded with &lt;em&gt;0x811c9dc5&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;the loop XORs a byte of the file against the seed, &lt;/li&gt;
&lt;li&gt;it multiplies the result by &lt;em&gt;0x1000193&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FNV-1a&lt;/strong&gt; is a standard, incredibly fast hashing algorithm used to verify file integrity. It is &lt;strong&gt;not&lt;/strong&gt; encryption. The developers completely gutted the original proprietary DRM and replaced it with a simple &lt;strong&gt;FNV-1a checksum&lt;/strong&gt; to prevent players from modding the private server's files to cheat.&lt;/p&gt;

&lt;p&gt;Because the official game client &lt;strong&gt;doesn't know&lt;/strong&gt; how to read this custom 60-byte FNV-1a header, it crashes immediately if developers try to inspect the &lt;em&gt;.hors&lt;/em&gt; files using official internal tools. &lt;/p&gt;

&lt;p&gt;At the very end of the function, a "trampoline" pointer &lt;em&gt;(DAT_101068cc)(param_3)&lt;/em&gt; jumps back into the game's original code so the boot sequence can continue natively:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qeg53ypkfzbfqiljawo.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2qeg53ypkfzbfqiljawo.JPG" alt="Trampoline" width="538" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;malware&lt;/em&gt; panic was a false positive. The private server developers are simply utilizing aggressive evasion techniques (Tor tunneling, DLL hijacking, and inline hooking) to bypass &lt;strong&gt;corporate DRM&lt;/strong&gt; and network checks without distributing a permanently cracked executable.&lt;/p&gt;

&lt;p&gt;Because there is no actual encryption, extracting the proprietary assets is trivial. The .hors files are just standard game archives with 60 bytes of FNV-1a junk data tacked onto the beginning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's all from me, stay curious and don't let others fool you.&lt;br&gt;
With love... from Navier&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>software</category>
      <category>reviews</category>
    </item>
  </channel>
</rss>
