FPS方框透视辅助开发教学6:实现GDI绘制方框透视(完结)

前情回顾

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站平台可直达下单,手机访问效果最佳

https://mall.bilibili.com/neul-next/detailuniversal/detail.html?isMerchant=1&page=detailuniversal_detail&saleType=10&itemsId=11262567&loadingShow=1&noTitleBar=1

包含:

学习游戏安全,加入游戏安全逆向基础版社区,现在优惠价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

https://mall.bilibili.com/neul-next/detailuniversal/detail.html?isMerchant=1&page=detailuniversal_detail&saleType=10&itemsId=11262678&loadingShow=1&noTitleBar=1

方框绘制逻辑

方框的绘制和射线不同,射线简单,方框则需要考虑远小近大的原则

所以我们要设置一个方框大小的比值

假设方框原宽度是 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);
}

方框透视绘制的模板参考第一篇帖子,已经给大家提供

《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.exesvchost.exe
手动映射 DLL(Manual Mapping),避免被 GetModuleFileNameEx() 检测到。


6. 检测窗口层级

检测方式:

  • 反作弊可以调用 GetForegroundWindow() + GetWindowRect(),检测当前焦点窗口是否是游戏窗口。
  • 如果游戏窗口不是前台窗口,但仍然被绘制内容,可能是外挂。

如何对抗?
周期性将游戏窗口设为前台窗口,模拟正常用户行为。
✅ **使用 SetWindowPos() 设置 Overlay 窗口的 Z 轴顺序,使其看起来像游戏的一部分。


如何提高 GDI 绘制的安全性?

尽可能规避反作弊检测,可以使用以下方法:

方法 可行性 安全性 适用场景
减少 GetDC() 调用 ⭐⭐⭐ ⭐⭐⭐⭐ 适用于普通 GDI 绘制
使用 TextOut() 代替 BitBlt() ⭐⭐⭐⭐ ⭐⭐⭐⭐ 避免被 BitBlt() 检测
Hook BitBlt() 以隐藏绘制 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 适用于屏幕截图检测
动态调整文字颜色 ⭐⭐⭐ ⭐⭐⭐ 规避颜色分析检测
伪装进程名称 ⭐⭐⭐⭐ ⭐⭐⭐⭐ 适用于进程扫描绕过
监控游戏窗口 WM_PAINT ⭐⭐⭐ ⭐⭐⭐ 适用于窗口重绘保护

请登录后发表评论