游戏开发论坛

 找回密码
 立即注册
搜索
查看: 18548|回复: 29

如何更加有效防止用户使用外挂

[复制链接]

22

主题

42

帖子

131

积分

注册会员

Rank: 2

积分
131
发表于 2005-5-19 00:50:00 | 显示全部楼层 |阅读模式
作者:李新全  newsoil@163.com


对于外挂可以分为2种一种是良性外挂一种是恶性外挂。

1、良性外挂:主要是通过模拟操作系统的按键/鼠标对游戏客户端进行操作,对于游戏的平衡以及游戏性不会有大的影响,反会给用户带来更多的方便。

2、恶性外挂:主要是通过修改程序里的内存数据、网络包裹数据及服务端的BUG来达到超出游戏本身的性能。

  轻则造成用户对游戏的平衡以及游戏性有大的影响。重则造成服务器在分析数据包出错或一时间内接收的数据包过多造成负担过重引起瘫痪。

  这2种结果都可以让这款游戏运营失败!!!!


防止外挂

1、可以通过法律的手段来实施。这里主要讨论通过技术的手段来达成。

2、客户端平台扫描,查找有关外挂的窗口、进程。如果发现可以关闭它。并把该用户的ID及发现的窗口、进程发给服务端进行分析。

3、内存数据保护,这是个相当难实现的方案。因为WINDOWS在9X和NT工作在不同的内核下。

4、网络数据包加密保护。这是主要讨论的实行方案。
首先必须使用一种比较安全的对称加密算法,能够满足数据包不同长度的情况,加密解密速度要快。

首先要把数据包进行详细的分类,根据发送间隙频率、数据包裹大小、数据内容来分类。

最重要的是构造一种每天或在不同时段采用不同的密匙进行加密.当然必须让所有已经登陆的用户能够在一瞬间也自动更换该密匙.且该密匙必

须有效地保护起来防止被从内参中读取出.最好的办法是把该密匙分成几个部分来存放.或把它排列打乱来存放.

如一个密匙用8的字节或来保存.
可以在不同的位置
char szPass1[3];
int **;

//部分代码

char szPass2[5];
char **;
int **;

char szpass3[3];

然后在使用的时候进行组装就可以使用了.这样能有效地防止被从内存中找出。

由于对称加密算法对数据的长度有一定的要求。
所以我们要对需要发送的不够长的数据进行填充。

像客户端从A点走到B点就给服务端发一个消息包裹。
typedef struct tagGM_MOVE
{
    WORD        iId;        //用户ID
    UINT        iX;        //在地图坐标
    UINT        iY;
    WORD    iRate;        //用户速度
}GM_MOVE,*LPGM_MOVE;

像GM_MOVE这样的长度的数据进行*p加密
Decrypt(char *szPass1,char *szPass2,char * szPass3,int *p,int iSize);
然后在把数据*p转化为char的包裹并发送到服务端

服务得到该包裹后把char转化为数据在加密.
Encrypt(char *szPass1,char *szPass2,char * szPass3,int *p,int iSize);

注意客户端和服务端的加密解密函数是一样的.


现在是如何构造一种自动跟换密匙的系统.
假定采用8个字节的长度来做为密匙.

假定在用户在线人数最少的时刻(凌晨4点)进行更换密匙.

a)首先随机产生一组密匙,判断该密匙在该加密算法中是否是弱密匙,如果是则从新产生一组.
b)全局发送新密匙并用上次的密匙加密.并且在该消息保管里附带该密匙在现在向后延长几秒种后生效(假定10m).
如果现在有用户登陆怎么办.对这是个严重的问题.我们必须重新为登陆系统设计一套采用公密匙系统来做为登陆时候来传送密匙.
c)既然定了10秒后需要更新密匙,那么就要在Decrypt之前加个时间判断机制,因为如果还不到10m就用新密匙来加密会造成服务端就不能正确解

密.或在过了10秒还用旧密匙加密还用就有可能不能解密.当然还有构造一种假定网络延迟的机制.就是如果在10~12秒这个阶段的数据包不能正

确解密的话就用旧的密匙进行解密.

但过了13秒后就必须马上销毁旧的密匙以防止外泄.

d)不同的分类信息采用不同的加密算法(16位的用一个16位的加密解密函数)(256位的用另外一个256位的加密解密函数)。


