学术研究版 — 基于多层反作弊规避技术修改的 Cheat Engine,用于网络安全教育和大学级别的逆向工程研究。
免责声明: 本项目仅用于学术研究、大学课程作业和网络安全教育。学术期结束后必须销毁。
┌─────────────────────────────────────────────────────────┐
│ Cheat Engine 7.5 │
│ (Lazarus / FreePascal) │
├─────────────────────────────────────────────────────────┤
│ T1: 用户态规避 │
│ ├─ 窗口/进程/注册表名称随机化 (-daltname) │
│ ├─ PE 元数据剥离与节区重命名 │
│ ├─ Rich Header 移除与时间戳随机化 │
│ ├─ 直接系统调用存根(绕过 ntdll.dll 钩子) │
│ └─ 从磁盘动态提取系统调用编号 │
├─────────────────────────────────────────────────────────┤
│ T2: 内核桥接 (BYOVD — WinNotify.sys) │
│ ├─ 反作弊检测(10 种引擎) │
│ ├─ 微软签名驱动 (WinNotify.sys / signeddrv.sys) │
│ ├─ 通过 IOCTL 进行内核虚拟内存读写(无需物理映射) │
│ ├─ 基于 CR3 的页表遍历,适用于任意进程 │
│ ├─ 通过内核基址泄露 IOCTL 绕过 KASLR │
│ ├─ ObCallback 绕过(内核结构操作) │
│ └─ 进程隐藏(PsActiveProcessLinks 链表摘除) │
├─────────────────────────────────────────────────────────┤
│ T3: DMA 硬件 [未实现] │
│ └─ PCIe FPGA/设备,用于虚拟机监控器级别的反作弊绕过 │
└─────────────────────────────────────────────────────────┘
.
├── README.md
├── Build.ps1 # 自动化构建流水线(克隆 CE、应用补丁、构建)
├── .gitignore
├── src/
│ ├── cheatengine.lpi # 项目:重命名元数据、-daltname 定义、输出重命名
│ ├── cheatengine.lpr # 主程序:动态 Application.Title
│ ├── NewKernelHandler.pas # 核心:T1+T2 集成、函数指针替换
│ ├── SyscallGateway.pas # T1:直接系统调用存根(Read/Write/Open/VQE)
│ ├── AntiCheatDetector.pas # T2:反作弊检测 — 进程、驱动、服务
│ ├── PhysicalMemory.pas # T2:驱动加载器 + 通过 IOCTL 进行物理内存读写
│ ├── KernelBridge.pas # T2:内核绕过编排器 + ObCallback 禁用
│ ├── StealthHiding.pas # T2:通过 PsActiveProcessLinks 链表摘除隐藏进程
│ ├── PEPatcher.ps1 # 构建后 PE 变异
│ └── Build-Stealth.ps1 # 旧版独立构建脚本
└── cheat-engine/ # 上游 CE 源码(由 Build.ps1 克隆)
表面混淆 — 使用 CE 内置的 {$ifdef altname} 条件编译:
"Runtime Modifier" 而非 "Cheat Engine 7.5"\Software\Runtime Modifier\ 而非 \Software\Cheat Engine\sysdiag64.exe 而非 cheatengine-x86_64.exe系统调用网关 — CE 的 DBK 内核驱动被禁用(其证书哈希已被 EAC/BE 列入黑名单)。取而代之,所有内存访问函数(ReadProcessMemory、WriteProcessMemory、VirtualQueryEx、OpenProcess)均通过直接 syscall 指令存根重定向:
ntdll.dllmov r10, rcx; mov eax, [syscall_num]; syscall; retntdll.dll 中安装的用户态钩子针对通过 ObRegisterCallbacks 阻止句柄创建的内核级反作弊:
EasyAntiCheat.sys、BEDaisy.sys)和服务WinNotify.sys / signeddrv.sys(微软 Authenticode 签名,2026 年,0 个 VT 检测)0x22200C):直接从内核已加载模块列表中读取 ntoskrnl.exe 基址0x222040/0x222044):读写任意内核虚拟地址 — 无需物理地址转换ActiveProcessLinks 以定位目标游戏进程0x222050/0x222054):使用游戏的 DirectoryTableBase 通过其自身的页表读写其虚拟内存OpenProcess、无需 — 对 ObCallbacks 完全不可见针对虚拟机监控器级别的反作弊(Vanguard、Faceit),需要 PCIe DMA 设备从总线读取物理内存,从而绕过内核和虚拟机监控器双重保护。作为未来研究扩展记录在案。
0x222040)0x222044)0x222050/0x222054)C:\Windows\System32\drivers\ 或与编译后的可执行文件同目录git clone https://github.com/NulledNah/cheat-engine-undetectable.git
cd cheat-engine-undetectable
.\Build.ps1 -Clean
# 如果 Lazarus 不在 C:\lazarus:
.\Build.ps1 -Clean -LazarusPath "D:\lazarus"
该脚本:
lazbuild 以 Release 64 位模式编译bin\sysdiag64.exe启动 sysdiag64.exe
│
├─ DetectAntiCheat() → 扫描正在运行的反作弊引擎
│
├─ [未检测到内核级反作弊]
│ └─ T1 激活:所有操作均使用系统调用绕过
│
├─ [检测到 EAC/BE 且 WinNotify.sys 可用]
│ ├─ 通过 SCM 加载驱动
│ ├─ IOCTL 0x22200C → 泄露内核基址(KASLR 已绕过)
│ ├─ IOCTL 0x222040 → 读取 PsInitialSystemProcess → 遍历 ActiveProcessLinks
│ ├─ 查找游戏 EPROCESS → 提取 DirectoryTableBase (CR3)
│ ├─ 从枚举中隐藏自身进程
│ └─ 所有内存操作均通过 CR3 页表遍历(零句柄、零 OpenProcess)
│
└─ [检测到 Vanguard/Faceit]
└─ 警告:虚拟机监控器级反作弊 — 需要 T3(DMA 硬件,未实现)
本项目演示了以下网络安全概念:
EPROCESS、ObCallbacks 和页表结构仅供学术使用 — 本项目是大学论文/研究课程的一部分。根据大学政策,学术期结束后将被销毁。
| 反作弊 | 类型 | 策略 | 状态 |
|---|
| Warden (暴雪) | 用户态 | T1 | 可用 |
| VAC (Valve) | 用户态 | T1 | 可用 |
| XIGNCODE3 | 用户态驱动 | T1 | 可用 |
| EasyAntiCheat | 内核驱动 | T2 | 需要 WinNotify.sys |
| BattlEye | 内核驱动 | T2 | 需要 WinNotify.sys |
| nProtect GameGuard | 内核驱动 | T2 | 需要 WinNotify.sys |
| Ricochet (CoD) | 内核驱动 | T2 | 部分可用 |
| Vanguard (Riot) | 虚拟机监控器 | T3 (DMA) | 未实现 |
| Faceit / ESEA | 内核 + 虚拟机监控器 | T3 (DMA) | 未实现 |
NtReadVirtualMemoryPsActiveProcessLinks 中摘除