MuDevs S21 1-2/2-3 License Server Emulator

Newbie Spellweaver
Joined
Jul 31, 2026
Messages
14
Reaction score
87
Hello there,

Sharing with you a 100% compatible License Server for MuDevs Season 21 Part 1-2 and Part 2-3 (not sure).

Before anything else, I'd like to thank the different people who helped me throughout this research. Whether it was by sharing information, discussing ideas, or simply pointing me in the right direction, they all contributed in one way or another. I won't mention anyone by name unless they explicitly ask me to.

What's included in this release?​

  • MuDevLicenseEmulator v1.1.1 (latest version and probably my last release for this project).
  • Trust Client S21 Part 1-2.
  • MuDevs PREMIUM S21 Server.

MuDevLicenseEmulator v1.1.1​

The emulator is provided completely unpacked and unobfuscated. There are no protectors, packers, or anything hidden. I'd say almost anyone, especially with today's AI tools, can inspect the code, understand how it works, and even create their own revisions. If it's not too much to ask... please don't remove my name from the credits. 😄

I'll also be publishing the source code on GitHub soon in case someone from the community wants to fork the project and continue maintaining or improving it. There isn't much magic behind it—almost the entire project lives in a single source file. If is not that muc

I'd also like to make one thing very clear: this application does not modify files, inject code, install drivers, or perform any suspicious actions. Its only purpose is to intercept the license server communication and reply with a valid license response. If you're unsure, feel free to inspect the source code and verify everything yourself. You still need to edit your host file.

ie
Code:
127.0.0.1 l1.mudevs.com
127.0.0.1 l2.mudevs.com
127.0.0.1 l3.mudevs.com

1785812874041 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums

sha: a51537ce91260fd6ec718c6fa49386a95571725bd1fcad8ff4fc69e3c18c4620
user limit cap: 9999


Trust Client S21 Part 1-2​

A compatible client is included with this release.

At the moment, MuDevs still relies on the CustomerName value as part of its license validation. This means the CustomerName must match exactly on both the client and the server.

The included client already comes with a main.devs configured using CustomerName 511. All you need to do is change the server IP and configure the same CustomerName on your server.

As usual, the Version, Serial, and any other client settings must also match the server configuration.

If you generate a new main.devs file later, don't forget to update the server configuration as well so both sides continue using the same values.
1785812987476 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums




Launcher
you need to use a laucnher.

source: unkwnown


MuDevs PREMIUM S21​

The original MuDevs PREMIUM S21 server is included and is fully compatible with the License Emulator provided in this release.

1785813070502 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums

1785813584230 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums



The server configuration is basically the same as any other mu server. You'll only need to change a few IP addresses and not much else. There's really nothing complicated about it.
With this configuration, I was able to connect and stay online for more than 6 hours without any issues. So far, I haven't encountered any problems.
That said, there are probably better ways to configure it, so don't treat these settings as the only or "correct" way to do it. Time will tell as more people test and refine the setup.

1785813979249 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums



Also included as a little bonus is a script to read and write any main.devs file. It was the same tool I used throughout the research process.
If anyone feels like building a native Windows application around it, that would be awesome.


Python:
#!/usr/bin/env python3
from __future__ import annotations

import hashlib
import json
import sys
from pathlib import Path


XOR_KEY = 0xDA
SUB_KEY = 0x65
LATIN_TEXT_BYTES = {
    0xC1, 0xC3, 0xC7, 0xC9, 0xCD, 0xD1, 0xD3, 0xD5, 0xDA,
    0xE1, 0xE3, 0xE7, 0xE9, 0xED, 0xF1, 0xF3, 0xF5, 0xFA,
}


def decrypt(data: bytes) -> bytes:
    return bytes(
        ((value + (SUB_KEY ^ ((index >> 8) & 0xFF))) & 0xFF)
        ^ (XOR_KEY ^ (index & 0xFF))
        for index, value in enumerate(data)
    )


def encrypt(data: bytes) -> bytes:
    return bytes(
        (
            (value ^ (XOR_KEY ^ (index & 0xFF)))
            - (SUB_KEY ^ ((index >> 8) & 0xFF))
        )
        & 0xFF
        for index, value in enumerate(data)
    )


def fixed_string(data: bytes) -> str:
    return data.split(b"\0", 1)[0].decode("ascii", "replace")


def ascii_strings(data: bytes, minimum: int = 4) -> list[dict[str, object]]:
    results: list[dict[str, object]] = []
    start = None
    for index, value in enumerate(data + b"\0"):
        if 32 <= value <= 126 or value in LATIN_TEXT_BYTES:
            if start is None:
                start = index
        elif start is not None:
            if index - start >= minimum:
                results.append(
                    {
                        "offset": start,
                        "offset_hex": f"0x{start:08X}",
                        "encoding": "windows-1252",
                        "value": data[start:index].decode("windows-1252", "replace"),
                    }
                )
            start = None
    return results