5、防止像变速齿轮这样的外挂。
  首先说明一下变速齿轮的工作原理,就是改变游戏速度的程序。其主要就是截获了系统里timeGetTime、GetTickCount等时间相关的函数使其返回的值变成被加速了的值。

  如果在2台计算机上测试其中一台使用变速齿轮并加速。另外一台正常运行。然后调用timeGetTime()把该值保存。在过2m再调用timeGetTime(),第2次的值减第一次的值你会发现被变速齿轮加速的计算机值要比没有被加速的大好多(2台计算机同步测试)。

  那要防止这样的外挂就很容易了,只要在客户端和服务端上进行一次或多次判断就可以了。如果该客户端的值比服务端的值大就从服务端断开该分机就可以了。

  目前想WOW这样的游戏有好多判断是在客户端进行的,如果不用一些防御措施,想在让用户自觉不使用外挂是不太容易的。

  大量的删号只会造成用户的反感。其实也不需要在游戏的主程序中加入这样的代码。可以做成一个单独的模块与服务端进行判断。

希望能共同研究

0

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-5-19 13:55:00 | 显示全部楼层

Re:如何更加有效防止用户使用外挂

个人感觉,想封外挂比较困难,否则,用不着这种业余论坛来发贴子说明情况,那些开游戏公司的人早就用这种办法了。

网络游戏,肯定要传数据包,数据肯定要加密,又要实现双方验证加解密,又要对每个传过来的数据做各种检验(比方说移动得距离太远?攻击速度太快?拿着东西超出自己的能力?等等非常情况)对几千人在线的服务器来说,恐怕计算量太大了!

即使是实现了双方数据包收发加解密,也防不上外挂,因为客户端内存是暴露在程序员面前的,想改一下并不困难,在你发数据之前就改掉了,那些加解密又有什么用?

客户端检验外挂进程也不容易,写得好的病毒式的外挂,是没有自己的进程的,只有线程。

文章写得不错,让我的思路更清晰了。前两天我也在想怎么防外挂的问题,一直没想明白,呵呵

如果哪个游戏敢说自己绝对防止外挂,我看那纯粹是骗子。

朋友们,想一想你身边的所有软件,凡是有点价值的,哪一个没有破解版?

4

主题

118

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2005-5-19 18:15:00 | 显示全部楼层

Re: Re:如何更加有效防止用户使用外挂

fffaaa2005: Re:如何更加有效防止用户使用外挂

个人感觉,想封外挂比较困难,否则,用不着这种业余论坛来发贴子说明情况,那些开游戏公司的人早就用这种办...

话不能说得这么绝对,外挂确实难以杜绝,但并不是完全不能,如果把所有数据计算完全放在服务器来进行,当然可以完全杜绝外挂,但这又受到服务器承载能力的限制,尤其对于3D游戏来说,简直是不可能的任务,所以,这种方法只能在对服务器要求较低的2D游戏上使用,比如 大话西游,他是2D回合制游戏,不用检测碰撞,对服务器的要求相对一般游戏大大降低,所以它敢把所有数据放到服务器来做,至少在我离开大话西游的时候(那时已经运营2年)还没有任何真正意义上的外挂。唯一一款外挂是一款类似键盘精灵的挂机外挂,另据说有一种可以在地图上显示地图上所有玩家的外挂,未经证实,不过危害也不大。
      综上所述,要杜绝外挂,在类似大话西游的2D回合制游戏已经一些休闲游戏中是完全可行的,其他种类游戏,还有待于服务器硬件水平的提高
[em21]

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2005-5-19 19:24:00 | 显示全部楼层

Re:如何更加有效防止用户使用外挂

原来这里是业余论坛吗?

0

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2005-5-19 22:13:00 | 显示全部楼层

Re: Re: Re:如何更加有效防止用户使用外挂

skinny: Re: Re:如何更加有效防止用户使用外挂


话不能说得这么绝对,外挂确实难以杜绝,但并不是完全不能,如果把所有数据计算完全放在服务器来进行,当...


呵呵,我是纯业余选手,本周才开始想外挂问题,因为我想自己编一个较小的图型化聊天程序(如果可能,也加上攻击等动画动作)放到自己行业的内部网络中。想到互联网上N多的外挂,怕内部网络中一样存在外挂爱好者,所以就花了几天时间认真考虑了一下网络游戏的外挂问题,就是上面回的那贴。

