马上加入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在内存中映射来映射去,很容易出问题,这种情况尤其在游戏多开的时候 
 
可能还有一部分人不太明白,而高手一看就知道该怎么做了,希望能够抛砖引玉,大家多多讨论 
 
 
 |