资讯动态

LeaguePrank源码精读:processinfo进程遍历与LockFileReader令牌提取的实现

发布时间:2026/9/25 1:15:16 来源:尧图企业网站定制
LeaguePrank源码精读processinfo进程遍历与LockFileReader令牌提取的实现【免费下载链接】LeaguePrank项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrankLeaguePrank 是一款基于英雄联盟LCU API的趣味工具可以修改游戏内显示的段位、生涯、头像等信息。它能与游戏交互的前提有两个先通过进程遍历定位LeagueClient.exe的安装目录再解析lockfile提取令牌token与端口。本文将源码级精读这两大核心模块——processinfo.h 的进程遍历与 LockFileReader 的令牌提取并还原它们在游戏主窗口中协同工作的完整链路。一、整体链路3步拿到 LCU API 调用凭证 先建立全局观。LeaguePrank 采用 C/Qt CEF内嵌浏览器 JavaScript 的架构C 端只负责拿钥匙界面逻辑全部写在 view/ 目录的前端页面里。拿到调用凭证的过程分三步步骤模块输入输出① 进程遍历processinfo.h进程名LeagueClient.exe游戏安装目录列表② 令牌提取lockfilereader.cpp游戏目录下的lockfiletoken、端口、协议③ 凭证下发mainwindow.cpp上两步结果JSON 事件交给 JS 端发起 LCU API 请求LCULeague Client Update是随游戏启动的本地 HTTP 服务只监听127.0.0.1使用riot:令牌的 Basic 认证。下面逐步拆解前两步的实现。二、进程遍历processinfo.h 如何定位游戏安装目录processinfo.h 只有三个函数却覆盖了从进程名到完整路径的全部难点非常适合新手学习 Windows 进程相关 API。1. 用工具快照遍历系统进程入口函数 GetProcessFullPaths 接收进程名参数思路是经典的 Toolhelp32 快照三步曲CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)对系统当前进程拍一张快照Process32First获取第一个进程条目随后循环Process32Next逐个遍历比较PROCESSENTRY32.szExeFile与目标进程名转成宽字符后wcscmp命中就记录该进程 PID。小技巧快照方式一次遍历即可拿到所有匹配项且对运行中的游戏进程零干扰比逐个枚举 打开进程高效得多。2. 由 PID 反查完整路径命中 PID 后GetProcessFullPath 完成进程号 → 可执行文件路径的反查OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID)打开进程句柄只申请查询权限权限最小化GetProcessImageFileName从 Psapi 拿到可执行文件名。注意此 API 返回的是NT 风格路径如\Device\HarddiskVolume2\英雄联盟\LeagueClient而不是人眼熟悉的C:\...盘符路径因此还需要第三步。3. NT 路径与 DOS 盘符路径的互转DosPathToNtPath 负责把 NT 路径还原成C:\开头的 DOS 路径核心是两张对照表的查询GetLogicalDriveStrings枚举本机所有盘符跳过 A、B 盘对每个盘符调用QueryDosDevice查询它对应的 NT 设备名例如 C: →\Device\HarddiskVolume2判断传入的 NT 路径是否以该设备名前缀开头是则盘符 剩余路径拼接完成转换。⚠️命名陷阱函数名叫DosPathToNtPathDOS→NT但实际做的是NT→DOS的转换阅读源码时别被名字带偏这是很多源码精读文章中都会提到的小坑。最终GetProcessFullPaths返回去重后的QStringList即所有正在运行的LeagueClient.exe的完整路径。三、令牌提取LockFileReader 如何解析 lockfile游戏客户端启动后会在LeagueClient目录下生成一个明文文件lockfile这是第三方工具接入 LCU API 的唯一钥匙。1. lockfile 文件格式速览lockfile只有一行由冒号分隔的 5 个字段组成名称:用户ID:端口:令牌:协议字段示例用途名称LeagueClient客户端标识uid数字当前登录用户 IDport29999本地 HTTP 服务端口token一串随机字符Basic 认证密码核心凭证protocolhttps服务访问协议其中用户名固定为riot密码就是 token——这一点在后文 LCUconnect.js 中会看到实际用法。2. setGamePath读取与正则解析核心逻辑在 LockFileReader::setGamePath 中流程非常直白拼路径path /lockfile先用 isFileExist内部是QFileInfo::isFile判断文件是否存在——文件不存在通常意味着游戏没在运行QFile以只读模式打开并readAll()一次性读入随即关闭句柄用正则(.*):(.*):(.*):(.*):(.*)的exactMatch整体匹配cap(1)~cap(5)依次取出 5 个字段存入 LockFileInfo 结构体任一环节失败均返回false字段默认值统一置为unknow由调用方决定降级策略。可借鉴的细节错误分支中QMessageBox警告被有意注释掉见源码#if 0风格的处理因为弹窗提示统一交给前端 H5 页面负责C 端只返回布尔状态——这是 Qt 前端混合架构中职责划分的常见做法。3. 三个常用 gettergetPort / getToken / getUrl解析完成后getter 方法 屏蔽了结构体细节调用方只取所需getToken()返回令牌文本认证必备getPort()返回端口号getUrl()直接拼出127.0.0.1:端口的完整服务地址供 JS 端直接发起请求。四、协同调用sendGamePathList 完整链路两个模块如何被串起来答案在主窗口的 MainWindow::sendGamePathList 中这也是全文最值得精读的函数进程遍历pathList GetProcessFullPaths(LeagueClient.exe)拿到所有游戏路径降级方案若结果为空快照失败等边界情况回退到系统命令wmic process where nameLeagueClient.exe GET ExecutablePath补位体现了主路径 兜底路径的健壮性设计逐路径提取令牌对每个路径trimmed()后截掉末尾/LeagueClient.exe得到游戏目录调用setGamePath读取 lockfile失败则continue跳过组 JSON 下发前端把path / token / url / protocol组装成{type: GAME_PATH, list: [...]}结构通过m_cefView-sendEvent(PATH_LIST_SET, ...)推给内嵌浏览器页面JS 端完成认证LCUconnect.js 中的LCUrq.install(protocol, path, url, token)用btoa(riot: token)生成Authorization: Basic ...请求头之后的每次请求都拼接成协议://riot:令牌127.0.0.1:端口/接口路径直连 LCU API 修改段位、头像等展示信息。数据流向一句话总结进程快照 → 安装目录 → lockfile → token端口 → JSON 事件 → JS 认证请求。五、核心文件清单与延伸阅读 文件职责processinfo.h进程快照遍历、PID 反查路径、NT/DOS 路径互转lockfilereader.hLockFileInfo结构体与LockFileReader接口定义lockfilereader.cpplockfile 读取、正则解析、getter 实现mainwindow.cppC 与前端的事件桥接、sendGamePathList主流程cefview.hCEF 浏览器视图封装承载 H5 页面view/js/LCUconnect.jsJS 端 LCU API 连接器认证头与请求封装LeaguePrank.proQt 工程文件可用于在本地构建 精读小结Toolhelp32 快照 前缀匹配是按进程名定位安装目录的通用套路GetProcessImageFileName返回 NT 路径必须经QueryDosDevice转回盘符路径lockfile 五段式格式 正则整行匹配是 LCU 生态各工具的标配解析方案主路径失败时wmic兜底、C 端不弹窗而由前端统一提示都是混合架构下的实用设计。读懂这两个模块后整个 LeaguePrank 的钥匙获取部分就全部通透了可以继续沿着 mainwindow.cpp 的事件分发逻辑saveProfile/readProfile深入前端交互部分。【免费下载链接】LeaguePrank项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