EchoRelay
is a proof-of-concept reimplementation of Echo VR's web services and dedicated game servers. It was created for
educational/research purposes, to explore video game backend infrastructure design and service implementations.
Echo VR's official servers were shut down on August 1st, 2023. EchoRelay
established the first networked match since that time, on August 29th, 2023.
This project was made public October 31st, 2023.
This project's aim is not to enable unofficial matches for the public, please read the see the Disclaimer section for more information about the project, its aim, goals, and sensitivities.
"さあ時の扉を開けて行こうよ"
Note: All research was solely done by me (@Xenomega). I am not a participant of any Echo VR community.
The following features are supported by EchoRelay
:
-offline
)-server
)-windowed
)-headless
)-lobbyid
, which requests joining a specific lobby by UUID)At a high level, Echo VR's original backend infrastructure can be boiled down to:
LOGIN
(websocket): User login, session management, account operations.CONFIG
(websocket): Seasonal in-game settings (e.g. season start/end, in-game display banners).MATCHING
(websocket): Fulfills client requests for matchmaking with a game server registered with SERVERDB
.SERVERDB
(websocket): Game server registration and game session management for clients joining through MATCHING
. TRANSACTION
(websocket): Provides an in-game store and transaction processing.API
(HTTP/HTTPS): An API server used to report server status, news, and record additional data.pnsradgameserver.dll
library from the game folder after startup (if it exists). This library satisfies an interface for the game to register and communicate with SERVERDB
and coordinate game sessions/matching.SERVERDB
service, and clients matchmake to a game server through the MATCHING
service (invoking further communication between SERVERDB
and the dedicated game server to accept the client).MATCHING
.EchoRelay
provides a C#.NET implementation of the abovementioned central services, and a library + patches to run the Echo VR game as a game server. Each project directory contains its own README with additional information:
Central services:
EchoRelay.Core
.EchoRelay.Core
.Dedicated game servers:
-server
, required to operate a game server).pnsradgameserver.dll
. It accepts requests to register the game server, listens for websocket messages from SERVERDB
such as starting a new session, accepting new players, rejecting/kicking a player, etc. pnsradgameserver.dll
, but specific to EchoRelay.Core
's central service reimplementation.This section discusses end-to-end installation of the system. However, if EchoRelay
servers are already operational, a minimal client setup
only requires a single JSON file provided by the server operator to be saved in the client's game folder, as noted in the later Setting up clients section.
You must acquire built libraries and executables for EchoRelay
to install them. There are two options:
EchoRelay.Cli
. Windows additionally supports EchoRelay.App
for a basic UI version..sln
) file in Visual Studio.EchoRelay.Patch
project.EchoRelay.Patch.dll
-> dbgcore.dll
, and rename EchoRelay.GameServer.dll
-> pnsradgameserver.dll
.EchoRelay.Cli
and EchoRelay.Core
can be built for other platforms by simply running the dotnet build
command, after installing the .NET 7.0 SDK.As the name suggests, central services are the main central endpoint which all clients/game servers will connect to (e.g. for logging in, matchmaking, discovery and registration of game servers). It should be at a stable/static IP.
Option 1: Using the WinForms UI app
EchoRelay.App
as an administrator. It will ask you to configure a storage folder and locate the Echo VR game executable. Note the TCP port number you set here.Storage
->Access Controls
tab of the application, to prevent unwanted connections from being established.Option 2: Using the command-line app
EchoRelay.Cli
as an administrator, with the argument -d
providing an existing, but empty storage directory for server resources, -p
for TCP port (default 777), etc.
EchoRelay.Cli --help
or read the project's README.--outputconfig
argument to save it to a file.Port forwarding
EchoRelay.App
or EchoRelay.Cli
on your router (and Windows or software-based firewalls, if enabled).
EchoRelay
only supports external/public IPs connections, hence why the service config is generated with your external IP.The central server should stay running for all services to work. The same storage folder should be used each time for persistent data across server restarts.
After central services are set up, you'll want to stand up some game servers. They will register themselves to central services, and central services will then use them to matchmake clients to. Game servers can run on machines independent on the central services, so long as they have the correct service config file, with the correct SERVERDB
API key.
dbgcore.dll
and pnsradgameserver.dll
into your game folder where echovr.exe
is located. ready-at-dawn-echo-arena/_local/config.json
.
displayname
and auth
parameters of the login service URI to values personal to your account, as specified by the FAQs section of this document.ready-at-dawn-echo-arena\sourcedb\rad15\json\r14\config\netconfig_dedicatedserver.json
, and note the port
and retries
JSON keys.
port
will be the first UDP port that game servers you start will try to bind to. If they fail, they will increase the port number for as many retries
as defined, and try again.
port
of 1234 and a retries
set to 10, game servers will bind to the first available UDP port in the range: 1234-1244retries
in the previous step to a larger number. This will avoid multiple game servers/clients reserving all these ports. Note that netconfig_client.json
is configured by default to also reserve one of these ports from the same range when a client is run.Every central server should have at least two game servers running: one for your player's current lobby, another for the player to transition to a new lobby with a new gametype.
EchoRelay.App
under Tools
->Launch Echo VR
if you are running game servers from the same machine.echovr.exe -server -headless -noovr
(standard, lightweight) or echovr.exe -server -windowed -noovr
(windowed mode with fly-cam) through a command prompt.
-noovr
. Use of OVR platform is not recommended.This section describes the setup required to get a player connected to a configured EchoRelay
network:
ready-at-dawn-echo-arena/_local/config.json
in the client's game folder.
serverdb_host
key in the service config should not be provided by the server operator, and they should enforce API key authentication to protect against unauthenticated game servers.displayname
and auth
parameters of the login service URI to values personal to their account, as specified by the FAQs section of this document.Now your EchoRelay
central services should be operational, game servers and clients should be configured to connect and matchmake to eachother!
This project is not intended to host unofficial services for the public, nor is it reflective of what true infrastructure might look like (e.g. use of a real web framework such as ASP.NET, integration with IIS, real database support, logging, monitoring, cloud-scalable/elastic microservices, secrets management, load balancing, rate limiting, isolation, etc).
Instead, EchoRelay
aims to provide a lightweight and portable proof-of-concept which shows the results of my work to those similarly interested
in exploring these topics for research/educational purposes. The proof-of-concept has been publicized so it can be potentially referenced in a future
document detailing design considerations for game server architecture and sharing reverse engineering techniques for those looking to educate themselves.
Echo VR is an online-enabled, free-to-play game which had its online services retired on August 1, 2023. Its compiled binaries do not employ anti-cheat mechanisms or any meaningful security mitigations. This made it an ideal target for me to explore the topic without introducing risk to an active online ecosystem or its users.
This project was developed with additional considerations to uphold ethical integrity and ensure fair-use:
APP_SECRET
needed to authenticate and obtain user information. This is never distributed, so no one (e.g. EchoRelay
) can access sensitive account details or authenticate users.TLDR: If you're not looking to explore reverse engineering techniques or server/service implementations as a personal researcher, this project is not meant for you. It should not be thought of as a feature-complete or bug-free server solution.
Will this be regularly maintained, and supported?
Why so many components? Why not simplify it?
EchoRelay.Patch
) in addition to their typical architectural design, to unlock, hook, and recreate the game server/headless functionality.Why only the PC VR version of the game? Why not the Quest APK?
What are the displayname
and auth
parameters in the LOGIN
service endpoint?
auth
parameter, when set once on login, will be verified to match on all future logins to prevent clients with another user's user identifier from logging into their account on the server.displayname
parameter can be used. Your account's display name can be changed on each login. Your account will otherwise remain the same as this is not a user name or unique user identifier.What is API key authentication for SERVERDB
?
api_key
) to the serverdb_host
endpoint in the generated service config.Tools
->Settings
for all game servers connecting, otherwise they will be rejected.Why do I need to port forward and use external IPs?
Why don't central services leverage SSL/TLS?
EchoRelay.Core
's server implementation is trivial, but was considered uninteresting for the purpose of this proof-of-concept.Will EchoRelay overwrite my profile prior to the official server shutdown?
Is it possible to restore profiles prior to official server shutdown?
%LOCALAPPDATA%\rad
.EchoRelay.Core
server's account resources.Why is my game in a persistently broken state (e.g. permanently 'ghosted', persistently "failed to connect" to a specific gametype, etc)?
ready-at-dawn-echo-arena\_local\r14logs\*
for additional information with any issues you have.%LOCALAPPDATA%\rad\
folder. Restore original game files and re-install EchoRelay
. Can I use your code in my own projects?
EchoRelay
to any malicious or unlawful behavior.Thanks to (@Xenomega for creating this project and for bringing EchoVR back.
Thanks to @dualgame for information about how different user flows are expected to work, you were a tremendous help in providing context, so this could be reimplemented and operate as expected.