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, 中间人代理, 内存修改, 安全合规, 封包拦截, 游戏, 网络代理