精易论坛

标题: D3DHOOK方框透视及透明窗口外部绘制原理解析 [打印本页]

作者: 肥蛋仔    时间: 2020-9-22 02:26
标题: D3DHOOK方框透视及透明窗口外部绘制原理解析
想必玩过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函数,使得游戏绘制的模型和我们绘制的方框一起被显卡绘制。



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

首先我们需要创建一个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, 下载次数: 1039, 下载积分: 精币 -2 枚


作者: 1294617768    时间: 2020-9-22 08:18
分享是美德
作者: 小秋秋呀    时间: 2020-9-22 09:09
我倒是有一个未解之谜,也是D3DHOOK的不是那种方框,是直接显示人物的 过滤顶点数什么的 进入游戏第一次能显示出来 可是换图后就会错乱地图且人物没显示(应该是没置顶)  你有何见解。
作者: atglkm123    时间: 2020-10-6 14:42
楼主 666  技术性帖子。 赞赞赞
作者: atglkm123    时间: 2020-10-6 14:43
小秋秋呀 发表于 2020-9-22 09:09
我倒是有一个未解之谜,也是D3DHOOK的不是那种方框,是直接显示人物的 过滤顶点数什么的 进入游戏第一次能 ...

换图 属于你ID 问题。 每个场景,模型ID 都不一样。

作者: atglkm123    时间: 2020-10-6 14:44
我有个问题请教楼主, D3D11 中,如何判断 人物 是否被遮挡。
例如: 人物在墙后,禁用Z缓 后,能够达到透视效果。  但是人物没有遮挡的时候,整个人物全是透明的,啥也看不见。
作者: 小秋秋呀    时间: 2020-10-6 22:10
atglkm123 发表于 2020-10-6 14:43
换图 属于你ID 问题。 每个场景,模型ID 都不一样。

但是,我关闭游戏 重新登录 再进去那个乱的地图  是没问题的 然后再换其他地图就会乱
作者: 190700084    时间: 2020-10-8 00:12
小白的我 看的津津有味
作者: qq137547401    时间: 2020-10-11 19:29
小白的我 看的津津有味
作者: 2717677063    时间: 2020-10-20 16:14
小白的我 看的津津有味
作者: 2717677063    时间: 2020-10-20 16:27
谢谢分享 期待没有bug
作者: 华立小萌神    时间: 2020-11-22 21:46

小白的我 看的津津有味
作者: 已注销321974    时间: 2020-12-8 09:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: 546520406    时间: 2020-12-13 12:07
留言研究学习
作者: zwh8698    时间: 2021-4-17 11:57
小白的我 看的津津有味
作者: RanGwaz    时间: 2021-4-24 11:35
感谢分享,学
作者: cemfen    时间: 2021-4-25 00:00
aaaaaaaaaaaaaaaaaaa
作者: 2369558683    时间: 2021-5-8 22:39
牛逼 aaaaaaaaaaaaaaaaaaa
作者: 2369558683    时间: 2021-5-8 22:40
学习学习学习
作者: xujianc    时间: 2021-5-10 09:24
6666666666666666666666
作者: 1632129307    时间: 2021-5-19 01:08
谢谢分享 期待没有bug
作者: 梦奕曲    时间: 2021-5-21 03:51
谢谢分享
作者: 英勇善战的空白    时间: 2021-5-28 08:56
感谢楼主的分享
作者: 英勇善战的空白    时间: 2021-5-28 08:57
感谢楼主的分享
作者: jiqigouer    时间: 2021-6-25 14:48
感谢教程,学习一下
作者: bclzmxj    时间: 2021-7-6 00:34
感谢分享,正在学习
作者: bingye03    时间: 2021-7-12 08:05
asddddddddddddddddddddddd
作者: ffoicq11    时间: 2021-7-12 23:02
66666666666666
作者: warcai    时间: 2021-7-20 21:25

感谢分享,正在学习
作者: abc335    时间: 2021-8-8 18:33
好东西我学习了
作者: 星河旧梦    时间: 2021-8-10 10:05
66666666666666666666666666666666
作者: 蓝白酱    时间: 2021-9-25 10:34
666666666666666666
作者: 蓝白酱    时间: 2021-9-25 10:34
66666666666666666666666666666666
作者: 起風了    时间: 2021-10-13 09:14
文字有毛刺怎么解决啊
作者: 577829848    时间: 2021-10-14 13:44
厉害,66666666666666666666
作者: 的好哇好哇还    时间: 2021-10-23 14:13
666666666666666666666666666666666
作者: 的好哇好哇还    时间: 2021-10-23 14:13
666666666666666666666666666666666
作者: lxk0810    时间: 2021-10-23 20:31
666666666666666666666666666666666

作者: lxk0810    时间: 2021-10-23 20:31
666666666666666666666666666666666

作者: qingshangovo    时间: 2021-10-24 16:38
66666666666666666666666
作者: gtahos    时间: 2021-10-25 19:48
66666666666666666666666
作者: xuxianqianga    时间: 2021-10-27 10:48
的点点滴滴多多多多多多多多多多多
作者: miles    时间: 2021-10-28 11:02
666666666666666666
作者: Ezra    时间: 2021-11-30 00:19
66666666666666666666666
作者: Ezra    时间: 2021-11-30 00:19
66666666666666666666666
作者: 特别nb    时间: 2021-11-30 11:10
66666666666666666666666
作者: Ezra    时间: 2021-12-1 00:25
源码例子已经打包,看懂了此例子也就不用再去使用
作者: Ezra    时间: 2021-12-1 00:25
源码例子已经打包,看懂了此例子也就不用再去使用
作者: 久念啊    时间: 2021-12-2 19:28
D3DHOOK方框透视及透明窗口外部绘制原理解析
作者: 小豪6    时间: 2022-2-8 21:10