def utf16le_strings(data: bytes, minimum: int = 4) -> list[dict[str, object]]:
    results: list[dict[str, object]] = []
    index = 0
    while index + 1 < len(data):
        start = index
        chars = []
        while index + 1 < len(data) and 32 <= data[index] <= 126 and data[index + 1] == 0:
            chars.append(chr(data[index]))
            index += 2
        if len(chars) >= minimum:
            results.append(
                {
                    "offset": start,
                    "offset_hex": f"0x{start:08X}",
                    "encoding": "utf-16le",
                    "value": "".join(chars),
                }
            )
        index = max(index + 1, start + 1)
    return results


source = Path(sys.argv[1])
output = Path(sys.argv[2])
output.mkdir(parents=True, exist_ok=True)

encrypted = source.read_bytes()
plain = decrypt(encrypted)
round_trip = encrypt(plain)

fields = {
    "launcher_type": plain[0],
    "customer_name": fixed_string(plain[1:33]),
    "ip": fixed_string(plain[33:65]),
    "port": int.from_bytes(plain[66:68], "little"),
    "version": fixed_string(plain[68:76]),
    "serial": fixed_string(plain[76:93]),
    "window_name": fixed_string(plain[380:412]),
    "screenshot_path": fixed_string(plain[412:462]),
    "client_name": fixed_string(plain[462:494]),
    "main_dll": fixed_string(plain[686:718]),
    "lang_mpr_password": fixed_string(plain[718:750]),
}

strings = ascii_strings(plain) + utf16le_strings(plain)
strings.sort(key=lambda item: (int(item["offset"]), str(item["encoding"])))

report = {
    "source": str(source),
    "size": len(encrypted),
    "encrypted_sha256": hashlib.sha256(encrypted).hexdigest(),
    "decrypted_sha256": hashlib.sha256(plain).hexdigest(),
    "round_trip_exact": round_trip == encrypted,
    "fields": fields,
    "string_count": len(strings),
    "strings": strings,
}

(output / "main.devs.decrypted.bin").write_bytes(plain)
(output / "main.devs.reencrypted.bin").write_bytes(round_trip)
(output / "main.devs.report.json").write_text(
    json.dumps(report, indent=2, ensure_ascii=True) + "\n", encoding="ascii"
)

with (output / "main.devs.strings.txt").open("w", encoding="utf-8") as handle:
    for item in strings:
        handle.write(f"{item['offset_hex']} [{item['encoding']}] {item['value']}\n")

with (output / "main.devs.hex.txt").open("w", encoding="ascii") as handle:
    for offset in range(0, len(plain), 16):
        chunk = plain[offset:offset + 16]
        hex_bytes = " ".join(f"{value:02X}" for value in chunk)
        text = "".join(chr(value) if 32 <= value <= 126 else "." for value in chunk)
        handle.write(f"{offset:08X}  {hex_bytes:<47}  {text}\n")

print(json.dumps({key: value for key, value in report.items() if key != "strings"}, indent=2))



The goal has been accomplished.

I'd really like to see the community keep sharing and releasing new things whenever possible. This game was a big part of my teenage years, just like it was for many of you. I hope this release helps others learn, build new projects, and keep the community moving forward.

There's still plenty to discover, improve, and share. Hopefully this is just another step that encourages more people to contribute.

Enjoy, and make good use of it.

rivotril_ out.
 
Last edited:
I'm attaching a main.dev editor created using rivotril_'s code with the help of Claude AI. Using it, I was able to get the server running without any issues. Simply edit the main.devs file included with the client and enter your own settings.

 
Last edited:
Thank you for this, bro!

I'm attaching a main.dev editor created using rivotril_'s code with the help of Claude AI. Using it, I was able to get the server running without any issues. Simply edit the main.devs file included with the client and enter your own settings.

1785820989173 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums


Should i replace this same with the serverfiles, bro?


1785821057933 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums

i can change the customer name, right?

1785821162304 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums





Did i missed something?

Done: Changing IP, Customer name to 511, done inserting this "127.0.0.1 l1.mudevs.com<br>127.0.0.1 l2.mudevs.com<br>127.0.0.1 l3.mudevs.com" to system32/driver/etc/host.
 
Last edited:
MuDevsLicenseEmulator 1.2.1 is out! It now supports both the Client Editor and Server Editor, so at this point you can pretty much do everything.

1785822095582 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums


