年终总结(三):游戏对战平台研究终结篇

etomahawk 2008-12-31 12:02:26
加精
本来,不打算写第三篇了,因为没有太多东西可以写,而且总觉得自己写的东西很肤浅。不像技术文章,更像入门级别的。但看到大家都挺支持我的,就再写一篇。
不过,这一篇中,没有代码共享给大家,只是简单的原理篇。喜欢代码的可能要失望了。你的当成散分帖好了。
得分规则参考第一帖。

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

游戏对战平台,在没有了解的情况下,总是给人一种很神秘的感觉,然而,当你对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的函数 |
+---------------------------------------------+
|
+-----------------------------------+
| 关闭内存共享文件 |
+-----------------------------------+
|
+--------------------------------------+
| 发送退出包到转发服务器 |
+--------------------------------------+

.....
(您只能输入 8000 个字符) 郁闷!只能到原帖去看了!
...全文
2781 155 打赏 收藏 转发到动态 举报
写回复
用AI写文章
155 条回复
切换为时间正序
请发表友善的回复…
发表回复
lynn_gu 2011-09-01
  • 打赏
  • 举报
回复
学习学习~
zhuimengzh 2011-07-16
  • 打赏
  • 举报
回复
好贴!
PinkPacino 2011-04-18
  • 打赏
  • 举报
回复
值得学习下~
b13272012771 2011-03-30
  • 打赏
  • 举报
回复
顶一个先!
zdylilan 2009-03-18
  • 打赏
  • 举报
回复
原理是这样,那浩方里在一个房间建的服务器,怎么才能在其他房间刷出来?有什么方法?
qmroom 2009-01-21
  • 打赏
  • 举报
回复
醉生梦死 2009-01-20
  • 打赏
  • 举报
回复
楼主能不能简要的描述一下,DLL内部是怎么样工作的!
oyd 2009-01-12
  • 打赏
  • 举报
回复
to 楼主
我回答一下你的问题:
a linux下如何Hook呢?答案,linux下不需要Hook,通常是直接修改内核或者应用程序的源代码来实现。
c 这一点开源社区的人都知道,微软自己的程序员也心知肚明,而且这种事情国内的公司大多也干过(说来惭愧我刚毕业做的一个项目就是这样搞的),你自己不也提到了吗? (“今天你刚开源,明天就有人把它修改修改拿出来卖钱”)

另外,说到开源等于自杀,那已经和现在不是同一个时代的事情了,开源有开源的玩法。
听你这意思好像是以为微软不开源,是怕开源以后人家拿着windows的代码修改修改去卖钱吗?盗版这么发达,需要那么麻烦吗?
etomahawk 2009-01-11
  • 打赏
  • 举报
回复
to 70 ahat125:

是应用层级别的 HOOK 吧!
还应用了远程注入DLL 或者 HOOOK 的技术将 DLL 注入到目标进程空间。
好像都是很久以前的技术了吧!
不过现在很多的杀毒软件,防护软件都能截获那些消息并进行相应的阻断哦!
可以发些更新的技术支持吗?

-----------------------------------------------
技术无所谓新旧,能把活干好的技术就是好技术!就像《赤壁》里,诸葛亮用古老的八卦阵打败了曹操。再说,我们也不是干坏事,干嘛怕拦截,只要用户同意注入就没事了。

to 107 dalao812:

有一点明白了 长了见识 。 也是做游戏编程的?
-----------------------------------------------
不做游戏,业余爱好!

to 120 qq196260188:

牛,,不过,,放个简单的源码出来更好
-----------------------------------------------
这个不是简单代码就能完成的。而且,我想,真正开放源代码,也不会有太多人去研究它。

to 121 senosy:

那个虚拟IP的用处是什么呢?能否用用户自己真实IP?
-----------------------------------------------
虚拟IP用来在游戏中使用的。当游戏获取本地的IP地址的时候返回给它。
使用真实的IP可能会有问题。假如说你在A局域网,IP是192.168.1.1,而另外一个人在B局域网,IP也是192.168.1.1。那么两个游戏怎么玩呢?同一局域网不可能有两个相同IP吧?

to 138 oyd:

呵呵。一一解答你的问题。

a. API HOOK的技巧,完全就是微软不开源,导致多出来的工作。在微软的强奸下学会了迎合,也真的会有快感呀。

我想请问你一下,在Linux开源、用户权限下,如果你想截获一个进程中所有SOCKET调用,请问你会使用什么技术?我不清楚Linux是否还能给你提供这样的接口。要真能的话,那病毒木马还不的泛滥?!
另外,我使用的是inline HOOK,你可以去搜索一下看看,Thunk技术是否是Windows独有的?
在Windows下开发,总的遵循Windows的一些规则吧?