源码例子已经打包,看懂了此例子也就不用再去使用
作者: 温暖的舌骨    时间: 2022-3-12 00:47
看看看看
作者: 65s    时间: 2022-4-26 19:02
aaaaaaaaaaaaaaaaaaaaaaaaa
作者: 65s    时间: 2022-4-26 19:02
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
作者: fy1992    时间: 2022-5-2 22:22
感谢,感谢正好在研究这方面东西!
作者: a45167039    时间: 2022-5-18 02:20
感谢,感谢正好在研究这方面东西!
作者: yufutai    时间: 2022-5-22 19:33
感谢,感谢正好在研究这方面东西!
作者: gay酱    时间: 2022-6-12 18:42
支持支持支持支持支持支持支持支持
作者: gay酱    时间: 2022-6-12 18:43
支持支持支持支持支持支持支持支持
作者: 吃饭第一名    时间: 2022-6-30 18:22
为了防止创建第三方绘
作者: jin946    时间: 2022-7-4 17:02
支持支持支持支持支持支持支持支持
作者: jin946    时间: 2022-7-4 17:02
感谢正好在研究这方面东西!
作者: 892141059    时间: 2022-7-21 14:49
啊啊啊啊啊啊啊啊啊啊
作者: 网络注册络员    时间: 2022-8-9 17:32
学习一下
作者: sowei1988    时间: 2022-8-11 10:46
这个可以,就是金币不够....
作者: yangdoudou    时间: 2022-8-18 16:43
这个可以,谢谢分享
作者: sowei1988    时间: 2022-8-24 14:30
没有币了
作者: sowei1988    时间: 2022-8-24 14:30
没有币了
作者: atianlei    时间: 2022-8-24 23:08
这个可以绘制图片吗??
作者: atianlei    时间: 2022-8-24 23:09
这个可以绘制图片吗??
作者: hahacctv    时间: 2022-9-9 14:59
D3DHOOK方框透视及透明窗
作者: a951281437    时间: 2022-9-24 14:29
66666666666666
作者: zyzzyz123    时间: 2022-10-6 17:53
33333333333333333333333333
作者: luoxiaowei    时间: 2022-10-30 13:57

这个可以,就是金币不够....
作者: 林希    时间: 2022-12-2 02:40
水电费水电费水电费水电费水电费水电费水电费水电费水电费水电费收到
作者: 小笨蛋吖    时间: 2022-12-4 19:39
谢谢,拿走了
作者: 加QQ494759180    时间: 2023-1-1 15:53
有新方法分享吗  我觉得这个非常实用
作者: W秋    时间: 2023-1-20 13:47
6666666太赞了!!!!!!!!!支持
作者: AsReCv    时间: 2023-2-13 17:59
谢谢,拿走了
作者: cawin    时间: 2023-2-24 16:48
hrd1747h4t15df4741h4tf4
作者: cawin    时间: 2023-2-24 16:49
htfr874h45tf415415jh
作者: LiYJ    时间: 2023-3-8 22:28
支持开源~!感谢分享
作者: yangdoudou    时间: 2023-4-25 10:18
给楼主点赞或评分打赏,让楼主更有动力创作优秀内容!
作者: 幸福长久    时间: 2023-8-1 23:51
这个可以,就是金币不够....
作者: 幸福长久    时间: 2023-8-1 23:51
这个可以,就是金币不够....
作者: 窥伺    时间: 2023-8-11 09:32
        开源精神必须支持~
作者: b8008    时间: 2023-9-18 20:16
分类就撒砥砺奋进爱上
作者: sy1638    时间: 2023-9-19 20:26
将窗口设置为透明,参数1为需要透明的窗口的句柄
作者: wcy1538    时间: 2023-10-7 07:52
感谢楼主分享的教程和资源
作者: 416601816    时间: 2023-12-28 07:00
能用吗
作者: ganqing1234560    时间: 2024-6-28 18:32
7666666666666666666666666666666666666666
作者: mulejylt    时间: 2024-7-20 14:40
正在学习 感谢
作者: mulejylt    时间: 2024-7-20 14:40

支持开源~!感谢分享
作者: mulejylt    时间: 2024-7-20 14:40
感谢支持
作者: 疯狂的木头    时间: 2024-7-25 02:07
支持开源~!感谢分享
作者: waisukaikai    时间: 2024-7-25 11:39
谢谢分享
作者: Easy易人    时间: 2024-8-25 20:40

支持开源~!感谢分享
作者: 295608008    时间: 2024-9-3 11:00
有CS1.6的人物地址吗?
作者: freejzh    时间: 2024-11-19 14:06
这么好的东西不顶一下简直是一种耻辱
作者: lxmidi    时间: 2024-11-24 10:13
感谢分享
作者: lxmidi    时间: 2024-11-24 10:19
感谢分享                    




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4