5 分钟读懂 YimMenuV2:游戏菜单框架如何靠钩子、内存扫描与 Lua 撑起功能
【免费下载链接】YimMenuV2Experimental menu for GTA 5: Enhanced项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenuV2
打开 YimMenuV2 的 README,第一行就写得直白——"Experimental menu for GTA 5: Enhanced"。
它不是一个通用游戏菜单框架,而是专门给 GTA V 增强版用的注入式菜单:编译成一个YimMenuV2.dll,用注入器塞进游戏进程,按INSERT或Ctrl+\呼出界面。
换句话说,这是一个用 C++23 写的游戏菜单框架加模组合集。代码量不算大,却把钩子、内存操作、Lua 沙箱三件事摊开给你看,很适合当现代 C++ 的样本读。
先弄清它是什么:一个注入式的 GTA V 菜单
先泼点冷水,省得你按参考文章里的"通用框架"预期去看。
它是experimental(实验性)的,官方自己都这么标。线上玩法有个绕不开的硬限制:README 的"Common issues"里写明,公共局大约每 5 分钟会被踢一次,因为目前没有完整的 BattlEye 绕过,合法的 host 会在心跳失败时把你移除。
还有一处容易踩:它推荐配 FSL(一个WINMM.dll)使用,FSL 会把账号存档重定向到磁盘。你把 FSL 删了,存档进度会"消失",游戏甚至可能起不来。
所以定位很清楚:单人和非官方环境里更稳,线上反作弊有限制。把它当工程样本读很值,别当成线上"无敌工具"。
读懂三层目录:core、game、types 各管什么 🧩
整个src/分三层,分工是这个项目最该先记住的一点:
| 目录 | 定位 | 典型内容 |
|---|---|---|
| src/core/ | 与具体游戏无关的通用框架 | hooking、memory、renderer、scripting、commands |
| src/game/ | GTA V 增强版特化实现 | features、hooks、pointers、invoker |
| src/types/ | 逆向出来的游戏内部结构 | rage 容器、network 同步节点、script 全局变量 |
一句话总结:core 不碰游戏细节,game 负责"对接 GTA V",types 放逆向出的结构体。
这就是"可移植"说法的依据——真要换个游戏,理论上只动game和types,core 基本能复用。features/下再按 network、players、recovery、self、vehicle、world 分目录,功能点一目了然。
钩子系统拆解:Detour、IAT、VMT 各自何时用
钩子(hook)说白了就是"截住游戏原本的函数调用,插进自己的逻辑",类比成在快递路线上设个中转站。
src/core/hooking/给了四种手段:
- DetourHook:改函数入口跳板,最常用
- IATHook:改导入地址表(IAT)
- VMTHook:改虚函数表(vtable)
- CallSiteHook:在某条调用指令处打跳板
注册钩子有固定套路,模板参数<T>让类型在编译期对齐,写错当场报错:
BaseHook::Add<Hooks::Anticheat::GameSkeletonUpdate>( new DetourHook("GameSkeletonUpdate", Pointers.GameSkeletonUpdate, handler));打开 Hooking.cpp 你会看到一个构造函数里挂了二三十个钩子,全是"同一套BaseHook::Add+ 具体 Hook"的组合:反作弊相关、脚本线程(ScriptVM、RunScriptThreads)、网络消息(ReceiveNetMessage)、同步写入(WriteSyncTree)、匹配(Matchmaking*)、输入(GetRawInputData)。加新钩子照着抄就行。
不写死地址:用模式扫描定位游戏函数
游戏一更新,内存地址就变。所以项目不写死地址,而是按一段"特征字节"在内存里搜出函数位置——类比"不按门牌号找,按门口的招牌找"。
src/core/memory/里PatternScanner负责这件事,普通注入时用std::async+std::future并发跑多组特征;手动映射(manual map)时则退化成串行,代码注释里写明了线程池在那种场景下会出问题。PatternCache缓存结果,BytePatches负责打字节补丁(改一小段机器码)。
所有扫出来的指针集中在 game/pointers/,钩子就引用这里。于是三者是一条流水线:找地址(pointers)→ 打补丁(BytePatches)→ 挂钩子(hooking)。
给玩家留的口子:Lua 沙箱脚本
不想每次加功能都重编译 C++?把.lua丢进%appdata%/YimMenuV2/scripts,启动时递归加载,改完重载即可。
这套沙箱在 docs/lua-api.md 里写得很细:
- 每个脚本跑在独立沙箱(独立 LuaJIT 状态),默认只开放
base/table/string/math/debug/bit/jit,io、os、ffi都拿不到 - 文件读写走项目自己的
FileMgr,不走io require只能加载 scripts 目录内的.lua,路径穿越、绝对路径、字节码/原生模块一律拒绝- API 面很宽:
notify、menu、ImGui、memory、pointer、Entity/Ped/Vehicle、Player、natives、network、stats、transactions等
local greeting = require("include.greeting") greeting.say_hello()它的作用是把 C++ 的钩子和内存能力包成 API 暴露出去,core/scripting/和game/scripting/libraries/两块代码就是干这个的。对新手来说,这是最友好的扩展入口。
从构建到注入:上手路径与常见坑 ⚠️
构建:CMake ≥ 3.20,C++23,依赖imgui、minhook、nlohmann_json、LuaJIT、AsyncLogger(见 CMakeLists.txt),有cross-compile.cmake支持跨平台,产物是 DLL。
git clone https://gitcode.com/GitHub_Trending/yi/YimMenuV2读代码建议顺序:先看 main.cpp 的启动顺序(FileMgr → Pointers.Init → AnticheatBypass → Hooking → ScriptMgr),再进hooking,然后memory/pointers,最后挑一个game/features/下的功能点跟读。
常见坑(均来自 README):
- 公共局每 5 分钟被踢:无完整 BattlEye 绕过,合法 host 因心跳失败移除你
- 删 FSL 后存档消失 / 游戏起不来:FSL 把存档重定向到磁盘;起不来可删
Documents/GTAV Enhanced/Profiles
一句话收尾:它麻雀虽小,钩子、内存、Lua 三套机制都完整,拿它练手"现代 C++ 工程怎么组织",比读一堆零散 demo 划算。
【免费下载链接】YimMenuV2Experimental menu for GTA 5: Enhanced项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenuV2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考