CFramework/README.md

177 lines
9.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CFramework
面向 **SPT-AKI 3.11.3**(Escape From Tarkov 单机版)的外部辅助程序(External Cheat)。
以 ImGui + DX11 透明 Overlay 渲染,通过外部内存读写实现 ESP、自瞄、压枪等功能。
本项目最初发布于 UnknownCheats,作者已对开发失去兴趣,故公开源码,供研究、分析、学习与调查使用。
> 注意:本项目面向**单机离线版 SPT**,与官方 Tarkov 无关。
---
## 功能特性
### ESP(玩家 / 环境)
| 功能 | 说明 | 状态 |
| --- | --- | --- |
| 玩家 ESP | PMC / SCAV / BOSS / 玩家SCAV / 特殊SCAV 区分着色 | ✅ |
| 方框 / 填充方框 | 支持两种方框样式(`g_ESP_BoxStyle`) | ✅ |
| 骨骼 | 基于 PlayerBones 关节链(Head / Neck / Ribcage / Pelvis 等) | ✅ |
| 血条 / 距离 / 名称 | 玩家头顶信息 | ✅ |
| 连线 | 屏幕中心到目标连线 | ✅ |
| 物资 ESP | 稀有物资标记(名称 + 距离,`g_ESP_MaxItemDistance` 可调) | ✅ |
| 尸体 ESP | 尸体标记 | ✅ |
| 撤离点 ESP | 开启 / 未开启撤离点分色(绿 / 橙) | ✅ |
| 手雷 ESP | 投掷物轨迹标记 + 屏幕顶部 `[ WARNING ] Grenade!!` 警告 | ✅ |
| 最大距离 | `g_ESP_MaxDistance`(默认 500m) | ✅ |
### 自瞄(AimBot)
- 两种模式:
- **Mouse 模式(默认)**:`SendInput` 模拟鼠标移动,无需偏移,稳定可靠;
- **Memory 模式**:直接写 `MovementContext::Rotation`,需用菜单 [Rot Debug] 在实机上校准偏移(`Offset.h` 中 `MovementContext::Rotation`,默认 `0x58 -> 0x27C`)。
- 参数:FOV 半径、自适应平滑(0-100)、灵敏度倍率、单帧最大移动、最大锁定距离(m)、骨骼选择(Head / Neck / Body)。
- 目标过滤:PMC / SCAV / BOSS 独立开关、忽略血量判定。
- **强制开启(免按键)**:勾选后无需按键,自瞄直接生效(用于按键检测失效的环境)。
- 显示 FOV 圈、目标连线(调试用)。
- 触发键:按住 **鼠标右键(ADS)** 或 **左键(射击)** 时生效;`F9` 作为键盘兜底触发键(`Config.h` 中 `g_AimKey0/1/2` 可改)。
### 压枪(Recoil Control)
- 射击期间按固定间隔向下补偿鼠标(宏式)。
- `Strength`:每次下拉的鼠标单位;`Interval`:下拉间隔 [ms]。
### Misc
| 功能 | 说明 |
| --- | --- |
| 无限耐力 | 锁定 `Physical` 耐力值(含手部耐力) |
| 无跌落伤害 | 修改跌落伤害倍率 |
| 无摇摆 | 清空 `MotionEffector.SwayFactors` |
| 无后座(内存) | 直接改写 `ShotEffector` / 武器后座参数(与宏式压枪不同,纯内存) |
| 无故障 / 卡弹 | 屏蔽卡壳 / 供弹故障 / 不发火 / 滑套未复位 |
| 串流隐藏 | 直播 / 录屏防暴露 |
| 准星 | 屏幕中心自定义准星(大小 / 样式可选) |
### 菜单
- 打开 / 关闭:**INSERT**(`Config.h` 中 `g_MenuKey` 可改)
- 菜单已中文化:左侧图标导航栏 + 右侧设置面板,共 4 页 —— **自瞄 / 视觉 / 功能 / 设置**。
---
## 构建
- 环境:**Visual Studio 2022**(MSVC v143),x64。
- 所有第三方库(ImGui、DirectXTK SimpleMath、FreeType、nlohmann/json 等)已包含在仓库内,无需额外安装。
- 日常开发不要只执行裸构建;先运行统一回归门禁:
```powershell
powershell -ExecutionPolicy Bypass -File .\verify_runtime.ps1
```
门禁会依次:
1. 从当前源码重建 `CFramework.SelfTest`;
2. 运行对象链、四种 GOM 布局、首次失败恢复、Snapshot freshness、Camera 和 W2S 回归测试;
3. 仅在全部测试通过后重建 Release x64 Overlay;
4. 将隔离产物和 SHA256 输出到 `x64\RuntimeGuard\`,不会覆盖正在使用的 `x64\Release\CFramework.exe`。
也可以直接打开 `CFramework.sln` 选择 **Release x64** 构建;正式发布前仍必须运行上述门禁。
运行前提:先启动 SPT-AKI 3.11.3 客户端(进程名为 `EscapeFromTarkov`),再以管理员身份运行 `CFramework.exe`。
程序通过窗口标题附加进程并创建覆盖层;若附加失败返回码 `1`,Overlay 初始化失败返回码 `2`。
## 当前数据架构(2026-08 重构)
- `CGame` 的 GameWorld / Camera 状态由动态数据线程统一刷新,并在内部用互斥锁保护。
- 动态玩家、相机矩阵和手雷数据发布为不可变 `DynamicWorldSnapshot`;撤离点和物资发布为 `StaticWorldSnapshot`。
- ESP 与 Aim 目标选择只消费 Snapshot,不在渲染阶段直接 RPM。真正的 Memory Aim / 功能 override 仍通过独立写入路径执行。
- `RegisteredPlayers` 按 `IPlayer` 处理,并区分完整 `EFT.Player` 与 `ObservedPlayerView` 两种布局。ObservedPlayer 无法从当前 dump 可靠确认的 Profile/Health/Role 字段不会强行套用。
- 后台线程不直接读取 ImGui 绑定的普通 `g_*` 变量;渲染线程通过 `WorkerConfigSnapshot` 发布所需配置。
- 动态 Snapshot 带采集时间、刷新次数和连续失败数;超过 250ms 的 stale 数据不会用于 ESP、Aim 或功能写入。
- `CGame` 的读取边界支持注入 synthetic memory reader;`CFramework.SelfTest` 可在不启动游戏的情况下复现 GOM/节点链和失败恢复路径。
- 玩家、物资、手雷列表使用运行时长度 + 上限校验的批量读取,不再使用固定 `address[64]` / `address[2048]` 缓冲。
- 工作线程可 join;退出时先停止并等待后台线程,再恢复功能写入和关闭进程句柄。
详细变更与验证结果见 [`REFACTOR_NOTES.md`](REFACTOR_NOTES.md)。
## 已知问题
- 当前 Windows 环境已完成 MSVC v143 `Release x64` 全量重建,并通过 16 项离线 Runtime SelfTest;仍需在每次 offset、线程或读取逻辑变更后执行 `verify_runtime.ps1` 和实机进出局烟雾测试。
- `ObservedPlayerView` 的昵称、Role、实时 Health 等字段在当前 dump 中仍是混淆字段;本次实现采取保守降级显示,不猜测未知字段语义。
- 主 Overlay 仍跟随 VSync/显示器刷新率;`UpdateFeatures()` 是渲染线程写功能路径,后续如果需要进一步降低 CPU/RPM,可以单独给写功能增加节流/脏标记。
## 项目结构
```
CFramework/
├── CFramework.sln # VS 解决方案(主程序 + SelfTest)
├── verify_runtime.ps1 # Runtime 回归门禁:测试通过后才构建 Overlay
├── CFramework.SelfTest/ # synthetic memory 离线测试项目
│ └── SelfTest.cpp
├── CFramework/
│ ├── CFramework.vcxproj
│ ├── main.cpp # 入口:附加进程、初始化 Overlay、字体、后台线程
│ ├── Cheat/ # 功能实现
│ │ ├── SnapshotHealth.h # generation、时间戳和 250ms freshness 契约
│ │ ├── Aim.cpp # 自瞄 + 压枪(Mouse / Memory)
│ │ ├── Visual.cpp # ESP 渲染(玩家/物资/撤离点/手雷)
│ │ ├── Features.cpp # 耐力/跌落/摇摆/后座/故障 override
│ │ ├── Menu.cpp # ImGui 菜单(中文)
│ │ ├── Render.cpp / UpdateList.cpp
│ │ └── SDK/ # 游戏对象封装
│ │ ├── CPlayer / CExfil / CItem
│ │ └── GameSDK/ # Offset.h(全部偏移)、Struct.h
│ └── Framework/ # 可复用框架
│ ├── Memory/ # 外部内存读写(ReadChain 等)
│ ├── Overlay/ # DX11 透明覆盖层
│ ├── Input/ # 输入处理
│ ├── ImGui/ # 内置 ImGui + DX11/Win32 后端 + 字体
│ ├── Config/ # 全局配置(Config.h 中 g_* 全局变量)
│ └── Libs/ # FreeType / SimpleMath / nlohmann
├── build_index.py / query_index.py # IL2CPP dump 索引工具(见下)
├── dump_index.db # 生成的索引库
├── DUMP_INDEX.md # 索引工具使用文档
└── LICENSE # MIT
```
## 配套工具:IL2CPP dump 索引
`dump.txt` 是 Unispect v0.2.4.0 生成的 IL2CPP 类布局 dump(15.8 万行 / 7MB),
配套脚本将其流式解析为 SQLite 索引(`dump_index.db`,含 FTS5 全文索引),毫秒级检索类型 / 字段 / 偏移,替代对原始文本的暴力搜索。
```powershell
# 构建索引(默认输入 F:\desktop\Release\dump.txt)
python build_index.py
# 自定义路径
python build_index.py D:\other\dump.txt D:\other\dump_index.db
# 查询统计 / 检索
python query_index.py stats
python query_index.py find Player.FirearmController
```
详细用法见 [DUMP_INDEX.md](DUMP_INDEX.md)。
---
## 免责声明
本项目仅用于**学习、研究、教育**目的。作者(Neko64V)对因使用本软件造成的任何直接或间接损失不承担任何责任,请勿将其用于任何非法用途。
## 致谢与依赖
- [ImGui](https://github.com/ocornut/imgui) — 界面框架(内置,含 DX11 / Win32 后端与 FreeType 渲染)
- [Microsoft DirectXTK (SimpleMath)](https://github.com/microsoft/DirectXTK) — 数学库
- FreeType — 字体渲染
- [nlohmann/json](https://github.com/nlohmann/json) — JSON 解析
- Font Awesome 6 — 菜单图标
- 字体:Roboto(内置压缩字体)+ 微软雅黑(`C:\Windows\Fonts\msyh.ttc`,CJK 中文 fallback)
## License
[MIT](LICENSE) © 2024 Neko64V