前情回顾
FPS方框透视辅助开发教学1:数据挖掘和基本绘制
https://www.52xuejishu.com/forum-post/337.html
FPS方框透视辅助开发教学2:编写代码读取玩家数据
https://www.52xuejishu.com/forum-post/339.html
FPS方框透视辅助开发教学3:屏幕坐标转换算法、绘制文本到敌人
https://www.52xuejishu.com/forum-post/340.html
FPS方框透视辅助开发教学4:屏幕坐标转换算法完整解析
https://www.52xuejishu.com/forum-post/345.html
FPS方框透视辅助开发教学5:绘制所有敌人射线和距离
https://www.52xuejishu.com/forum-post/347.html
想学习游戏辅助开发没地方?
来这里,我们有基础版299和专业版2024
【基础版】包含4套教学,赠送价值158过检测过保护CE
B站平台可直达下单,手机访问效果最佳
包含:
学习游戏安全,加入游戏安全逆向基础版社区,现在优惠价299
游戏安全逆向:入门科普大全解
https://study.163.com/course/courseMain.htm?courseId=1212474809&share=2&shareId=1020678503
游戏安全逆向工程师:CE基础
https://study.163.com/course/courseMain.htm?courseId=1209141829&share=2&shareId=1020678503
C语言0基础入门游戏辅助开发实践
https://study.163.com/course/courseMain.htm?courseId=1213365801&share=2&shareId=1020678503
易语言0基础游戏辅助电脑脚本开发(正在更新ing)
https://study.163.com/course/courseMain.htm?courseId=1213780852&share=2&shareId=1020678503
优惠下单链接,学习游戏修改作弊、辅助脚本开发、飞天遁地透视自瞄辅助技术,您的最佳选择:
平台下单地址https://mall.bilibili.com/neul-next/detailuniversal/detail.html?isMerchant=1&page=detailuniversal_detail&saleType=10&itemsId=11262567&loadingShow=1&noTitleBar=1
下单后承诺以上四套内容全部开通在网易云课堂、永久观看时效、指导答疑
下单后即赠送过网络游戏检测保护的CE游戏修改器一套(价值158)
【专业版】包含12套教学,内容更多,工具更丰富,详情联系i-xiaodi
方框绘制逻辑
方框的绘制和射线不同,射线简单,方框则需要考虑远小近大
的原则
所以我们要设置一个方框大小的比值
假设方框原宽度是 20,那么就要 20/方框缩放比值
宽度是 40,那么就要 40/方框缩放比值
float 方框缩放比值 = 三维距离 / 1000;//判断是否在视野范围内if (!(fabs(鼠标朝向和敌人夹角) > 45)){DrawLine(512, 0, 屏幕x, 屏幕y - 19, TextCOLOR);//DrawString(屏幕x, 屏幕y - 19, TextCOLOR, nText_2D距离);DrawBorderBox(屏幕x - 20, 屏幕y - 20, 20 / 方框缩放比值 , 40 / 方框缩放比值, 1);}float 方框缩放比值 = 三维距离 / 1000; //判断是否在视野范围内 if (!(fabs(鼠标朝向和敌人夹角) > 45)) { DrawLine(512, 0, 屏幕x, 屏幕y - 19, TextCOLOR); //DrawString(屏幕x, 屏幕y - 19, TextCOLOR, nText_2D距离); DrawBorderBox(屏幕x - 20, 屏幕y - 20, 20 / 方框缩放比值 , 40 / 方框缩放比值, 1); }float 方框缩放比值 = 三维距离 / 1000; //判断是否在视野范围内 if (!(fabs(鼠标朝向和敌人夹角) > 45)) { DrawLine(512, 0, 屏幕x, 屏幕y - 19, TextCOLOR); //DrawString(屏幕x, 屏幕y - 19, TextCOLOR, nText_2D距离); DrawBorderBox(屏幕x - 20, 屏幕y - 20, 20 / 方框缩放比值 , 40 / 方框缩放比值, 1); }
方框透视绘制的模板参考第一篇帖子,已经给大家提供
《FPS方框透视辅助开发教学1:数据挖掘和基本绘制》
https://www.52xuejishu.com/forum-post/337.html
测试视频
粗略未优化代码整理
以下代码仅作debug版本,未经优化
仅仅作为科普使用,为了让大家能看懂,涉及大量中文变量名
大家可根据需求自行优化,调整为优秀的项目
代码回复可见
GDI绘制与反作弊漫谈
采用 GDI 直接绘制到游戏窗口,安全性是否更高?
✅ 相对更安全,因为 GDI(Graphics Device Interface)是 Windows 内置的绘图 API,不需要创建新的 D3D 设备,也不需要 Hook 任何游戏函数。
❌ 但仍然可能被检测,因为反作弊可以通过以下方式发现 GDI 绘制的行为。
反作弊检测 GDI 绘制的原理
尽管 GDI 直接绘制可以避免 D3D 设备检测,但反作弊系统仍有以下方法可以检测 GDI 绘制:
1. 监控 GetDC() 和 BitBlt() 调用
检测方式:
- 反作弊可以 Hook
GetDC()
或BitBlt()
,监视某些进程是否频繁对游戏窗口进行绘制。 - 如果发现游戏窗口的 HDC(设备上下文)被第三方进程频繁获取,则可能是外挂。
如何对抗?
✅ 减少 GetDC() 调用次数:每帧只调用一次 GetDC()
,然后尽可能在一次绘制中完成所有渲染。
✅ 使用 SetWindowLong() 伪装窗口,避免让反作弊发现你的进程在获取游戏窗口 HDC。
✅ 避免直接调用 BitBlt(),改用 DrawText()
或 TextOut()
,因为它们的调用频率较低,不容易触发检测。
2. 监视游戏窗口的 DC 访问
检测方式:
- 反作弊可以在游戏的主渲染线程中检查
GetDC()
返回的HDC
,如果游戏窗口的HDC
发生了异常更改(如被外部进程多次访问),可能是外挂。 - 反作弊可能会定期调用
ValidateRect()
或RedrawWindow()
强制刷新窗口,覆盖外部绘制的内容。
如何对抗?
✅ 避免频繁访问游戏窗口的 HDC,尽量减少 GetDC()
的调用。
✅ 使用 RedrawWindow()
在游戏窗口刷新前重新绘制,确保 Overlay 不被擦除。
✅ 监控游戏窗口的 WM_PAINT
事件,在游戏重绘时立即重新绘制 GDI 内容。
3. 读取屏幕像素
检测方式:
- 反作弊可能会使用
GetPixel()
读取屏幕上的某些区域,检查是否有异常颜色或特定形状的 UI 组件。 - 比如,游戏窗口本身可能不应该包含红色文本,但检测到 GDI 绘制的红色“D3D测试”文本,就可以判定为外挂。
如何对抗?
✅ 使用颜色近似的方法绘制,避免绘制特定颜色(如红色、绿色等高亮色)。
✅ 定期调整文字的位置、颜色或字体,使其不固定在某个位置,以避免模式识别。
✅ 在屏幕截图检测到时隐藏 GDI 绘制(见后文“屏幕截图检测”)。
4. 屏幕截图检测
检测方式:
- 反作弊可能会定期截图游戏窗口,并分析截图是否包含额外的 UI 元素。
- 可能会检测:
- 是否有不属于游戏的 UI 组件(例如 GDI 绘制的文字)。
- 颜色直方图是否出现异常(如额外的高亮颜色)。
如何对抗?
✅ Hook BitBlt()
,在游戏截图时隐藏 GDI 绘制的内容。
✅ 使用 WM_PAINT
事件进行定期重绘,让 GDI 绘制的内容仅在游戏渲染完成后短暂出现。
✅ 动态调整 GDI 绘制透明度,在检测到截图时降低绘制的 Alpha 透明度。
5. 进程扫描
检测方式:
- 反作弊会遍历所有进程,检查哪些进程访问了游戏窗口的 HDC。
- 可能会使用
EnumProcesses()
+GetWindowThreadProcessId()
找出所有对游戏窗口HDC
进行操作的进程。 - 反作弊可能会检查你的进程是否在白名单中,如果是陌生进程,就可能触发检测。
如何对抗?
✅ 伪装进程名称,将进程名伪装成合法的 Windows 进程(如 explorer.exe
)。
✅ 使用合法进程加载你的 GDI 代码,如 rundll32.exe
或 svchost.exe
。
✅ 手动映射 DLL(Manual Mapping),避免被 GetModuleFileNameEx()
检测到。
6. 检测窗口层级
检测方式:
- 反作弊可以调用
GetForegroundWindow()
+GetWindowRect()
,检测当前焦点窗口是否是游戏窗口。 - 如果游戏窗口不是前台窗口,但仍然被绘制内容,可能是外挂。
如何对抗?
✅ 周期性将游戏窗口设为前台窗口,模拟正常用户行为。
✅ **使用 SetWindowPos()
设置 Overlay 窗口的 Z 轴顺序,使其看起来像游戏的一部分。
如何提高 GDI 绘制的安全性?
尽可能规避反作弊检测,可以使用以下方法:
方法 | 可行性 | 安全性 | 适用场景 |
---|---|---|---|
减少 GetDC() 调用 | ⭐⭐⭐ | ⭐⭐⭐⭐ | 适用于普通 GDI 绘制 |
使用 TextOut() 代替 BitBlt() | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 避免被 BitBlt() 检测 |
Hook BitBlt() 以隐藏绘制 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 适用于屏幕截图检测 |
动态调整文字颜色 | ⭐⭐⭐ | ⭐⭐⭐ | 规避颜色分析检测 |
伪装进程名称 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 适用于进程扫描绕过 |
监控游戏窗口 WM_PAINT | ⭐⭐⭐ | ⭐⭐⭐ | 适用于窗口重绘保护 |