dwgx@blog:~$dwgx
> cd ../posts

cs2-walkbot-ext:CS2 外部走路机器人 准星像人手

// created

CS2 外部巡逻机器人,全程不注入 DLL、不 hook 游戏函数。只用 ReadProcessMemorycs2.exe 的状态读出来,再用 SendInput 从进程外合成键鼠。内存只读,输入从外面打进去。

想解的问题就一个:怎么让机器鼠标看起来不像机器。市面辅助的准星都是啪一下贴上去,线性瞬移一眼假。我要的是人手那种曲线,起手、滑行、到点收敛,还带抖。大半乐趣都在这。

瞄准写了三套,运行时切换。Legacy Smooth 最早,标量 EMA,够用但很数值。Adaptive Servo 按伺服控制来做,PID 加 jerk 限制,终于有点物理感。Humanized 最满意,WindMouse 风噪声配 Fitts 定律算目标速度,自然长出 start-glide-settle,再叠 tremor、drift 和随机 kick,跑起来是真像人手。另外加了运动预测和紧急刹车,停时反打抵消滑行,不然会滑过点。敌人支持就近跟踪,也能把队友当敌人。

移动走一张录出来的航点图。普通点直连,分支点走 Sequential / Random / Cycle 三种,全落到 paths.json。另配了几个 Python 脚本生路径,从 demo 轨迹提取,或抠 Mirage 中心线,跟 C++ 主程序完全解耦,不参与构建。

主体 C++20,Windows 控制台,UI 用 Dear ImGui + DX11。overlay 单开一个线程,WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST 点击穿透,靠 WorldToScreen 把航点投到屏上画。跑要管理员权限,ReadProcessMemory 得提权,进游戏 F6 启、F7 停。

数据流大概这样:

cs2.exe memory ─┐
                ├─> interfaces ─> walkbot_core (state) ─> path_runner (decision) ─> SendInput
process/memory ─┘                        │
                                         └─> Overlay Thread ─> WorldToScreen

最大的坑就一个字:偏移。CS2 一更新,SDK dump 出来的偏移和签名就可能失效。维护点收在两处,interfaces.h::Initialize() 的模式扫描签名,和 sdk/*.hppMEM_PAD(offset),更新完基本就补这俩。纯实验的东西,没测试没 CI 没 linter,偏移坏了手动补。当练手项目挺值。