我的最初设计是这样的,游戏运行过程中用DES使用登陆时客服端通过公钥技术传输的密钥加密数据包,因为客户端每次收发才几十个字节,服务器在线人数不多,完全承受得了。后来想了想,在一个外挂制作者的眼中,你的网络数据包是怎么加密的应该不重要,更改在发送之前的游戏数据,也就是是否能够操作内存中的数据才是根本(当然,如果服务端做了全部的数据逻辑检查,客户端就是改变了内存数据也无效)。

对服务端防外挂来说,根本就是对各种发来的数据的正确性有效性做检验,(比如移动速度是否太快,攻击频率是否太快等等等等,如果这些基本的都不检验,那就别怪外挂泛滥了),这些都是需要服务器计算资源的。简单的行为逻辑检验几行语句就能完成,稍微复杂点的甚或必要的大量的关联性检验的在几千人在线的服务器上就不太可能实现了。

对于skinny所说的大话西游的2D3D之说,我是深不以为然的,对网络传输封包这一层来说,他们之间没有区别,他们之间仅有的区别也只是客户端的光影效果。另外就是当然,上面这些都是在我脑子中空想的,和实际是否存在巨大差距我就不得而知了,skinny更有发言权。

看看市面上的游戏,体积庞大,可仔细一看,有关执行操作的EXE,DLL程序加起来不足游戏体积的1%,可能1G2G的游戏执行程序只有2M3M,剩余的全部是DIRECTX的多媒体效果素材,可想而知,要想编写一个网络游戏,网络程序员工作是多么轻闲,呵呵

我的想象中,网络游戏的结构如下:

多媒体编程DIRECTX-------执行程序vc6(重点在服务端对客户端发来数据的各种逻辑检验还要能适应硬件处理能力------网络数据传输vc6(重点不在加解密,而在SOCKET连接池)

如果我是老板,我找三个人负责这三个方面就齐全了

一家之言,纯属想象,还望大家多批评,呵呵

22

主题

42

帖子

131

积分

注册会员

Rank: 2

积分
131
 楼主| 发表于 2005-5-20 00:48:00 | 显示全部楼层

Re:如何更加有效防止用户使用外挂

关于判断移动速度、攻击频率快的问题在服务端也不好判断。
比如A在10:25:44m攻击了怪B接着移动,那么要判断是否过快就只有通过时间来判断了。
如果有6000人同时在线。那这样一个6000人的链表就要多6000*2的字节了。再加上判断我决的那样可能会让服务器更复杂。基本上的数据包都是有加密的只是他们设计等太简单了。全部采用固定的方式,一但让人家分析出算法就没用了。但是如果采用带密匙的形式就不会有这个问题了同样采用DES你不知道密码给你数据包裹也是没用的啊?

呵呵“网络程序员工作是多么轻闲”其实最难设计的就是在这了。
如果没 设计好模型那碰到数据掉包、队列不正确、延迟等问题可就不好弄了。
可不像局域网内那么简单。一个数据包可能要经过10多个路由你怎么保证它能到达不与另外一个数据包掉转队列。

7

主题

203

帖子

203

积分

中级会员

Rank: 3Rank: 3

积分
203
QQ
发表于 2005-5-20 07:25:00 | 显示全部楼层

Re: Re:如何更加有效防止用户使用外挂

comer: Re:如何更加有效防止用户使用外挂

关于判断移动速度、攻击频率快的问题在服务端也不好判断。
比如A在10:25:44m攻击了怪B接着移动,那么要判...


TCP协议不存在“数据掉包、队列不正确” 延时就是不同步,客户端省略一部分显示效果即可

43

主题

298

帖子

1510

积分

金牌会员

Rank: 6Rank: 6

积分
1510
发表于 2005-5-20 10:19:00 | 显示全部楼层

Re:如何更加有效防止用户使用外挂

大话II不会出现显示所有当前地图所有玩家的外挂,因为服务器没有发送当前地图
所有玩家的信息给客户端。不过倒是可以见得到普通地图上未必能见到的人,稍为
超出屏幕之外的。

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-5-20 11:46:00 | 显示全部楼层

Re:如何更加有效防止用户使用外挂

个人觉得只要有游戏客户端的存在,就有外挂存在的空间,除非你的客户端只显示,不返回任何数据.不过不返回任何数据的游戏现在不存在,永远也不会存在.

6

主题

382

帖子

384

积分

中级会员

Rank: 3Rank: 3

积分
384
发表于 2005-5-20 16:15:00 | 显示全部楼层

Re:如何更加有效防止用户使用外挂

游戏的游戏性本身也可以确定外挂的数量,现在的游戏,感觉满需要外挂的!!汗!!!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 02:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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