游戏安全实验室 首页 技术入门 查看内容

 阅读目录

外挂获取执行时机的方法

发布于:2016-6-13 18:08   |    124157次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

一、外部进程法

       外部进程就是指外挂功能和游戏逻辑不在同一个进程内,该方法使用场景上有一定的限制(无法调用游戏代码)。但也有一些好处,游戏进程内一直是游戏保护方案重点关注区域,外部进程刚好避开了游戏保护方案的关注从而更安全、存活周期也更久。从“限制“方面来解释大家可能不容易理解,所以这里就从什么场景能用外部进程发来说下什么时候外部进程法能适用。

1、FPS类游戏方框透视功能。一般透视对FPS游戏平衡影响比较大,所以透视是FPS类游戏的刚性需求功能。但是3D透视有时候会被对抗,CF游戏就是3D透视对抗方面做得比较好的游戏之一(曾经有长达数年的一段时间内游戏没有人物透视外挂)。当人物透视功能被对抗掉,但透视需求还在的情况下就催生了一种新的功能叫方框透视。所谓的方框透视就是通过读取玩家的三维坐标信息,通过坐标转换得到玩家相对屏幕的二维坐标,然后在屏幕中对应位置画一个方框来提示玩家所在位置的功能。由于方框透视只需要读取玩家坐标然后经过运算画框,不涉及调用游戏代码等内容,所以方框透视就可以用外部独立进程法。

     2、FPS类游戏十字准心功能。某些武器使用过程中是没有准星功能(例如狙击枪在不开镜情况下),或者准性扩散过大导致瞄准不易。所以就有人实现了十字准心功能,该功能也是比较适合外部进程实现服务的场景。

(狙击枪关镜状态下是没有准心的,外挂人为在桌面上画了一个)

3、MOBA类游戏打野计时功能。目前的打野计时功能对抗还没有对抗,所以各大插件都还是在游戏进程内实现的功能。由于打野计时也只是需要获取数据然后在桌面上显示出时间,所以外部进程法理论上也是适用的。有兴趣的同学可以尝试游戏内不注入模块,把打野计时功能放到游戏进程外部实现。

(野怪计时效果)

    由于外部进程法只是指一种外挂的形态,实现上并没有门槛,所以这里更多讲解该方法的适用场景,其他部分不做详细介绍。读者如果能把外部进程法和后面进阶篇降到的僵尸进程法结合将能达到十分出色的隐蔽效果。

 

二、独立线程法

      当把外挂模块注入到游戏进程内部之后,外挂模块只是起到存放代码的容器作用。除了DllMain函数外其它部分的代码并不会因为模块的加载而得到执行,需要主动调用功能代码才能实现外挂功能,所以要想把外挂功能用起来就必需要一个执行时机。如果操作只需要执行一次则放在功能响应函数中就可以,如果操作需要重复执行的则最简单处理方式就是开启一个独立的线程进行来进行。比如很多外挂感知按键响应开关就是通过开启一个独立的线程,然后不断读取键盘状态来实现。

Windows上比较常见的创建线程API主要有如下几个:CreateThread、_beginthread、_beginthreadex、AfxBeginThread。而这几个api中后几个是通过把CreateThread接口包装了一下,内部最终实现应该都是调用的CreateThead实现,关于这几个api的区别,如果有同学感兴趣可以看看《windows核心编程》这本书。这里线程创建举例以CreateThread为例,在线程内感知按键按键然后根据按键信息执行响应操作。如下面代码所示,第一步,创建一个线程处理函数ThreadProc。在实际使用过程中,我们需要把外挂功能代码的调用放到线程处理函数中去,例如实现透视或者十字准星等。举例功能仅仅是打印下日志信息。

 

第二步,也是最主要的功能,创建线程,通过函数CreateThread来实现,具体如下面代码所示。

三、Api挂钩法

Api挂钩主要是指通过hook系统函数来感知执行时机以及获得执行机会。该方法也是现在的外挂使用最多的技术之一。Api挂钩一般用在对执行时机要求比较精准的情况下。比如3D透视需要在BeginSceneEndScene之间修改ZEnable,而代码执行过程瞬息万变,不通过hook的方式是没有办法准确感知时机的,所以目前主流的透视外挂功能都是通过hook d3d9.dll的代码实现的。以已经消失的cccp 透视外挂为例,他就是通过hook d3d9的以下三个函数实现:

EndScene@CD3DBase@@UAGJXZ

DrawIndexedPrimitive@CD3DBase@@UAGJW4_D3DPRIMITIVETYPE@@HIIII@Z

CreateQuery@CD3DBase@@UAGJW4_D3DQUERYTYPE@@PAPAUIDirect3DQuery9@@@

(CCCP 透视功能使用截图)

Api挂钩法的好处在于HOOK点不在游戏逻辑模块内,所以相对安全一些。

四、定时器法

定时器法是指通过系统提供的api向操作系统注册一个定时回调函数,当到达设定的时间后操作系统会主动调用我们注册的回调函数,我们可以在回调函数内做一些我们想做的事情。定时器的作用和独立线程差不多,在线程内用while(true) + Sleep的方式在对 精度要求不高时基本可以替代。不过用独立线程法则线程起始地址在我们自己的模块内,用定时器的话则线程起始地址在系统模块范围内。比如疾风的幽幽外挂就是利用来定时器来获取执行时机,祥见分析:https://gslab.qq.com/article-34-1.html

定时器相关函数主要有SetTimertimeSetEvent两种方式,下面分别针对两种方式写个简单示例。

1、 SetTimer方式。

SetTimer函数告诉Windows一个时间间隔,然后Windows以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。不需要指定定时器时,可以调用对应的KillTimer函数销毁指定的时钟。我们下面的例子是使用发送WM_TIMER消息通知。功能是进程收到消息的时候,会弹出一个msgbox。

运行结果如下:

 

2、 timeSetEvent方式。

timeSetEventSetTimer相比他不会有窗口的限制。SetTimer 的回调是基于windows消息触发,所以必须有窗口和消息队列,timeSetEvent的使用则没有这个限制。

运行结果如下:

备注:无论是函数timeSetEvent还是函数SetTimer,需要注意的是任务处理的时间不能大于周期间隔时间。

五、游戏代码HOOK法

游戏代码hookhook 系统api原理一致的,但由于hook位置不同而导致了使用场景和效果也会有差异。

Hook系统api好处在于安全,但其依赖游戏逻辑的实现是否有调用api,所以并不是所有地方都能选择hook api的方式解决。例如假设一个游戏的伤害计算在客户端进行,我们要实现一个秒怪的功能,如果游戏开发过程中有使用memset来进行一些结构体的初始化,那么我们就可以通过hook memset 查看返回值来感知伤害运算的执行时机,从而修改栈上或者内存里的数据实现秒怪功能,同事没有修改游戏代码功能实现也更隐蔽。

hook游戏代码则由于hook点在游戏范围内,所以一般会被游戏保护方案重点关注,安全性稍差,但功能也会更强大。理论上如果游戏存在一定的漏洞,修改数据的方式不一定能利用、CALL游戏函数的方式也不一定能可行,但如果允许修改游戏代码则一定可以成功利用。

 

关于HOOK游戏代码实现功能的,这里推荐大家参考植物大战僵尸双开实现“的文章,对应链接如下:

https://gslab.qq.com/article-85-1.html


*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)


分享到:
踩0 赞0

收藏

上一篇:创建MFC工程(基于VS 2013)

下一篇:常见锁定目标进程的方法分享

最新评论
B Color Image Link Quote Code Smilies

发表评论