`
tianshibaijia
  • 浏览: 1128050 次
文章分类
社区版块
存档分类
最新评论

对战平台原理分析

 
阅读更多

游戏对战平台,在没有了解的情况下,总是给人一种很神秘的感觉,然而,当你对socket的理解到达一定程度之后,你就不会再觉得神秘。
用一句话来总结这种技术:虚拟局域网(VLAN)。

实现这种平台,主要是客户端,而客户端有很多种方法,就我所了解,可以用面三种方法实现:
1. 替换Windows socket DLL,然后,你想做什么就做什么吧。
2. 进程注入,HOOK WinSock函数调用。
3. 虚拟网卡驱动。

其实,前两种技术,也是许多木马使用的方法。正所谓技术是一面双刃剑,看你要用到什么地方了。现在的对战平台,就我了解,使用的是后两种方法。大多数是第2中----毕竟,驱动在有些用户权限下是无法安装和使用的。
浩方,QQ对战平台,VS等,基本上都是采用第二中方法。第三种方法,见过一个。效果还可以。

下面介绍一下我研究时写的平台结构:
整个平台包含两个组成部分:服务端和客户端。
通讯方式:全部采用UDP通讯。

零、基础知识:
如果你有志与开发这样一个类似平台,我建议你先了解以下内容:
a. Windows协议栈的简单了解。
b. WinSock通讯。
c. HOOK技术。
d. 线程,进程之间的数据交换和通讯。
e. 线程之间的同步。
f. 线程注入。
e. 其它的一些Windows开发的基础知识,就不一一列举了。

这些都是基本功,基本功如何,决定了你能走到哪一步。

一、服务端:
服务器在逻辑上被分为了两部分:
a. 用户服务器: 虚拟IP分配,用户管理,消息通知等。
b. 转发服务器: 进行必要的数据转发(无法进行P2P通讯的)

二、客户端:
客户端也包含两个部分,
a. 客户端EXE: 负责进行进程注入,与服务器通讯。
b. 客户端DLL: 负责进行socket函数替换和处理。

注:这里,服务器和客户端都有KeepAlive的功能,如果在一定时间内未收到包,则认为用户已经掉线。

三、主要工作流程:
这里主要对用户登陆和登出,启动和退出游戏这连个主要环节进行总结。

a. 用户登陆过程
+-------------------------------+
| 输入用户名和密码,登陆 |
+-------------------------------+
|
+-----------------------------+
| 发送登陆包到服务器 |
+-----------------------------+
|
+-----------------------------+
| 处理反馈信息 |
+------------------------------+
|
<登陆成功> ------------失败-------------> [提示用户]
|
+------------------------------+
| 请求其他在线用户信息 |
+-----------------------------+

用户登陆信息客户端处理流程

+--------------------+
| 收到用户登陆包 |
+--------------------+
|
<数据解析>----------------> [丢弃不合法数据包]
|
<验证用户登陆信息> -----------失-败-------+
| |
| |
+----------------------------+ +---------------------------------+
| 分配虚拟IP地址 | |反馈登陆失败信息到客户端|
+----------------------------+ +-------------------------------+

|
+--------------------------------------+
| 添加用户到在线用户列表 |
+--------------------------------------+
|反馈用户登陆成功,服务器信息|
| 到客户端 | (* 这里包含了转发服务器信息)
+--------------------------------------+
|
+------------------------------+
|广播信息到所有登陆用户|
+-----------------------------+

用户登陆信息服务端处理流程(由用户服务器处理)

b. 用户登出过程

+--------------------+
| 收到用户退出包 |
+--------------------+
|
<数据解析>----------------> [丢弃不合法数据包]
|
+----------------------+
< 查找将用户信息 > ------------> 未找到,不处理
+---------------------+
|
+----------------------------------------+
| 将用户从在线用户列表中删除 |
+---------------------------------------+
|
+------------------------------------+
| 回收虚拟IP给其他用户 |
+-----------------------------------+
|
+-------------------------------------------+
| 广播用户登出信息到所有在线用户 |
+-------------------------------------------+

服务器处理过程

<判断用户是否在游戏中> -----------是------------> 提示用户
|

|
+-----------------------------+
| 发送登出包到服务器 |
+-----------------------------+
|
+-------------------------+
| 退出 |
+-------------------------+
客户端处理过程

c. 游戏启动过程

+--------------------------+
| 创建内存共享 |
| (CreateFileMapping) |
| 写入游戏当前配置 |
| (包含在线用户信息和 |
| 转发服务器信息) |
+--------------------------+
|
+-----------------------------+
| 根据用户选择启动游戏 |
| (调用CreateProcess) |
+----------------------------+
|
<是否启动成功> ------------否----------> [提示用户失败信息]
|
+-----------------------------+
| 将游戏DLL注入到游戏 |
+----------------------------+
|
+--------------------------------+
| 读取游戏的配置信息 |
+-------------------------------+
|
+-----------------------------+
| 连接转发服务器 |
+-----------------------------+
|
+--------------------------------------+
| 游戏DLL HOOK所有网络函数 |
| (采用Inline Hook方式) |
+-------------------------------------+
|
+----------------------------------+
| OK, now game start OK! |
+----------------------------------+


d. 游戏退出过程

+----------------------------------------------+
| 游戏DLL释放所有已经HOOK的函数 |
+---------------------------------------------+
|
+-----------------------------------+
| 关闭内存共享文件 |
+-----------------------------------+
|
+--------------------------------------+
| 发送退出包到转发服务器 |
+--------------------------------------+

四、游戏DLL工作过程:

整个平台运作过程中,最主要的部分恐怕就是这个部分了,所以,单独将这部分的结构进行一下说明。

在这里,我将处理过程分成了三个层,每个层分别完成不同的功能:网络HOOK层,自定义协议栈,网络数据传输层。
首先,HOOK所有上层的网络函数调用,然后交给自定义协议栈进行处理,处理完成后,如果需要发送数据,则交由下层的网络发送层进行发送。

+----------------------------------------------------------+
| |
| 网络函数HOOK层: 主要负责网络函数的替换 |
| 并且交由下层处理 |
| 这里,其实也就是对于WS2_32.dll中的 |
| socket函数进行替换。 |
| |
+---------------------------------------------------------+
| |
| 数据处理层:主要负责将上层的各种网络 |
| 函数功能调用进行处理。 |
| 举个简单的例子,当游戏调用Socket函数 |
| 准备创建一个socket时,我们根据它的参数, |
| 内部虚拟出一个socket句柄给它。而实际的上 |
| Windows本身并不知道这个调用过程。 |
| |
+-------------------------------------------------------+
| |
| 真实网络传输层:在这一层,才是真正的将数|
| 据包进行包装和发送的过程 |
| |
+-------------------------------------------------------+

其实,整个客户端只创建了两个socket,一个用于和服务器通讯的socket,另外一个就是在游戏DLL中创建的一个和转发服务器以及游戏之间通讯所使用的socket。
这里重要的就是中间的那层,主要就是对于socket调用中的每个函数进行模拟。这个就需要各位自己去了解了。我不可能也没有能力把每个都描述出来。
其实,这里的第二层处理也可以不采用我的这种方法,可以采用协议替换法,比如,当游戏调用socket函数要创建一个IPX socket时,你可以修改其中的参数,变成UDP,然后调用Windows真实的socket函数。

五、主要的技术难点:
a. 模拟Windows Socket。

这个技术点,说起来就比较多了。我们知道Windows有六中socket模型,我们必须模拟出来大部分的模型(根据游戏所使用的模型不同而需要模拟的模型就不同)。
根据我的跟踪和测试,说说现在了解的几个游戏所使用的socket模型和协议类型:

《红色警戒》: 使用了简单的WSAAsyncSelect模型。(IPX协议)
《星际争霸》: 使用了Select 模型。(IPX, UDP协议,根据用户的参数)
《暗 黑》: 使用Select模型。(使用TCP协议)
《反恐精英》: 使用Select模型。(使用TCP, UDP协议)
《冰封王座》: 似乎使用了IOCP Socket模型。这个还不是很清楚。(使用TCP,UDP两种协议)

b. 改进UDP数据通讯的可靠性。
整个平台中,所有通讯全部使用的是UDP,所以,这点很重要。如果我们的游戏中采用了TCP通讯,我们在模拟的时候就的保证所有数据都能被对方收到。

六、开发后记:
去年的时候,我写过一个英文的对战平台研究,现在看看,那简直是垃圾!可能是那是比较浮躁,对于什么东西都没有了解清楚。一年后,再回过头来看我写的那些代码,真是惨不忍睹。现在,我觉得自己心静了很多,技术上也成熟了许多。想说的就是Windows开发,我可以算是入门了吧!呵呵!
整个平台,只是在我的机器上进行测试和开发,难度比较大。工程。现在,我也只对《红色警戒》, 《星际争霸》, 《暗黑》三个游戏测试通过。感觉一个人开发实在太累了,而且,这些东西都是经过一次次的AV错误一步步调试出来的,想想那些岁月,真是不堪回首!暂时不想再继续下去了。等什么时候有精力和时间的时候再来处理吧。
很多时候,为了能够调试通过一个函数,我不知要经历多少次的游戏重启过程。基本上MSDN上的大多数socket函数已经被我翻了个遍,每个函数的参数,返回值等都的了解。
为了了解Windows实现socket的原理,阅读那份据说是Win2K的源码(如果你想阅读的话,到网上搜索一下,解压后大概有700M),关于socket的那部分代码在/win2k/private/net/sockets/winsock2/wsock32目录下(估计是WS2_32.dll的源码),读了很多内容,也了解了一些东西,也让我知道以后怎么去写socket程序。现在我有时写代码写累的时候,还会去看点Windows的源码,挺有意思的。像gina的实现,CommCtrl的实现等。
代码大概已经写的至少有一两万行了,基本上都是我在EditPlus/NotePad中一个字母一个字母敲出来的。暂时不想共享出来了,就分享一下原理篇给大家。

原文地址:http://blog.163.com/etomahawk.popo/blog/static/919644820081131115223397/

分享到:
评论

相关推荐

    对战平台技术分析(网络编程)

    电子竞技发展史、所需知识储备、电竞平台模型分析、主要运作流程

    Java毕业设计-JAVA五子棋手机网络对战游戏的设计与实现(源代码+论文).rar

    该游戏充分利用了JAVA语言的跨平台特性,能够在多种智能手机上运行。通过无线网络技术,玩家可以在同一局域网内或广域网中与其他玩家进行实时对战。游戏界面简洁明了,操作便捷,同时提供了丰富的音效和动画效果,...

    Java实现的五子棋手机网络对战游戏(源代码+论文),可用作毕业设计,课程设计

    毕业论文——包含了一篇探讨五子棋手机网络对战游戏项目背景、技术原理和实现过程的学术论文,可作为论文撰写参考。通过阅读论文,学习者可以了解项目的理论基础,深入理解项目的实现细节,提升分析和解决问题的能力...

    中国象棋ai人工智能(网页版)

    中国象棋AI原理:博弈树,极大极小值搜索,α-β剪枝算法

    JAVA五子棋手机网络对战游戏的设计与实现(源代码+论文)_new.rar

    论文:这部分包含了对整个Java Web系统的概述,设计的目标、需求分析、系统分析与设计方法、相关的技术研究和背景知识等。学生可以通过这些论文了解到项目的整体框架和设计思路。 设计文档:详细记录了系统的设计...

    基于C语言实现比特大战(编译原理项目实验)【100011989】

    实验要求 设计一种程序语言可以用来描述比特大战...实现一个程序:用户可以输入若干的策略,每个策略保存一个文本文件,模拟这些策略两两之间的回合(例如,n=200)的比特大战,并以所有对战得分的总和为这些策略排序。

    中国象棋人工智能论文集

    这是本人收集的有关中国象棋人工智能的论文集 2009计算机博弈专辑文章.pdf Computer Games Are an Efficient Tool for Event Game Theory.pdf MINORS HASH TABLE IN COMPUTER CHINESE...计算机博弈原理与方法学概述.pdf

    Python机器学习应用

    本课程面向各类编程学习者,讲解当下流行的机器学习相关的技术和方法,帮助学习者利用Python语言掌握...(1)讲解AlphaGo背后的机器学习原理(强化学习); (2)游戏对战实例展示,通过实例展示自主学习的强大魅力。

    石头剪刀布 C++工程

    加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力,培养学生利用系统提供的标准函数及典型算法进行设计,并对Windows平台下的控制台进行深入的了解。 基本要求 ...

    石头剪刀布小游戏

    加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力,培养学生利用系统提供的标准函数及典型算法进行设计,并对Windows平台下的控制台进行深入的了解。 基本要求 ...

    C游戏编程从入门到精通(13M)

    59 6.4 本章小结 63 第7章 中文显示 64 7.1 文字显示原理 64 7.2 西文显示 65 7.2.1 使用ROM字符集 65 7.2.2 使用西文字库 67 7.3 中文平台下文字显示 69 7.3.1 汉字显示方法 69 7.3.2 中文平台判别 69 7.4 西文平台...

    design:Java以及计算机网络课程设计源码以及文档(均使用Java Swing编写),主要包括人机五子棋,即时通信软件,远程屏幕监控系统

    具体原理可以参见你可以学到: JavaSwing机器分析棋盘的方法(重点)即时通讯是一个单对单的即时通信软件。你可以学到: 套接字实现通信自定义协议远程屏幕监控系统是一个服务端到客户端的屏幕监控系统,服务端可以...

    微信小程序五子棋游戏AI实现方法【附demo源码下载】

    主要介绍了微信小程序五子棋游戏AI实现方法,结合实例形式分析了五子棋游戏中人机对战的AI原理及相关实现技巧,并附带demo源码供读者下载参考,需要的朋友可以参考下

    java俄罗斯方块游戏

    遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。 此次设计在Microsoft Windows XP系统下,以Java为开发...

    CBB-Stats

    高校篮球统计 NCAA Division 1男子篮球队的对战和模拟工具。 该应用程序可预测比赛的得分结果,并提供团队获胜的可能性。 还有一个部分,可让您根据概率模拟游戏的得分。 该应用程序本身就是“ ,托管在Shinyapps上...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    java源码包2

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

Global site tag (gtag.js) - Google Analytics