OpenSteamTool架构全景图:从DLL注入到Hook系统的6大核心模块拆解
【免费下载链接】OpenSteamToolOpen Source Steam Unlocker项目地址: https://gitcode.com/gh_mirrors/op/OpenSteamTool
OpenSteamTool 是一款开源 Steam 解锁工具(Open Source Steam Unlocker),它的核心思路是:把OpenSteamTool.dll注入 Steam 客户端,再通过Hook 系统拦截steamclient64.dll与steamui.dll的关键调用,配合IPC 消息拦截与Lua 热重载配置,实现"未拥有游戏也能出现在库里并正常运行"。本文带你拆解它从 DLL 注入到 Hook 系统的 6 大核心模块,帮你快速读懂这个 C++ 项目的全貌。
全景概览:三层结构一图读懂
整个项目可以抽象为三层,自顶向下依次是:
| 层级 | 角色 | 关键产物 |
|---|---|---|
| 注入层 | 借"加载器劫持"把代码送进 Steam 进程 | dwmapi.dll、xinput1_4.dll |
| 主逻辑层 | 真正的 Hook 引擎 + 业务模块 | OpenSteamTool.dll |
| 平台层 | Windows 系统调用封装(进程、内存、哈希) | OSTPlatform静态库 |
构建时三个目标在 src/CMakeLists.txt 中定义:OpenSteamTool(注入 Steam 的 Hook DLL)、dwmapi(加载器劫持 DLL)、xinput1_4(辅助加载器 DLL)。
模块一:DLL 注入层 —— 加载器劫持(Loader Hijack)
这是整个项目的入口。Windows 加载 DLL 时遵循固定的搜索顺序:Steam 根目录 > 系统目录。OpenSteamTool 利用了这一点,把伪造的dwmapi.dll和xinput1_4.dll放在 Steam 根目录——当 Steam 启动时请求系统 DLL,Windows 会优先加载本地这份"李鬼"。
- src/dwmapi/dwmapi.cpp 通过
/EXPORT指令精确复刻了真实dwmapi.dll的导出表,保证 Steam 调用系统接口时行为完全正常,同时悄悄完成OpenSteamTool.dll的加载; - src/xinput1_4/xinput1_4.cpp 配合 xinput1_4.def 扮演第二个加载入口,提供冗余的劫持点。
💡 加载成功后,全局路径(Steam 安装目录、steamclient 路径、Lua 目录等)会被写入 src/dllmain.h 中定义的一组全局缓冲,供后续所有 Hook 模块共享。
模块二:Hook 系统 —— HookManager 的双轨调度
注入之后,主角是 Hook 引擎。src/Hook/HookManager.h 把 Hook 拆成两条轨道:
SteamUI::CoreHook()—— 挂载到steamui.dll(Steam 的 UI 层),目前只挂 Hooks_SteamUI;SteamClient::CoreHook()—— 挂载到steamclient64.dll(Steam 核心通信引擎),一次性安装 7 个模块,见 HookManager.cpp:
| Hook 模块 | 职责 |
|---|---|
| Hooks_CallBack | 拦截 Steam 回调分发(事件总线的入口) |
| Hooks_Decryption | 注入仓库(depot)解密密钥 |
| Hooks_IPC | 拦截游戏与 Steam 之间的 IPC 消息 |
| Hooks_Manifest | 仓库 manifest 伪造与绑定 |
| Hooks_NetPacket | 网络包 eMsg 分发拦截 |
| Hooks_Package | 包(package)注入 |
| Hooks_Misc | 引擎指针捕获等杂项 |
底层基于 Microsoft Detours(见 src/cmake/Detours.cmake),卸载时 VehCommon 会统一拆除所有异常处理钩子,保证 Steam 卸载 DLL 时不留残留。
模块三:IPC 拦截模块 —— pre/post 双钩子设计
IPC(进程间通信)是 Steam 与游戏进程对话的主通道,也是"让未拥有游戏通过验证"最关键的一环。
Hooks_IPC.h 采用注册表模式:每条 IPC 方法可以挂pre(调用前)或post(调用后)处理器,用宏一行注册:
ADD_IPC_PRE_HANDLER(ISteamUser, LogOn)→ 登录消息调用前动手脚(比如改写 AppId);ADD_IPC_BOTH_HANDLER(...)→ 前后都拦截,既改请求也改响应。
更巧妙的是消息结构本身不手写:构建系统读取 Steam/IPCMessages.steamd IDL 文件,用 tools/ipc_codegen/ipc_codegen.cpp 在编译期生成消息头文件;而 proto/steam_messages.proto 则通过 protoc 生成 protobuf 消息(Debug 用完整库、Release 用 lite 库以减小体积),这套代码生成管线在 CMakeLists 中定义。
模块四:Pipe 管道功能模块 —— 从握手到 Denuvo 授权
steamclient64.dll通过命名管道(Named Pipe)与游戏进程通信。PipeManager.cpp 的OnHandshake在每次管道握手时做三件事:
- 通过 ProcessInspector 解析对端进程的 AppId 与快照,并按 PID + 创建时间做缓存(避免重复检查同一进程);
- 判断该进程是否对应"Lua 配置中追踪且未拥有"的游戏;
- 把上下文分发给两个自包含的功能(feature):
- DenuvoAuth:处理 Denuvo / SteamStub 保护游戏的令牌授权(AppTicket 凭据存储见 SteamCredentialStore);
- Injection:按
opensteamtool.toml的[inject]配置,向目标游戏进程注入用户指定的库。
这个"握手 → 解析 → 分发"的管道化设计,让新增功能只需注册一个 feature,无需改动主流程。
模块五:Lua 配置与热重载系统
普通用户几乎不碰 C++,日常交互全靠 Lua 脚本(addappid、setManifestid等函数)。
- LuaConfig.cpp 解析 Steam 目录下
config/lua中的脚本,并暴露给 Lua 运行时http_get/http_post等辅助函数; - LuaFileWatcher.cpp 监视该目录——添加、修改、删除
.lua文件都会自动触发热重载,无需重启 Steam; - Config.cpp + ConfigFileWatcher.cpp 负责 TOML 配置,参考模板 opensteamtool.example.toml 中可配置日志级别、manifest 上游、stats API、注入开关等,且同样支持热重载。
模块六:Steam 元数据与平台抽象层
最后一组模块解决"Steam 版本更新后签名失效"的顽疾:
- PatternLoader.cpp:每次启动计算
steamclient64.dll/steamui.dll的 SHA-256,按哈希从远程 pattern 仓库拉取匹配的签名 TOML,并走"GitHub raw → CDN → 本地缓存"三级回退; - IPCLoader.cpp 与 RemoteToml.cpp:远程 IPC 元数据加载;
- ManifestClient.cpp:向 opensteamtool / steamrun / wudrm 等上游 API 请求 manifest 码;
- StatsClient.cpp:为未拥有游戏拉取成就/统计的 SteamID;
- OSTPlatform:Windows 专属的平台静态库,封装进程操作(Process.h)、远程进程(RemoteProcess.h)、内存读写、PE 解析、SHA-256 等系统级能力。
目录速查表:5分钟定位任意模块
| 想知道什么 | 去哪里看 |
|---|---|
| 注入原理 | src/dwmapi/、src/xinput1_4/ |
| Hook 如何挂载/卸载 | src/Hook/HookManager.cpp |
| IPC 拦截处理器 | src/Hook/Hooks_IPC_ISteamUser.cpp、Hooks_IPC_ISteamUtils.cpp |
| 管道功能(Denuvo/注入) | src/Pipe/ |
| Lua 热重载 | src/Utils/Config/ |
| 签名/元数据加载 | src/Utils/SteamMetadata/ |
| Windows 平台封装 | src/OSTPlatform/ |
| 构建与代码生成 | src/CMakeLists.txt、tools/cmake/IPCCodegen.cmake |
| 模块级日志说明 | README_ZH.md 的"调试日志"章节 |
总结
OpenSteamTool 的架构可以用一句话概括:加载器劫持负责进场,HookManager 双轨负责布控,IPC 拦截负责改通信,Pipe 模块负责管游戏进程,Lua 热重载负责用户交互,元数据层负责跟上 Steam 版本迭代。六大模块各司其职、边界清晰,是研究 Windows DLL 注入与 Hook 技术(Detours + 命名管道 + 消息拦截)时一个相当完整的开源样本。
⚠️ 本项目仅供研究与教育目的,使用请自行遵守当地法律、平台服务条款与软件许可证。
【免费下载链接】OpenSteamToolOpen Source Steam Unlocker项目地址: https://gitcode.com/gh_mirrors/op/OpenSteamTool
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考