b. 另外,要看socket源代码,linux下多的是。

不是为了看socket源码而去找Windows代码,主要是看windows下一些函数内部如何实现,我想Windows必然有它独特的方式。这样才能模拟它的六种模型出来。Linux下socket的结构我有看过,只不过源代码没有勇气看下去。

c. 微软的代码也就是微软的高级程序员从开源代码中通过替换变量名函数名后搞出来的。

请问你有没有对比过Windows和你所谓的开源代码?你是如何得知微软的代码是替换变量名和函数名出来的?我想微软不会只是聘请一些只会修改别人代码的工程师吧?退一步来说,别说windows socket,就是windows本身,也是模仿别人的。那又怎么样呢? windows还是很成功的,至少我目前还的靠它吃饭!

说到开源,我还的说几句,首先,在中国,开源是没有前途的。开源等于自杀。今天你刚开源,明天就有人把它修改修改拿出来卖钱。中国的盗版实力我还是很相信的。其次,即使开源了,我估计也没有多少人去认真研究它--因为这是一个浮躁的年代,包括我也很浮躁,总不能静下心来研究点东西。举个例子,庞大的VCL库是开源的,试问有多少人去仔细研究过它?

OK,最后感谢各位的参与,祝大家在新的一年里天天开心,一切都好!
qkhhxkj102 2009-01-10
  • 打赏
  • 举报
回复
可惜看不懂,唉.....
为什么我那么笨
xulibing1016 2009-01-07
  • 打赏
  • 举报
回复
牛年顶牛帖
cyh424 2009-01-06
  • 打赏
  • 举报
回复
学习
lycanthrope_ 2009-01-06
  • 打赏
  • 举报
回复
学习!
ye_shui_zhu_hua 2009-01-06
  • 打赏
  • 举报
回复
游戏开发,好难啊!
sjj108 2009-01-06
  • 打赏
  • 举报
回复
好帖子
火龙岛主 2009-01-05
  • 打赏
  • 举报
回复
还是要支持的。
oyd 2009-01-05
  • 打赏
  • 举报
回复
看完全文,泼点冷水。
API HOOK的技巧,完全就是微软不开源,导致多出来的工作。在微软的强奸下学会了迎合,也真的会有快感呀。

另外,要看socket源代码,linux下多的是。微软的代码也就是微软的高级程序员从开源代码中通过替换变量名函数名后搞出来的。
jiaoyifei888 2009-01-05
  • 打赏
  • 举报
回复
支持,祝楼主新的一年一切顺利!
abhw0381 2009-01-05
  • 打赏
  • 举报
回复
支持
轻松一笑Daily 2009-01-05
  • 打赏
  • 举报
回复
学习
加载更多回复(132)
仅限学习研究之用,切勿用作商业用途,请在下载后24小时之内删除,本人不承担任何责任。 鸿运年会抽奖软件是功能强大的年会抽奖软件,界面大气漂亮,可设置不同的抽奖形式,自定义抽奖人数和奖项数,滚动显示抽奖人的照片和名字,极简单的设置方式。在年会和各种晚会用最合适了。 鸿运年会抽奖软件历经上千家公司和个人实践检验,好评百分百!还可以根据您的需求定制开发(按复杂度酌情加收费用)。 鸿运年会抽奖软件功能特点简介: *公正、公平、不重复中奖 *界面美观大方,鲜明的中国传统色彩(可选喜庆类、人文类、科技类等诸多界面) *运行稳定 功能强大 简洁易用 美观流畅 *支持显示序号;号码滚动显示 *支持自定义背景音乐;可自定义各奖项获奖人数;可自定义重复抽奖规则; *支持双显示器(例如笔记本电脑连接投影仪) *支持外部数据加入(加入大量附加数据稳定版) *支持一次抽出全部中奖者或者分多次抽出中奖者 *支持显示抽奖活动所有抽出的中奖者 *支持中奖名单保存.支持一键抽奖; *支持“抽奖参数”保存,下次打开时“直接使用” *支持:“文字字符窜抽奖” *支持非号码数字抽奖,即支持姓名等中文字符抽奖 *可根据客户的需要定制开发,软件界面及其他均可定制开发 鸿运年会抽奖软件适用于各单位年终抽奖、晚会抽奖、姓名抽奖、编号抽奖、手机号码抽奖、身份证号码抽奖、企事业单位抽奖、电视台抽奖、屏幕抽奖、LED抽奖

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