When I started this project, there was absolutely nothing available. After a while, things slowly started to open up, and near the end this showed up (I'm guessing it was intentionally published): . It gave me the final missing piece: the player count. During my tests, what looked like a simple, meaningless 0 turned out to be the maximum number of players the GameServer was allowed to handle!


Long story short, go check out . It's a really solid project, production-quality, and it can even run as a service. Very impressive work—thanks a lot, evtnlife!


Basically, both applications do the same thing, so either one will work.


I'm also sharing the MuDevsLicenseEmulator repository: . Feel free to fork it, improve it, or do whatever you want with it! In the Releases section, you can download the latest prebuilt binary, which includes a ton of fixes (after reviewing evtnlife's project) along with support for both the Client Editor and Server Editor.

Editors

1785822144106 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums




The only thing I think is still missing is for the community to put some effort into obtaining and sharing a main.devs file packed with custom content. That way, we can examine it, understand how it's generated, and hopefully document or reproduce the process.

Thank you for this, bro!


View attachment 306646

Should i replace this same with the serverfiles, bro?


View attachment 306647
i can change the customer name, right?

View attachment 306648




Did i missed something?

Done: Changing IP, Customer name to 511, done inserting this "127.0.0.1 l1.mudevs.com<br>127.0.0.1 l2.mudevs.com<br>127.0.0.1 l3.mudevs.com" to system32/driver/etc/host.

wrong customer name in sever files. remember they must match.
 
Last edited:
Done sir now i can connec
MuDevsLicenseEmulator 1.2.1 is out! It now supports both the Client Editor and Server Editor, so at this point you can pretty much do everything.

View attachment 306649

When I started this project, there was absolutely nothing available. After a while, things slowly started to open up, and near the end this showed up (I'm guessing it was intentionally published): . It gave me the final missing piece: the player count. During my tests, what looked like a simple, meaningless 0 turned out to be the maximum number of players the GameServer was allowed to handle!


Long story short, go check out . It's a really solid project, production-quality, and it can even run as a service. Very impressive work—thanks a lot, evtnlife!


Basically, both applications do the same thing, so either one will work.


I'm also sharing the MuDevsLicenseEmulator repository: . Feel free to fork it, improve it, or do whatever you want with it! In the Releases section, you can download the latest prebuilt binary, which includes a ton of fixes (after reviewing evtnlife's project) along with support for both the Client Editor and Server Editor.

Editores

View attachment 306650




The only thing I think is still missing is for the community to put some effort into obtaining and sharing a main.devs file packed with custom content. That way, we can examine it, understand how it's generated, and hopefully document or reproduce the process.


wrong customer name in sever files. remember they must match.
Done sir, i forget to change the version which need to copy from main.dev to gameserver and gameserverCS. now i need to find editor to create account.
 
Done sir now i can connec

Done sir, i forget to change the version which need to copy from main.dev to gameserver and gameserverCS. now i need to find editor to create account.
Take a look further up

Unable to download client
Got you, bro. Up and running
 
Thank you so much for sharing this!!!
MuDevsLicenseEmulator 1.2.1 is out! It now supports both the Client Editor and Server Editor, so at this point you can pretty much do everything.

View attachment 306649

When I started this project, there was absolutely nothing available. After a while, things slowly started to open up, and near the end this showed up (I'm guessing it was intentionally published): . It gave me the final missing piece: the player count. During my tests, what looked like a simple, meaningless 0 turned out to be the maximum number of players the GameServer was allowed to handle!


Long story short, go check out . It's a really solid project, production-quality, and it can even run as a service. Very impressive work—thanks a lot, evtnlife!


Basically, both applications do the same thing, so either one will work.


I'm also sharing the MuDevsLicenseEmulator repository: . Feel free to fork it, improve it, or do whatever you want with it! In the Releases section, you can download the latest prebuilt binary, which includes a ton of fixes (after reviewing evtnlife's project) along with support for both the Client Editor and Server Editor.

Editors

View attachment 306650



The only thing I think is still missing is for the community to put some effort into obtaining and sharing a main.devs file packed with custom content. That way, we can examine it, understand how it's generated, and hopefully document or reproduce the process.


wrong customer name in sever files. remember they must match.


This link has expired, can you reup please?
 
Thank you so much for sharing this!!!



This link has expired, can you reup please?
try this
 
When I click on login, a "server full" message appears.
 

Attachments

  • Screen(08_04-16-01)-0004 - MuDevs S21 1-2/2-3 License Server Emulator - RaGEZONE Forums
    Screen(08_04-16-01)-0004.webp
    212.8 KB · Views: 24
Last edited:
Louis got cracked (Offline now btw), now its MuDevs.. What's next? IGCN?
 
Back