是的,这种外挂的主流实现方案大概有三种:
【方法一】:覆盖式渲染 - 使用 DirectX 状态钩挂,这是早期和中期外部挂最常用的方法之一。
原理:游戏本身使用DirectX API(如d3d9.dll, d3d11.dll)来渲染画面。外挂会通过DLL注入等方式,将代码注入到游戏进程内部,然后钩住关键的DirectX函数,例如EndScene, Present。
过程:
外挂DLL被注入到游戏进程。
DLL钩住IDirect3DDevice9::EndScene或IDXGISwapChain::Present等函数。
当游戏调用这个函数准备显示画面时,外挂的代码会先被执行。
在外挂的代码里,它使用同一个DirectX设备接口,直接在游戏的渲染目标上绘制方框、线条和文字。
执行完外挂的绘制命令后,再跳回游戏的原始函数继续执行。
为什么能绕过检测:
无额外窗口:所有绘制都是在游戏进程内部,使用游戏的渲染资源完成的,系统层面不存在任何可疑的覆盖窗口。
绘制与游戏一体:从图形驱动和操作系统的角度看,这些方框和游戏本身的模型、UI没有任何区别,都是同一个来源的绘制指令。
【方法二】:桌面合成劫持 - 使用 Desktop Duplication API
这是更现代、更隐蔽的外部绘制方法,完全不需要侵入游戏进程。
原理:Windows系统有一个“桌面窗口管理器”,它负责将所有窗口的最终图像合成到屏幕上。微软提供了Desktop Duplication API,允许程序以极低的延迟捕获整个屏幕(或某个特定显示器)的最终图像流。
过程:
外挂程序作为一个独立的进程运行。
它使用Desktop Duplication API直接访问桌面合成器最终输出的帧缓冲区。
外挂获取到这一帧的图像后,在内存中对其进行修改,比如在特定坐标画上方框。
然后,它再创建一个全屏覆盖的、无边框透明窗口(或者更高级的,使用硬件覆盖层)。
关键点:这个窗口只显示被修改过的、带有方框的那一帧图像,并且这个窗口是半透明的。
由于它覆盖了整个屏幕,且内容与桌面背景几乎完全一致(只多了几个方框),用户看起来就像是游戏画面被绘制了方框。
为什么能绕过检测:
进程隔离:外挂是一个完全独立的进程,不向游戏进程注入任何代码,因此游戏的反外挂系统根本无法检测到它的存在。
检测困难:游戏要检测这种方式非常困难,因为它需要判断“屏幕上显示的内容”是否被第三方修改过。这涉及到复杂的图像识别和比对,计算开销巨大且容易误判。
【方法三】:内核模式绘制
这是最强大、最隐蔽,但也最危险(对系统稳定性而言)和最容易导致法律风险(对开发者而言)的方法。
原理:外挂以内核驱动的方式运行,拥有与操作系统同等级别的权限。
过程:
外挂驱动被加载到系统内核。
驱动可以直接操作显卡的硬件层,或者拦截、修改图形驱动(如NVIDIA/AMD驱动)与显卡之间的通信。
它可以在最底层的帧缓冲区中直接写入像素,或者修改传递给GPU的绘制命令。
为什么能绕过检测:
权限压制:反外挂系统通常运行在用户模式,权限远低于内核驱动。内核驱动可以隐藏自身、拦截反外挂系统的检测调用,甚至直接关闭反外挂进程。
深度隐藏:绘制行为发生在图形栈的最底层,完全绕过了所有高级API(如DirectX/OpenGL)。