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, 内存保护, 内核驱动, 协议逆向, 反作弊绕过, 服务器模拟器, 流量审计, 游戏开发, 游戏服务端, 私服, 网络协议, 网络协议分析, 网络安全, 英雄联盟, 逆向工程, 隐私保护