158 lines
8.5 KiB
Markdown
158 lines
8.5 KiB
Markdown
# 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 等)已包含在仓库内,**无需额外安装**,直接打开 `CFramework.sln` 选择 **Release x64** 构建即可。
|
||
- 首次构建参考:[Visual Studio C++ 安装指南](https://learn.microsoft.com/ja-jp/cpp/build/vscpp-step-0-installation?view=msvc-170)
|
||
输出:`x64\Release\CFramework.exe`
|
||
|
||
运行前提:先启动 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` 发布所需配置。
|
||
- 玩家、物资、手雷列表使用运行时长度 + 上限校验的批量读取,不再使用固定 `address[64]` / `address[2048]` 缓冲。
|
||
- 工作线程可 join;退出时先停止并等待后台线程,再恢复功能写入和关闭进程句柄。
|
||
|
||
详细变更与验证结果见 [`REFACTOR_NOTES.md`](REFACTOR_NOTES.md)。
|
||
|
||
## 已知问题
|
||
|
||
- 当前包是在 Linux 容器中做源码级重构,环境没有 Visual Studio 2022 / Windows SDK,因此没有执行真正的 MSVC Release x64 链接构建。核心重构源文件已用 Clang + Windows API 测试桩做 `-fsyntax-only` 验证;最终仍建议在 VS2022 中执行一次 `Release x64` 全量构建。
|
||
- `ObservedPlayerView` 的昵称、Role、实时 Health 等字段在当前 dump 中仍是混淆字段;本次实现采取保守降级显示,不猜测未知字段语义。
|
||
- 主 Overlay 仍跟随 VSync/显示器刷新率;`UpdateFeatures()` 是渲染线程写功能路径,后续如果需要进一步降低 CPU/RPM,可以单独给写功能增加节流/脏标记。
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
CFramework/
|
||
├── CFramework.sln / .vcxproj # VS 解决方案
|
||
├── CFramework/
|
||
│ ├── main.cpp # 入口:附加进程、初始化 Overlay、字体、后台线程
|
||
│ ├── Cheat/ # 功能实现
|
||
│ │ ├── 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
|