开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 20851|回复: 96
收起左侧

[转载教程] D3DHOOK方框透视及透明窗口外部绘制原理解析

[复制链接]
发表于 2020-9-22 02:26:59 | 显示全部楼层 |阅读模式   甘肃省天水市
想必玩过FPS游戏的同学都知道,FPS有一个通病就是外挂多,其中最典型的代表就是方框透视了,通过在游戏窗口上绘制方框的方式来显示敌人的所在位置。
方框透视初期是由D3D HOOK实现的:

这里拿d3d9做示例:当我们打开FPS游戏程序后,首先会创建一个正常的windows窗口,然后会调用Direct3DCreate9这个函数来创建一个D3D对象,然后通过这个D3D对象利用CreateDevice函数来创建一个D3D设备,再然后就可以调用各种绘制函数在这个D3D设备上绘制各种图形,如人物模型、游戏地图等、最后调用Present这个函数将前面调用的绘制函数渲染出的图形提交给显卡以显示到显示器上~
D3D HOOK的原理则是通过修改游戏程序的内存实现绘制,如通过GetProcAddress函数获取到Direct3DCreate9这个函数的地址,然后我们就可以通过Direct3DCreate9函数继续获取到CreateDevice函数的地址,然后通过CreateDevice函数又可以获取到Present的地址,而D3D HOOK的就是Present这个地址,通过Hook Present这个地址在Present函数之前加入我们自己的绘制函数渲染后执行Present将图形提交给显卡至显示器!
备注:Hook是一种可以改变代码执行流程的技术,例如某FPS游戏将人物及地图绘制完成后将要调用Present函数把图形提交给显卡,而我们用过hook技术修改了这个Present函数,将其跳转到我们自己编写的函数里,在这个函数里我们可以尽情的写我们自己需要执行的代码,例如计算敌人的位置并绘制出方框。当我们自己的函数运行完之后再调用Present函数,使得游戏绘制的模型和我们绘制的方框一起被显卡绘制。

010933qy1yjbhxxzpf9qci.png

D3D HOOK就相当于是补丁,就像是我们给游戏额外开发了一个新功能一样,绘制帧数都和游戏一模一样。其缺点就是,修改游戏内存会触发游戏内的冗余代码检验。俗称CRC检测。
那么为了绕过CRC检测,于是诞生了我们的外部窗口绘制,其原理就是在游戏窗口的上层创建一层透明窗口,然后我们的绘制函数是运行在这个透明窗口上的,而这个透明窗口与我们的游戏窗口属于两个不相关的进程,所以也就不会被游戏进程的CRC检测到了。当然也有一些人会选择直接干掉CRC检测,例如将执行检测的那段代码入口nop掉,或者jmp等,再者是抹掉注入DLLPE特征等。
无标题.png
通过创建透明窗口实现外部绘制方框透视:
这里我们拿易语言做示例:

首先我们需要创建一个windows窗口,这里直接使用易语言创建就行
.版本 2

' 自己创建一个窗口并载入(我们将用这个窗口作为透明的绘制窗口)
载入 (窗口1, , )

' 读取被创建的窗口的句柄
窗口句柄 窗口1.取窗口句柄 ()

' 接下来使用SetWindowLongA设置窗口样式,GetWindowLong的意思便是获取窗口原来的样式,整句话的意思就是窗口原有的样式基础上再添加一些样式!!创建窗口的详细样式大家自己百度一下就知道了
SetWindowLongA (窗口句柄, -16, 位与 (GetWindowLong (窗口句柄, -20), 位取反 (位或 (256, 1))))

' 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1
ShowWindow (窗口句柄, 1)

' 更新客户区
UpdateWindow (窗口句柄)

' 设置窗口的扩展样式
SetWindowLongA (窗口句柄, -20, 589992)

' 将窗口设置为透明,参数1为需要透明的窗口的句柄;参数2则是需要被透明掉的颜色,0为黑色;参数3表示透明度,0-2550表示完全透明,255为完全不透明,这里是完全透明;参数4则是透明方式
SetLayeredWindowAttributes (窗口句柄, 0, 0, 1)

一些游戏为了防止创建第三方绘制窗口,会强制将自己的游戏窗口置顶,这样你创建的透明绘制窗口就无法绘制到游戏窗口的上层,解决办法就是使用SetWindowPos将游戏窗口取消强制置顶!

纯源码例子已经打包,看懂了此例子也就不用再去使用别人的D3D绘制模块了,自己就可以编写纯源码D3D绘制了!


透明窗口绘制例子.e

12.42 KB, 下载次数: 955, 下载积分: 精币 -2 枚

评分

参与人数 2精币 +2 收起 理由
1215276862 + 1 新技能已get√
鸽子花花 + 1

查看全部评分


签到天数: 1 天

发表于 2024-9-3 11:00:29 | 显示全部楼层   广东省深圳市
有CS1.6的人物地址吗?
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)

签到天数: 5 天

发表于 2024-8-25 20:40:32 | 显示全部楼层   广东省深圳市

支持开源~!感谢分享
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2024-7-25 11:39:01 高大上手机用户 | 显示全部楼层   印度尼西亚
谢谢分享
回复 支持 反对

使用道具 举报

发表于 2024-7-25 02:07:07 | 显示全部楼层   云南省文山壮族苗族自治州
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

发表于 2024-7-20 14:40:47 | 显示全部楼层   河南省商丘市
感谢支持
回复 支持 反对

使用道具 举报

发表于 2024-7-20 14:40:22 | 显示全部楼层   河南省商丘市

支持开源~!感谢分享
回复 支持 反对

使用道具 举报

发表于 2024-7-20 14:40:09 | 显示全部楼层   河南省商丘市
正在学习 感谢
回复 支持 反对

使用道具 举报

结帖率:50% (3/6)
发表于 2024-6-28 18:32:59 | 显示全部楼层   广西壮族自治区柳州市
7666666666666666666666666666666666666666
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 4 天

发表于 2023-12-28 07:00:24 | 显示全部楼层   云南省曲靖市
能用吗
回复 支持 反对

使用道具 举报

发表于 2023-10-7 07:52:53 | 显示全部楼层   河南省许昌市
感谢楼主分享的教程和资源
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表