Louisdelez/LeagueOfLegendsV2
GitHub: Louisdelez/LeagueOfLegendsV2
一个针对英雄联盟现代客户端(16.6 版本)的私服模拟器,通过完整的协议逆向工程实现了与真实客户端的连接通信。
Stars: 0 | Forks: 0
# 英雄联盟私服
一个英雄联盟(16.6 版本)的私服模拟器,兼容真实的现代 LoL 客户端。
## 已实现功能
- 客户端启动并连接到我们的服务器(达到 "Hard Connect" 状态)
- 完整的 Blowfish Double CFB 加密/解密(逐字节验证)
- Echo 握手完成(519 -> 119 -> 64 -> 34 -> 27 -> 19B 序列)
- 通过 Ghidra 逆向工程还原 CRC-32/MPEG-2 nonce 计算
- 通过自定义 DLL hook(`version.dll` 代理)进行网络数据包捕获
- 游戏逻辑就绪:165 个英雄、138 个物品、技能、野区、视野、增益效果
## 正在进行的工作
- 通过 Cheat Engine 内核驱动程序实现运行时 CRC 绕过(待重启)
- CRC 绕过后:游戏初始化数据包(KeyCheck、StartGame 等)
## 协议(完全逆向工程)
| 层级 | 描述 |
|-------|-------------|
| 传输层 | 通过 `ws2_32.dll` 中的 `sendto` 进行 UDP 通信 |
| 成帧层 | LENet(ENet 分支),大端序,519 字节客户端数据包 |
| 加密 | **Blowfish Double CFB** (加密 -> 反转所有字节 -> 加密),IV=0 |
| 密钥 | 来自 `gameconfig.json`:`17BLOhi6KZsTtldTsizvHg==` (base64,16 字节) |
| 完整性 | 数据包头部的 CRC-32/MPEG-2 nonce,多项式为 `0x04C11DB7` |
| 反作弊 | `stub.dll` 在 `.text` 段设置保护页,阻止所有 ring-3 内存写入 |
### 数据包格式
**客户端 -> 服务器:**
```
[4B magic 0x37AA0014][4B sessionID LE][encrypted payload][2B footer EDF9]
```
**服务器 -> 客户端:**
```
Plaintext: [2B peerID LE][4B CRC_NONCE BE][1B flags][ENet commands...]
Encrypted: DoubleCfbEncrypt(plaintext)
Sent: [4B connectToken BE (skipped by client)][encrypted bytes]
```
### CRC Nonce 计算
CRC 是基于一个**栈结构体**(而不是数据包负载)计算的:
```
Init: (byte[8] | 0xFFFFFF00) ^ 0xB1F740B4 (byte[8] = 0)
Feed: byte[9]=0, bytes[0..7]=1 as int64 LE, 8x 0xFF
Nonce: ~crc = 0x8DFE1964
```
## 架构
```
D:\LeagueOfLegendsV2\
|-- server/src/
| |-- LoLServer.Console/ Game server + analysis tools
| |-- LoLServer.Core/ Network, protocol, game logic
| |-- LoLServer.Launcher/ Client launcher
|
|-- nethook/ C hook DLLs (version.dll proxy)
| |-- version_proxy.c sendto/recvfrom hooks, CRC struct dump, HW BP attempts
| |-- fake_stub.c Dummy anti-cheat (blocked by integrity check)
|
|-- ghidra_scripts/ Ghidra analysis scripts (Java)
|-- ce_kernel_patch.lua Cheat Engine CRC bypass script
|-- start-client.bat Client launcher with full arguments
|-- launch-game.bat Simple client launcher
|
|-- client-private/Game/ Private copy of LoL client (not in repo)
```
## 技术栈
- **服务器:** C# .NET 8, Blowfish, CRC-32/MPEG-2
- **Hooks:** C (MinGW-w64),对 ws2_32.dll 的内联 hook,VEH 处理程序
- **分析:** Ghidra 11.3.2, Cheat Engine (内核驱动)
- **客户端:** LoL 16.6(私有副本,与官方安装独立)
## 快速开始
### 前置条件
- Windows 10/11
- .NET 8 SDK
- 将 LoL 客户端 (16.6 版本) 副本放置在 `client-private/` 中
- MinGW-w64(用于编译 hook DLL)
- Cheat Engine(用于运行时 CRC 绕过)
### 1. 编译 hook DLL
```
cd nethook
gcc -shared -o version.dll version_proxy.c -lws2_32 -O2
cp version.dll ../client-private/Game/version.dll
```
### 2. 启动服务器
```
cd server/src/LoLServer.Console
dotnet run -- --rawudp
```
### 3. 启动客户端
```
cd client-private\Game
Start-Process -FilePath '.\League of Legends.exe' -ArgumentList '"127.0.0.1 5119 17BLOhi6KZsTtldTsizvHg== 1" "-Product=LoL" "-PlayerID=1" "-GameID=1" "-LNPBlob=N6oAFO++rd4=" "-GameBaseDir=D:\LeagueOfLegendsV2\client-private" "-Region=EUW" "-Locale=fr_FR" "-SkipBuild" "-EnableCrashpad=false"'
```
### 4. 修补 CRC (Cheat Engine)
1. 以管理员身份打开 CE,附加到 `League of Legends.exe`
2. 设置 -> 扩展 -> 勾选 "Read/Write Process Memory"
3. 表格 -> 显示 Cheat Table Lua 脚本
4. 粘贴 `ce_kernel_patch.lua` 内容,点击执行
## 关键 Ghidra 函数
| 函数 | RVA | 作用 |
|----------|-----|------|
| `FUN_1405725f0` | 0x5725F0 | 接收解密 + CRC 验证 |
| `FUN_140577f10` | 0x577F10 | CRC nonce 计算 |
| `FUN_140588f70` | 0x588F70 | 数据包分发器(构建 CRC 栈结构体) |
| `FUN_1410f2a10` | 0x10F2A10 | Double CFB 解密(接收) |
| `FUN_1410f41e0` | 0x10F41E0 | Double CFB 加密(发送) |
| `FUN_14058ef90` | 0x58EF90 | 发送封装(Double CFB + 字节反转) |
## 重要提示
- **切勿**修改官方 LoL 安装目录或 Vanguard
- 私有客户端(`client-private/`)必须与官方安装完全独立
- Cheat Engine 的内核驱动程序需要禁用 Windows 易受攻击驱动阻止列表
- 本项目仅用于教育/研究目的
## 许可证
MIT
标签:16.6版本, Blowfish加密, CFB加密, CRC32, DLL注入, ENet, Ghidra, Hook技术, LENet, MPEG-2, Ring-3, UDP通信, version.dll, ws2_32.dll, 云资产清单, 代理DLL, 内存保护, 内核驱动, 协议逆向, 反作弊绕过, 服务器模拟器, 流量审计, 游戏开发, 游戏服务端, 私服, 网络协议, 网络协议分析, 网络安全, 英雄联盟, 逆向工程, 隐私保护