游戏安全基础 GDI外部绘制(1)
本帖最后由 cferwudi 于 2020-2-14 17:28 编辑声明:本人大一在读 不是大佬 勿喷
动画教程还没做好 以后补上 这里是文字叙述
引用知识点:<windwos程序设计><MFC编程><CE>
既然是外部绘制第一步就是创建一个属于我们自己的透明窗口我们创建的透明窗口有两个关键,
第一.窗口大小要和游戏客户区窗口一样大第二.窗口一定要透明
什么是游戏客户区窗口?
如图是一个游戏窗口,去掉“Counter-Strike”这个标题栏就是我们的客户区大小
客户区大小就是游戏的分辨率比如说我现在的CS1.6 它的分辨率是1280x720,那么这个游戏窗口的客户区大小就是1280x7201280指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=0rc.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
链接挂了 私信我补链接
排版有点问题 将就点看吧 问下楼主@cferwudi
获取游戏的基地址(某DLL +一个常量偏移)
你这样的写法还原是://获得内存地址
HANDLE handle = GetModuleHandle(L"模块.dll");
DWORD 该函数的地址 = (ULONG_PTR)handle + 0x123;//该函数在DLL模块中的偏移
能不能直接这样写:DWORD 该函数的地址 = GetProcAddress(GetModuleHandle(L"模块.dll"),"函数名");//获得内存地址 多谢楼主 正需要这方面资料,多谢楼主! 多谢楼主 厉害了,谢谢 感谢分享。 大神厉害了 正想学习相关知识,感谢分享 厉害了 感谢分享
页:
[1]
2