4.4 KiB
4.4 KiB
2026-08 External Data-Layer Refactor
本次修改以当前 CFramework 外部框架为基础,没有重新迁移 Overlay / ImGui / Camera / Transform。目标是修复共享状态竞争、固定数组越界和新版本 IPlayer 布局差异,并让渲染/目标选择与目标进程读取解耦。
已完成
-
CGame 状态同步
- GameWorld / LocalGameWorld / FPS Camera / ViewMatrix 统一由
CGame::Refresh()刷新。 - 内部状态使用 mutex,消费者通过
GameStateSnapshot读取一致副本。 - 移除渲染线程每帧调用
InitAddress()的行为。
- GameWorld / LocalGameWorld / FPS Camera / ViewMatrix 统一由
-
不可变世界快照
- 新增
DynamicWorldSnapshot:本地玩家、远端玩家、Camera/ViewMatrix、Grenade。 - 新增
StaticWorldSnapshot:Exfil、Item。 - 使用
shared_ptr<const ...>+atomic_load/atomic_store发布,消费者不会看到构建到一半的容器。
- 新增
-
ESP / Aim 数据读取解耦
RenderESP()不再直接 RPM,也不再调用 Player Update/Health/Bone。- Aim 目标筛选和骨骼选择只读取动态快照。
- Memory Aim 与 Misc override 继续保留为明确的写入路径。
-
玩家类型适配
- 新增
CPlayerKind::{EftPlayer, ObservedPlayer}。 - 完整玩家使用当前 dump 中的
Player + 0x618 Profile、+0x660 HealthController、+0x6E8 PlayerBones等链。 - ObservedPlayer 使用当前 dump 可确认的
+0x60 PlayerBones、+0x68 PlayerBody、+0xB8 Transform、+0x100 Side。 - 对 dump 未确认的 Observed Profile/Health/Role 不做猜测。
- 新增
-
列表越界修复
- 移除固定
CGameObjectList::address[64]和 Itemaddress[2048]读取方式。 - Managed List/Array 使用实际 count/length + hard limit +
TryReadVector。 - 当前 hard limit:Player 512、Item 8192、Grenade 256、Exfil 32。
- 移除固定
-
Memory API 加固
- 增加
IsUserAddress、TryRead、TryWrite、TryReadBuffer、TryReadVector。 ReadChain增加地址校验。- 修复旧
ReadWString返回临时缓冲地址的问题。 DetachProcess()会关闭并清空句柄/PID/Base。
- 增加
-
Worker 配置同步
g_*仍保留为 ImGui 绑定配置。- 渲染线程通过
UpdateWorkerConfigFromUi()发布WorkerConfigSnapshot。 - 后台列表线程仅读取该受锁保护的配置副本,不与 UI 裸共享普通 bool/float。
-
退出生命周期
- 动态/静态数据线程不再 detach。
- Overlay 退出后设置原子
process_active=false,join 两个线程,再 Reset overrides / Destroy overlay / Detach process。
-
其他边界修复
- Exfil 名称读取增加地址、长度和缓冲区限制,并修复 status 未正确缓存的问题。
- Unity Transform、Camera、Managed Array/List 等常用裸偏移集中到
Offset.h。 min调用改为显式std::min,降低 Windows 宏依赖。- README 移除源码中不存在的“子弹追踪(只读)已完成”声明。
Runtime 防回归护栏
为避免后续 pointer validation、GOM 布局或线程优化再次让 ESP 静默失效,新增以下强制契约:
- 动态 Snapshot 无论刷新成功与否都持续发布,
generation单调增加; - Snapshot 带
capturedAt、刷新总次数和连续失败数;超过 250ms 的数据不会用于 ESP、Aim 或功能写入; CGame通过IGameMemoryReader支持 synthetic memory 注入,生产默认适配器仍使用全局Memory m;GetObjectFromList保留可选 last sentinel,并对 self-loop 和多节点环进行检测;- 新增独立
CFramework.SelfTestConsole 项目,覆盖对象链、四种 GOM 布局、首次失败恢复、Camera 降级和 W2S; - 根目录
verify_runtime.ps1会先重建并运行 SelfTest,测试失败则阻止 Overlay 构建。
验证
当前 Windows 环境已执行:
powershell -ExecutionPolicy Bypass -File .\verify_runtime.ps1
验证结果:
- Offline Runtime SelfTest:16 PASS,0 FAIL;
- 主程序:MSVC v143
Release | x64全量重建成功; - 新产物写入隔离目录
x64\RuntimeGuard\,不会覆盖正在运行的 known-goodx64\Release\CFramework.exe; - 仅保留项目既存的
C4828、C4244、LNK4098和 FreeTypeLNK4099warning,无新增编译或链接错误。
离线门禁不能替代最终实机烟雾测试。涉及 offset、Camera、玩家结构或线程生命周期的修改,仍必须验证启动顺序、连续进出局、Gen/Fresh/Age/Fail/Try 和 ESP/Aim 实际效果。