TC官方合作论坛

 找回密码
 立即注册
查看: 7322|回复: 23
打印 上一主题 下一主题

[其他] 游戏不支持后台?自己写插件!游戏进程注入与DX后台

[复制链接]
跳转到指定楼层
楼主
发表于 2012-2-26 22:45:37 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
这2个要一起讲,因为真正的dx后台(dx转gdi除外),是需要注入游戏进程的
注入游戏进程有多种方式,输入法注入,网络注入,注册表注入都先不说了,先说一下常用的
首先,Hook,所使用的API setwindowshookex,百度或者MSDN,最好查MSDN,比较详细
随便用个消息注入进程,你就可以在游戏当中做任何事情了,其中有个参数作为回调函数传入,也就是当收到消息的时候首先做我们回调函数中的事情,函数原型如下:
LRESULT CALLBACK HookProc   
(   
int nCode,   
WPARAM wParam,   
LPARAM lParam   
);   
HookProc是回调函数名。   
nCode参数是Hook代码,Hook子程使用这个参数来确定任务。这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。   
wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者***消息的信息

另外一种常用方法就是远程线程了,使用API createremotethread
该函数的原型如下:
HANDLE CreateRemoteThread(
     HANDLE hProcess,
     LPSECURITY_ATTRIBUTES lpThreadAttributes,
     SIZE_T dwStackSize,
     LPTHREAD_START_ROUTINE lpStartAddress,
     LPVOID lpParameter,
     DWORD dwCreationFlags,
     LPDWORD lpThreadId
);

参数说明:
hProcess:目标进程的句柄
lpThreadAttributes:指向线程的安全描述结构体的指针,一般设置为NULL,表示使用默认的安全级别
dwStackSize:线程堆栈大小,一般设置为0,表示使用默认的大小,一般为1M
lpStartAddress:线程函数的地址
lpParameter:线程参数
dwCreationFlags:线程的创建方式
                  CREATE_SUSPENDED 线程以挂起方式创建
lpThreadId:输出参数,记录创建的远程线程的ID


好了,注入先介绍这二种,现在我们已经进入游戏进程当中了,然后我们看下真正感兴趣的DX的后台
其实原理很简单,拦截dx接口函数,就是让dx的函数在执行之前或之后,首先执行我们的代码,比如你要读写屏,肯定要在其之前Hook,比如你要发送键盘鼠标消息,那就要在DInput的获取数据接口执行之后,替换其数据,让其传出我们的数据,就可以达到后台DX键盘或者鼠标了
只是现在DX相关文档有点少,我下面罗列出几个关键的接口,只要Hook了下面的几个接口,那么后台鼠标键盘,后台抓图,写屏,降cpu等等,都不是问题了
首先我们来看DDraw,你要知道D3d是对DDraw的继承,因此我们先来看DDraw,对于2D游戏来说,我们Hook哪里才能得到图像呢?当然是blt,和fastblt,通常fastblt得到的往往是构成屏幕的一部分图片,比如角色,背景等等单一图片,因此从blt中可以得到内存画面表面,也就能完全抓到后台图像了,顺便说一下,主表面就是显示器表面,有人曾经说dx直接写屏,因此不可能后台,这有一定的道理,因为如果你Hook了主表面,那么游戏被什么挡住,也就会抓到什么图,因此要Hook到内存表面才行,在其显示之前,就将其读出!
然后我们再来看D3d,这个可以通过Hook present来读取,当然还可以降CPU,写屏等等,和DDraw同理
最后是对DInput的hook,鼠标和键盘以及手柄都是通过这个来获取数据的,hook目标:GetDeviceData,GetDeviceState,一个缓冲模式,一个立即模式,键盘,鼠标,手柄数值统统按照常量,定义在DX SDK头文件中!

所有这些必须在目标进程当中进行,否则,就不能截获到正确的数据

这种做法是有一些弊端的,首先修改游戏内存是侵犯著作法的,呵呵,我也是听别人说的,您可能心里想,这谁管那么多?呵呵,那么我们说点更实际的,NP有的是不能Hook的,过NP也有很多手段,比如恢复API,暴力破解等等!
看过《编程高手箴言》的,可能些印象,dll在内存中映射来映射去,很容易出问题,这种情况尤其在游戏多开的时候

可能还有一部分人不太明白,而高手一看就知道该怎么做了,希望能够抛砖引玉,大家多多讨论


回复

使用道具 举报

24#
发表于 2013-12-20 00:37:03 | 只看该作者
找了 好久,高人啊
回复 支持 反对

使用道具 举报

23#
发表于 2013-6-23 15:53:49 | 只看该作者
学习学习
回复 支持 反对

使用道具 举报

22#
发表于 2013-3-3 22:18:08 | 只看该作者
收藏待用
回复 支持 反对

使用道具 举报

21#
发表于 2012-12-30 04:58:56 | 只看该作者
迷糊中,内存离我太遥远了
回复 支持 反对

使用道具 举报

20#
发表于 2012-12-26 11:25:42 | 只看该作者
眼下看起来还是象天书,不过多少增加了一点印象。
回复 支持 反对

使用道具 举报

19#
发表于 2012-11-29 15:49:18 | 只看该作者

比较高深 但是还是不太了解,希望学习能看懂
回复 支持 反对

使用道具 举报

18#
发表于 2012-11-19 02:55:04 | 只看该作者
技术贴应该全面
回复 支持 反对

使用道具 举报

17#
发表于 2012-9-16 20:00:53 | 只看该作者
理论懂了,不知如何实现
回复 支持 反对

使用道具 举报

16#
发表于 2012-8-26 20:40:05 | 只看该作者
谢谢分享,你这个我学习到了很多
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18043773号

GMT+8, 2025-9-18 21:21 , Processed in 0.162171 second(s), 23 queries .

Powered by 海安天坑软件科技有限公司

© 2001-2013 Comsenz Inc.

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