macronator/ProxyBase

GitHub: macronator/ProxyBase

专为 Dark Ages(7.41)客户端设计的 C# 中间人封包代理框架,提供封包解密、日志记录与修改能力,作为构建自定义游戏工具的起点。

Stars: 0 | Forks: 0

# ProxyBase 一个轻量级、可扩展的**中间人网络代理**,专为 MMORPG **Dark Ages**(客户端版本 **7.41**)编写,使用 C#(.NET Framework 4.8, WinForms)开发。它位于游戏客户端和游戏服务器之间,实时解密并记录封包流,允许你挂钩单个封包 opcode 以检查或修改流量。 它旨在作为一个**起点(一个“基础”)**,用于构建你自己的工具——封包分析器、自动化、研究实用程序等。 ## 工作原理 1. 一个 `TcpListener` 监听 `127.0.0.1:2610`。 2. 通过 **File → Launch Dark Ages**,代理会以挂起状态启动 `Darkages.exe`,并修补其内存(通过 `ReadProcessMemory` / `WriteProcessMemory`),使客户端连接到 `127.0.0.1:2610` 而不是实际服务器,然后恢复进程。 3. 当客户端连接时,代理会开启自己的连接到**真实**服务器(默认为 `52.88.55.94:2610`)并双向转发流量。 4. 每个封包都会被解析(`ClientPacket` / `ServerPacket`)、解密、记录到相应的连接选项卡中,可选择性地通过已注册的 handler 处理,然后重新加密并转发。 5. 服务器**重定向**封包(例如,登录服务器 → 世界服务器)会被拦截,因此代理会跟随客户端连接到下一个服务器,同时保持客户端指向 localhost。 ## 功能 - 基于 loopback 的透明客户端 ↔ 服务器封包转发 - 完整实现了 Dark Ages 封包加密(密钥/盐表、基于序号的 XOR、MD5 完整性字节)以及对话框 CRC/加密——并针对逆向工程的客户端进行了交叉验证 - 从协议中还原的命名 `ClientOpcode` / `ServerOpcode` 枚举(`Opcodes.cs`),因此 handler 可以通过名称读取,而不是硬编码的数字 - 带有实时传入/传出封包日志的每连接 UI 选项卡 - 简单的 `opcode → handler` 注册模型,用于检查或重写封包 - 通过 Win32 P/Invoke(`kernel32`)进行内存客户端修补 ## 系统要求 - Windows - .NET Framework 4.8 — 内置于 Windows 10 (1903+) 和 Windows 11 中,因此最终用户通常无需安装额外的运行时。构建项目需要 .NET Framework 4.8 目标包(随当前的 Visual Studio 一起提供)。 - Visual Studio 2019 或更高版本(项目使用现代 SDK 风格格式),或用于命令行构建的 .NET SDK / MSBuild - 已安装的 Dark Ages 客户端(默认路径 `C:\KRU\Dark Ages\Darkages.exe`) ## 构建说明 在 Visual Studio (2019+) 中打开 `ProxyBase.sln` 并进行构建(`Ctrl+Shift+B`),或者在仓库根目录下的终端中运行: ``` dotnet build ``` 该项目以 .NET Framework 4.8 为目标,并固定为 **x86**(因为它修补的是 32 位客户端),因此无需选择平台。输出文件位于 `ProxyBase\bin\Debug\net48\`(或 `bin\Release\net48\`)。 ## 用法 1. 构建并运行 `ProxyBase.exe`。 2. **Options → Choose DA Path…** — 输入你的 `Darkages.exe` 路径,或点击 **Browse** 进行定位,然后点击 **OK**。你的选择会在多次运行中保持记忆。(如果未设置,**Launch Dark Ages** 会在首次启动时打开此对话框,并预填充 `Config.cs` 中的默认值。) 3. **File → Launch Dark Ages** — 代理将启动客户端,对其进行修补以通过代理连接,随后将打开一个选项卡显示实时的封包流。 ## 配置 — 这是特定于版本和服务器的 所有可调整的设置都位于同一个文件中:**`ProxyBase/Config.cs`**。此基础版是针对一个特定的客户端构建版本(**7.41**)和一个特定的服务器构建的,因此要在你自己的环境中使用它,你很可能需要更改: | 设置 (`Config.cs`) | 默认值 | 备注 | |---|---|---| | `RemoteServerIp` / `RemoteServerPort` | `52.88.55.94` / `2610` | 代理向外连接的真实游戏服务器。 | | `LocalListenPort` | `2610` | 代理监听并将客户端重定向到的 Loopback 端口(在监听器、内存补丁和重定向重写之间保持同步)。 | | `ClientPath` | `C:\KRU\Dark Ages\Darkages.exe` | 默认客户端路径。你也可以在运行时通过 **Options → Choose DA Path…** 进行设置(跨多次运行保持记忆),这会覆盖此默认值。 | | `PatchForceJump`, `PatchConnectIp`, `PatchConnectPort`, `PatchSecondJump` | `0x004333A2` … | 将客户端重定向到 localhost 的客户端内存偏移量。**特定于某一个 `Darkages.exe` 构建版本** — 不同的客户端版本需要不同的偏移量。 | ## 扩展 — 添加封包 handler Handler 在 `Server.cs` 中按 opcode 进行注册。每个 handler 返回 `true` 以转发封包,或返回 `false` 以丢弃封包。基础版中已有的示例: ``` // In the Server constructor (opcodes are named in Opcodes.cs): ClientMessageHandlers[(byte)ClientOpcode.EncryptionKey] = new ClientMessageHandler(ClientMessage_0x10_ClientJoin); ServerMessageHandlers[(byte)ServerOpcode.Redirect] = new ServerMessageHandler(ServerMessage_0x03_Redirect); // A handler: public bool ServerMessage_0x0A_SystemMessage(Client client, ServerPacket msg) { var type = msg.ReadByte(); // wire layout from the protocol RE: var length = msg.ReadUInt16(); // type:u8, length:u16(BE), text[length] var text = msg.ReadString(length); // ... inspect or modify the packet ... return true; // return false to drop it instead of forwarding } ``` 使用 `Packet` 读取器/写入器辅助方法(`ReadByte`、`ReadString8`、`ReadUInt32`、`WriteString8`、...)来解析和构建封包主体。`Server.cs` 提供了两个只读的示例 handler(`ServerMessage_0x0A_SystemMessage`、`ServerMessage_0x0C_CreatureWalk`),它们根据逆向工程得出的结构解码封包并记录字段 —— 你可以删除它们或将它们作为模板使用。 ## 项目结构 | 文件 | 用途 | |---|---| | `Program.cs` | 入口点;全局同步对象和 MD5 辅助类。 | | `Config.cs` | 核心设置:服务器/客户端端点和客户端内存补丁偏移量。 | | `MainForm.cs` | 主窗口;启动并修补客户端;承载连接选项卡。 | | `Server.cs` | 监听客户端,生成 `Client` 中继,注册封包 handler。 | | `Client.cs` | 一个客户端 ↔ 服务器中继:异步接收/发送循环、队列、密钥生成。 | | `Packet.cs` | `Packet` 基类 + `ClientPacket` / `ServerPacket`:封包分帧、加密、对话框加密、盐和 CRC 表。 | | `Opcodes.cs` | `ClientOpcode` / `ServerOpcode` 枚举:从协议中还原的命名封包 opcode。 | | `ClientTab.cs` | 带有封包记录和手动发送/接收功能的每连接 UI 选项卡。 | | `ProcessMemoryStream.cs` | 基于其他进程内存的 `Stream`(用于客户端修补)。 | | `Kernel32.cs` | Win32 P/Invoke 声明。 | ## 许可证 该项目基于 [MIT 许可证](LICENSE) 发布。 原始基础版 © 2012 **Acht** · 由 **macronator** (2026) 进行清理、移植到 .NET Framework 4.8 并重新发布。
标签:HTTP工具, WinForms, 中间人代理, 内存修改, 安全合规, 封包拦截, 游戏, 网络代理