sw1ndle777/MegaVoltsPP

GitHub: sw1ndle777/MegaVoltsPP

基于 C++23 从零构建的 MicroVolts 游戏完整私服服务器,精确复刻了原版网络协议与加密机制,可作为官方后端的直接替代品。

Stars: 0 | Forks: 0

# MegaVoltsPP 一个完全逆向工程的** MicroVolts ** 私服(Plaza 1.0.0 至 1.0.3 版本,约 2013 年)。在使用 IDA Pro 进行多年的二进制分析后,采用现代 C++23 从零开始构建,这是唯一成功复刻了原版游戏网络协议、加密机制和游戏系统的私服实现。 该服务器处理了完整的游戏生命周期:认证、大厅管理、房间创建、实时比赛玩法、物品经济、战队、社交系统、聊天、邮件、通行证等。它与未经修改的正式客户端进行通信,作为原版后端的直接替代品。 此外,还提供了对较旧和较新客户端版本的跨版本可选支持,不过这些路径已被弃用,建议以 1.0.3 版本为目标。 ## 架构 MegaVoltsPP 以三个协作的服务器进程运行,它们通过持久的 IPC 层进行通信: | 进程 | 职责 | |---------|------| | **Front** | 登录网关。处理客户端认证(用户名/密码或重连密钥)、加密握手,并将玩家路由至 Main。 | | **Main** | 大厅与游戏逻辑。管理频道、房间、队伍、匹配、物品栏、物品商店、gacha、战队、好友、邮件、聊天、通行证、每日/每周/每月奖励、审核,以及所有赛前/赛后状态。 | | **Cast** | 实时对局中继。处理比赛内的游戏玩法:玩家移动批处理、武器攻击(步枪、霰弹枪、狙击枪、加特林、近战、投射物)、NPC 生成、物品拾取/补给包掉落、炸弹模式、复活、tick 同步以及主机权威战斗。 | ### 网络 - **异步 I/O**:所有网络均基于 [Asio](https://think-async.com/Asio/)(独立版,非 Boost)构建,利用 `io_context` 和 strands 实现无锁并发调度。 - **多线程**:每个服务器在 `io_context` 上运行一个可配置的 `std::jthread` 工作线程池,并配有用于检测线程卡顿的 watchdog。 - **协议**:自定义二进制 TCP 协议,带有 8 字节的包头。数据包使用带有每会话序列密钥的 RC5/RC6 密码进行加密,与原版客户端实现相匹配。 - **IPC**:Front/Main/Cast 之间的进程间通信使用持久的 TCP 连接,具备自动重连和二进制消息帧功能。 - **限流**:基于每个数据包的限流,具有可配置的规则、冷却时间、违规跟踪和基于身份的黑名单机制。 ### 数据库 双数据库后端,共享 `IDatabase` 接口: - **MariaDB**,通过 mariadb-connector-cpp - **PostgreSQL**,通过 libpqxx 所有数据库写入操作都通过事务批处理 pipeline 进行,该 pipeline 在持久化之前验证缓存中的更改,并在连接丢失时自动重新连接。数据库任务被分派到专用的线程池,以保持 I/O 线程的响应速度。 ### 安全与反作弊 - **加密**:完整的 RC5(32/64 位块)和 RC6(128 位块)密码实现及密钥扩展,与原版客户端的加密实现逐字节匹配——此外还对密码调度、密钥调度和错误处理进行了原版客户端未提供的自定义修改和扩展。 - **包头加密**:自定义 TCP 包头混淆层,包含位旋转、半字节交换、XOR 掩码以及原版协议中不存在的额外篡改处理。 - **密码哈希**:通过 Monocypher 进行基于 Argon2 的密码哈希处理,每个账户具有独立的 salts。 - **MegaGuard**:用于配套反作弊项目(注入客户端的独立 DLL)的通信协议,具有心跳验证。 - **数据包验证**:边界检查、大小验证和畸形数据包拒绝,以防止因精心构造的输入导致的崩溃。 ### 监控 - **BetterStack 心跳**:受 `io_context` 存活状态控制的 HTTPS 心跳 ping。如果服务器崩溃或挂起,心跳将停止,监控状态将翻转为宕机。 - **崩溃报告**:集成了 Crashpad 用于收集崩溃转储,并在触发 `std::terminate` 时自动发送 `/fail` 心跳。 - **Watchdog**:线程级 watchdog,可检测并记录卡顿的 handler 执行情况。 ## 依赖项 通过 [vcpkg](https://vcpkg.io/) 管理(由 CMake 自动获取): | 库 | 用途 | |---------|---------| | [Asio](https://think-async.com/Asio/) | 异步网络与 I/O | | [fmt](https://fmt.dev/) | 文本格式化与彩色控制台输出 | | [Crashpad](https://chromium.googlesource.com/crashpad/crashpad/) | 崩溃转储收集 | | [MariaDB Connector/C++](https://mariadb.com/kb/en/mariadb-connector-cpp/) | MariaDB 数据库驱动 | | [libpqxx](https://pqxx.org/libpqxx/) | PostgreSQL 数据库驱动 | | [OpenSSL](https://www.openssl.org/) | 用于心跳 HTTPS 和安全连接的 TLS | | [libsodium](https://libsodium.gitbook.io/) | 密码学原语 | | [RapidJSON](https://rapidjson.org/) | JSON 配置解析 | | [Monocypher](https://monocypher.org/) | 密码哈希 | | [magic_enum](https://github.com/Neargye/magic_enum) | 枚举反射 | | [Boost.Unordered](https://www.boost.org/doc/libs/release/libs/unordered/) | 用于性能关键型查找的 `flat_map` / `flat_set` | | [thread-pool](https://github.com/bshoshany/thread-pool) | 数据库线程池 | | [Google Test](https://github.com/google/googletest) | 单元测试 | ## 构建 ### 要求 - **CMake** 3.30+ 与 [cmkr](https://cmkr.build/)(`cmake.toml` 生成 `CMakeLists.txt`) - 支持 **C++23** 的编译器(MSVC、Clang 或 GCC) - **Ninja**(推荐)或任何 CMake 生成器 - Git(用于自动获取 vcpkg) vcpkg 会在首次配置时由 CMake 自动下载并引导安装。无需手动安装 vcpkg。 ### Windows (MSVC) ``` # 在 Visual Studio Developer Command Prompt (vcvars64) 中 cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build --target front main cast ``` ### Windows (Clang) ``` # 需要安装 LLVM/Clang 19+ cmake -S . -B build -G Ninja ^ -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ^ -DCMAKE_BUILD_TYPE=Release cmake --build build --target front main cast ``` ### Windows (clang-cl) ``` # 在 Visual Studio Developer Command Prompt 中 cmake -S . -B build -G Ninja ^ -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl ^ -DCMAKE_BUILD_TYPE=Release cmake --build build --target front main cast ``` ### Linux (Clang) ``` sudo apt install clang-20 ninja-build CC=clang-20 CXX=clang++-20 cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build --target front main cast ``` ### Linux (GCC) ``` sudo apt install gcc-15 g++-15 ninja-build CC=gcc-15 CXX=g++-15 cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build --target front main cast ``` 二进制文件输出至 `out/-/bin/Release/`。 ### 构建选项 | 选项 | 默认值 | 描述 | |--------|---------|-------------| | `MVPP_MARCH_NATIVE` | `ON` | 为本地构建使用 `-march=native`。设置为 `OFF` 则用于可移植/Docker 构建(回退至 `x86-64-v2`)。 | 如果环境中可用,构建系统还会自动检测并使用 `ccache` 或 `sccache`。 ### 运行测试 ``` cmake --build build --target unit_tests ctest --test-dir build --output-on-failure ``` 测试使用 [Google Test](https://github.com/google/googletest) 构建,涵盖: - **Crypto**:认证密钥生成,BLAKE2b 哈希,Argon2 密码哈希 - **Database**:错误处理,驱动工厂,SQL 占位符生成 - **Game logic**:Boss 奖励,货币验证,gacha 保底机制,物品升级,加权选择,序列号分配,礼包物品 - **Room**:队伍平衡,投票踢人规则 - **Utility**:Base64 编码/解码,昵称验证,时长解析,数字解析,安全字符串读取,URL 解析,时间工具 - **Stress**:连接压力测试 ## Docker ### 构建镜像 ``` docker build -f docker/Dockerfile.server -t megavoltspp-server:clang19 . ``` Dockerfile 采用多阶段构建:在 Ubuntu 24.04 上使用 Clang 19 进行编译,然后生成仅包含二进制文件和共享库的最小化运行时镜像。 ### 使用 Docker Compose 运行 ``` # 启动所有三个服务器(通过环境变量或 .env 文件设置 DB 凭据) docker compose up -d # 或者使用本地 MariaDB 实例启动 docker compose --profile local-db up -d # 或者使用本地 PostgreSQL 实例启动 docker compose --profile local-pg up -d ``` compose 文件在共享的网桥网络上使用静态 IP 启动三个容器(front、main、cast)。每个服务器的端口、IPC 端口和数据库凭据均可通过环境变量进行配置。 #### 环境变量 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `MVPP_DB_DRIVER` | `mariadb` | 数据库驱动(`mariadb` 或 `postgresql`) | | `MVPP_DB_HOST` | `host.docker.internal` | 数据库主机 | | `MVPP_DB_PORT` | `3306` | 数据库端口 | | `MVPP_DB_NAME` | `megavoltspp` | 数据库名称 | | `MVPP_DB_USER` | `root` | 数据库用户名 | | `MVPP_DB_PASSWORD` | *(必填)* | 数据库密码 | | `MVPP_FRONT_PORT` | `13000` | Front 服务器客户端端口 | | `MVPP_MAIN_PORT` | `13005` | Main 服务器端口 | | `MVPP_CAST_PORT` | `13006` | Cast 服务器端口 | 有关可配置端口和网络设置的完整列表,请参见 `docker-compose.yml`。 ## 配置 服务器在启动时读取 `settings.json`。该文件包含服务器绑定地址、端口、数据库凭据和功能标志。由于包含敏感信息,它被排除在版本控制(`.gitignore`)之外。 在容器中运行时,Docker 入口脚本(`docker/configure_settings.py`)会根据环境变量自动生成配置文件。 对于本地开发,请在工作目录中创建一个 `settings.json`,并填入您的数据库连接详细信息和服务器地址。
标签:Bash脚本, C++23, 云资产清单, 内核驱动, 多人在线游戏, 安全测试工具, 异步IO, 微伏特, 测试用例, 游戏服务器, 网络协议, 请求拦截, 逆向工程