k1gs/Homefront-Free-Camera
GitHub: k1gs/Homefront-Free-Camera
该项目是一个用 C++ 编写的《Homefront》游戏自由视角 Mod,通过 DLL 注入 hook 摄像机函数实现脱离角色控制的自由镜头。
Stars: 0 | Forks: 0
# Homefront 自由视角 Mod
该项目包含两个二进制文件:
- `homefront_freecam.dll` - 注入模块,用于 hook 游戏内的摄像机函数并驱动自由视角。
- `injector.exe` - 小型启动器,用于查找 `HOMEFRONT.exe` 并通过 `CreateRemoteThread + LoadLibraryW` 注入 DLL。
代码库使用 C++17 编写,通过 CMake 构建,并使用位于 `third_party/minhook` 下的本地 `MinHook` 依赖项。
## 功能简介
该 mod 会拦截原生游戏函数,该函数每帧计算玩家的摄像机位置和旋转。在原始游戏代码运行后,该 mod 会:
1. 从游戏中读取常规摄像机输出。
2. 在启用后的第一帧捕获该位置和旋转,作为自由视角的起始点。
3. 根据键盘输入更新自身的摄像机状态。
4. 用自由视角的位置和旋转覆盖函数输出。
5. 在自由视角处于活动状态时冻结 pawn,防止角色身体随移动输入发生漂移。
这使得你可以获得一个脱离角色控制的摄像机,而游戏的其余部分继续正常运行。
## 项目结构
- [`src/dllmain.cpp`](D:/proj/Fcam/src/dllmain.cpp) 在 DLL 注入后启动工作线程,等待启动完成,初始化 hook,并处理热键。
- [`src/hooks.cpp`](D:/proj/Fcam/src/hooks.cpp) 安装对 `GetActorEyesViewPoint` 的 hook,计算帧间隔时间,写入自定义摄像机值,并冻结 pawn。
- [`src/freecam.cpp`](D:/proj/Fcam/src/freecam.cpp) 存储自由视角状态,将 `FRotator` 转换为移动轴,并应用移动和旋转输入。
- [`src/input.cpp`](D:/proj/Fcam/src/input.cpp) 通过 `GetAsyncKeyState` 轮询键盘状态。
- [`injector/injector.cpp`](D:/proj/Fcam/injector/injector.cpp) 等待 `HOMEFRONT.exe`,在目标进程中分配内存,并远程加载 DLL。
## 工作原理
### 摄像机 Hook
目前的实现 hook 了一个硬编码的原生函数地址:
- 目标虚拟地址:`0x00A52070`
- 基于可执行文件 image base 重定位:`0x00400000`
这意味着该 mod 绑定到了特定版本的 `Homefront` 可执行文件构建。如果游戏二进制文件因补丁、其他版本或不同的发行版而发生改变,可能需要更新 hook 地址。
### Pawn 冻结
在自由视角处于活动状态时,该 mod 会直接将数据写入 pawn 位置字段,以保持玩家身体固定在原地:
- `0xBC`, `0xC0`, `0xC4` 对应 `X/Y/Z`
这些偏移量也是特定于版本的。
## 游戏内控制
- `F9` - 开启或关闭自由视角
- `F10` - 从游戏进程中卸载 DLL
- `W`, `A`, `S`, `D` - 向前、向左、向后、向右移动
- `Q` 或 `Space` - 向上移动
- `E` 或 `Ctrl` - 向下移动
- `Left`, `Right` - 偏航
- `Up`, `Down` - 俯仰
- `Shift` - 加速移动
- `Alt` - 减速移动
## 快速开始
1. 构建 `homefront_freecam.dll` 和 `injector.exe`。
2. 确保这两个文件位于同一目录下。
3. 启动 `Homefront`。
4. 运行 `injector.exe`,如有需要,建议以管理员身份运行。
5. 等待 DLL 加载成功的提示信息。
6. 在游戏中按 `F9` 启用自由视角。
有关构建步骤,请参阅 [BUILD.md](D:/proj/Fcam/BUILD.md)。
## 环境要求
- Windows
- CMake 3.20 或更高版本
- Visual Studio 2022 或其他支持 x86 架构的 MSVC 工具链
- `Win32` / `x86` 构建目标
- 位于 `third_party/minhook` 下的 `MinHook` 检出代码
如果项目不是作为 32 位构建,它会主动停止配置过程。
## 构建产物
成功进行 `Release` 构建后,预期输出为:
- `build/Release/homefront_freecam.dll`
- `build/Release/injector.exe`
根据 Visual Studio 生成器的不同,输出路径也可能显示在 `build/Win32/Release/...` 下。
## 发布版本
带标签的版本会通过 GitHub Actions 自动发布。
当推送匹配 `v*` 的标签时,工作流将:
- 在 `windows-2022` 上构建项目
- 打包 `homefront_freecam.dll` 和 `injector.exe`
- 包含 `README.md` 和 `BUILD.md`
- 将 `Homefront-Free-Camera--win32.zip` 资产上传至 GitHub Release 页面
有关发布步骤,请参阅 [BUILD.md](D:/proj/Fcam/BUILD.md)。
## 限制
- 硬编码绑定到特定版本的 `HOMEFRONT.exe` 构建。
- 使用 `CreateRemoteThread + LoadLibraryW`,因此杀毒软件或操作系统保护机制可能会干扰注入。
- 如果游戏以高权限运行,注入器通常也需要以高权限运行。
- 目前还没有特征码扫描或自动签名解析功能。Hook 地址和偏移量必须手动更新。
## 调试
该代码库在 [`src/log.h`](D:/proj/Fcam/src/log.h) 中包含一个简单的文件日志记录器,它会在 DLL 旁边写入 `freecam.log`,但目前主代码路径并未使用它。如果你需要对 hook 初始化或摄像机状态进行额外的诊断,可以快速将其接入。
该项目包含两个二进制文件:
- `homefront_freecam.dll` - 注入模块,用于 hook 游戏内的摄像机函数并驱动自由视角。
- `injector.exe` - 小型启动器,用于查找 `HOMEFRONT.exe` 并通过 `CreateRemoteThread + LoadLibraryW` 注入 DLL。
代码库使用 C++17 编写,通过 CMake 构建,并使用位于 `third_party/minhook` 下的本地 `MinHook` 依赖项。
## 功能简介
该 mod 会拦截原生游戏函数,该函数每帧计算玩家的摄像机位置和旋转。在原始游戏代码运行后,该 mod 会:
1. 从游戏中读取常规摄像机输出。
2. 在启用后的第一帧捕获该位置和旋转,作为自由视角的起始点。
3. 根据键盘输入更新自身的摄像机状态。
4. 用自由视角的位置和旋转覆盖函数输出。
5. 在自由视角处于活动状态时冻结 pawn,防止角色身体随移动输入发生漂移。
这使得你可以获得一个脱离角色控制的摄像机,而游戏的其余部分继续正常运行。
## 项目结构
- [`src/dllmain.cpp`](D:/proj/Fcam/src/dllmain.cpp) 在 DLL 注入后启动工作线程,等待启动完成,初始化 hook,并处理热键。
- [`src/hooks.cpp`](D:/proj/Fcam/src/hooks.cpp) 安装对 `GetActorEyesViewPoint` 的 hook,计算帧间隔时间,写入自定义摄像机值,并冻结 pawn。
- [`src/freecam.cpp`](D:/proj/Fcam/src/freecam.cpp) 存储自由视角状态,将 `FRotator` 转换为移动轴,并应用移动和旋转输入。
- [`src/input.cpp`](D:/proj/Fcam/src/input.cpp) 通过 `GetAsyncKeyState` 轮询键盘状态。
- [`injector/injector.cpp`](D:/proj/Fcam/injector/injector.cpp) 等待 `HOMEFRONT.exe`,在目标进程中分配内存,并远程加载 DLL。
## 工作原理
### 摄像机 Hook
目前的实现 hook 了一个硬编码的原生函数地址:
- 目标虚拟地址:`0x00A52070`
- 基于可执行文件 image base 重定位:`0x00400000`
这意味着该 mod 绑定到了特定版本的 `Homefront` 可执行文件构建。如果游戏二进制文件因补丁、其他版本或不同的发行版而发生改变,可能需要更新 hook 地址。
### Pawn 冻结
在自由视角处于活动状态时,该 mod 会直接将数据写入 pawn 位置字段,以保持玩家身体固定在原地:
- `0xBC`, `0xC0`, `0xC4` 对应 `X/Y/Z`
这些偏移量也是特定于版本的。
## 游戏内控制
- `F9` - 开启或关闭自由视角
- `F10` - 从游戏进程中卸载 DLL
- `W`, `A`, `S`, `D` - 向前、向左、向后、向右移动
- `Q` 或 `Space` - 向上移动
- `E` 或 `Ctrl` - 向下移动
- `Left`, `Right` - 偏航
- `Up`, `Down` - 俯仰
- `Shift` - 加速移动
- `Alt` - 减速移动
## 快速开始
1. 构建 `homefront_freecam.dll` 和 `injector.exe`。
2. 确保这两个文件位于同一目录下。
3. 启动 `Homefront`。
4. 运行 `injector.exe`,如有需要,建议以管理员身份运行。
5. 等待 DLL 加载成功的提示信息。
6. 在游戏中按 `F9` 启用自由视角。
有关构建步骤,请参阅 [BUILD.md](D:/proj/Fcam/BUILD.md)。
## 环境要求
- Windows
- CMake 3.20 或更高版本
- Visual Studio 2022 或其他支持 x86 架构的 MSVC 工具链
- `Win32` / `x86` 构建目标
- 位于 `third_party/minhook` 下的 `MinHook` 检出代码
如果项目不是作为 32 位构建,它会主动停止配置过程。
## 构建产物
成功进行 `Release` 构建后,预期输出为:
- `build/Release/homefront_freecam.dll`
- `build/Release/injector.exe`
根据 Visual Studio 生成器的不同,输出路径也可能显示在 `build/Win32/Release/...` 下。
## 发布版本
带标签的版本会通过 GitHub Actions 自动发布。
当推送匹配 `v*` 的标签时,工作流将:
- 在 `windows-2022` 上构建项目
- 打包 `homefront_freecam.dll` 和 `injector.exe`
- 包含 `README.md` 和 `BUILD.md`
- 将 `Homefront-Free-Camera-标签:API钩子, Bash脚本, C++, DLL注入, Linux, MinHook, 数据擦除, 流量审计, 游戏Mod, 游戏辅助工具