吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7395|回复: 18
上一主题 下一主题
收起左侧

[C&C++ 转载] 游戏安全基础 GDI外部绘制(1)

  [复制链接]
跳转到指定楼层
楼主
cferwudi 发表于 2020-2-14 17:30 回帖奖励
本帖最后由 cferwudi 于 2020-2-14 17:28 编辑

声明:本人大一在读 不是大佬 勿喷  
          动画教程还没做好 以后补上 这里是文字叙述
引用知识点:<windwos程序设计>  <MFC编程>  <CE>

既然是外部绘制第一步就是创建一个属于我们自己的透明窗口我们创建的透明窗口有两个关键,
第一.窗口大小要和游戏客户区窗口一样大第二.窗口一定要透明
什么是游戏客户区窗口?

如图是一个游戏窗口,去掉“Counter-Strike”这个标题栏就是我们的客户区大小

客户区大小就是游戏的分辨率比如说我现在的CS1.6 它的分辨率是1280x720,那么这个游戏窗口的客户区大小就是1280x720  1280指x轴的长度 720指y轴的长度
什么是X轴和Y轴?


大概就是这个图的意思注意: 当x=0时叫做窗口客户区的left     当 x最大(这里x最大=1280)叫做窗口客户区的right     当 y=0时叫做窗口客户区的top     当y最大(这里y最大=720)叫做窗口客户区的bottom

有了这些认识,就可以开始找游戏窗口的句柄用FindoWindowsA(“窗口类名”,“窗口标题”)来找游戏窗口,它会返回一个HWND 类型的窗口句柄
然后用GetClientRect来获取游戏客户区的大小,它的大小会保存到上图的rc里保存后这里的rc就会有: rc.left=0  rc.top=0   rc.right=1280   rc.bottom=720然后注意区别一下和GetWindowsRect的区别
接下来开始创建一个窗口(引用MFC知识点)
首先注册一个窗口类

这里的窗口类最重要的一个属性是窗口的回调函数   (我没有使用消息循环(感觉有点麻烦不如直接销毁窗口))


然后找到游戏窗口相对于电脑桌面的位置

接下来创建属于我们自己的窗口


这样就成功创建了一个窗口


关于游戏的检测:我们创建窗口的时候一定要往正常的窗口上靠拢 比如保留最小化 最大化按钮 然后就是要随机化窗口标题 窗口类型 窗口鼠标等减少特征
然后要保证窗口透明



虽然我们成功创建了一个窗口,但是绘制人物方框的时候仍然存在闪烁和卡顿,然后可以引用双缓冲(也叫双缓存)来解决这些问题 (CPU占用会高一点)



然后我们需要获取游戏数据来绘制人物方框首先要取游戏进程的PID
然后要获取游戏的基地址(某DLL +一个常量偏移)这里我封装了一个函数(遍历进程读取模块)(就是拍快照然后匹配名字找DLL地址)(我上一次的报告写了DLL注入,也可以通过注入的方法获取游戏DLL地址)



这样这个函数的返回值就是dll的基地址注意是 !!!十进制的 所以在封装 内存读写 的时候 要利用(PBYTE*)来转换
下面就是我封装的 内存 读的操作



有了上面的操作,就完成了透视的准备阶段,然后就是利用三角函数算法和矩阵算法和骨骼来绘图


          声明:上面的只是一个学习流程 里面的API需要自身去学习         
                    其次就是动画还没准备好 因为时间长 很容易录怪 又要重录 怪麻烦的         
                   最后 DX绘制也跟这个流程差不多 大家去查一下 理解了GDI 很容易理解DX          IMGUI 要稍微麻烦一些

                  最后 大家要做一个造轮子的人 我上面的中文命名只是为了方便易语言的同学!!!!
                 大家不要只会易语言调用模块!!!! 会了上面的知识点 自己造一个模块调用 不舒服嘛!!!
源码:        链接:https://pan.baidu.com/s/1g6KoEnKGsIgh9Pzikk_0-g                 提取码:44sw
链接挂了 私信我补链接

免费评分

参与人数 5吾爱币 +6 热心值 +5 收起 理由
CrazyNut + 2 + 1 先收藏一下,期待大佬后面的教程,视频就完美了
523740194 + 1 + 1 我很赞同!
韬. + 1 + 1 热心回复!
WanPJ007 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
audooking + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| cferwudi 发表于 2020-2-14 17:30 |楼主
排版有点问题 将就点看吧
推荐
Jack丶雷 发表于 2020-2-15 02:57
问下楼主@cferwudi
获取游戏的基地址(某DLL +一个常量偏移)
你这样的写法还原是://获得内存地址
                                    HANDLE handle = GetModuleHandle(L"模块.dll");
                                    DWORD 该函数的地址 = (ULONG_PTR)handle + 0x123;//该函数在DLL模块中的偏移
能不能直接这样写:DWORD 该函数的地址 = GetProcAddress(GetModuleHandle(L"模块.dll"),"函数名");//获得内存地址
3#
AzraelFMW 发表于 2020-2-14 18:13
4#
WanPJ007 发表于 2020-2-14 18:15
正需要这方面资料,多谢楼主!
5#
韬. 发表于 2020-2-14 18:18
多谢楼主
6#
linyin1750 发表于 2020-2-14 18:33
厉害了,谢谢
7#
海细123 发表于 2020-2-14 18:34
感谢分享。
8#
_早安先生 发表于 2020-2-14 19:02
大神厉害了
9#
fishykz 发表于 2020-2-14 19:22
正想学习相关知识,感谢分享
10#
xiaojane 发表于 2020-2-14 19:55
厉害了 感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 09:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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