您的位置:首页 > 其它

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

2007-11-13 12:18 501 查看
  对于外挂可以分为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这样的游戏有好多判断是在客户端进行的,如果不用一些防御措施,想在让用户自觉不使用外挂是不太容易的。

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

希望能共同研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: