对战平台的原理

第一,对战平台客户端不可能是用的嗅探的方式抓包,比如Winpcap/RAW      SOCKET,这种方式抓包依耐系统的性能,就算不玩游戏,也存在漏包的机率,更何况类似cs这类游戏那样的耗资源,漏包的情况一定是很严重.所 以,api      hook/spi/ndis这些技术应该才是正确的选择.第二.有关加密解 密,这根本是多余,我相信不会有哪个对战平台会做这种画蛇添足的动作,他只不过是转发一下数据包而已.人家游戏本身都不用加密,他费这劲干嘛,还影响效 能.

目的:想实现一个类似浩方的虚拟局域网的游戏对战客户端,但不同于浩方的IPX/SPX,希望采用UDP方式。看了很多文章,也做了一些实验,也有 很多问题。现在整理出来,跟大家探讨一下,也希望能得到高手的指点。

背景知识:
星际启动时监听本地UDP端口6111和6112。6111用于发送广播,发现游戏主机;6112用于发送游戏进行中的同步数据。

假设局域网中有192.168.1.6创建了游戏,当192.168.1.24进入游戏时,会发送UDP广播;192.168.1.8收到该广播后会回应 192.168.1.24;此后双方直接发送交互数据包。   

星际是局域网游戏(不包括战网),是因为UDP广播所能覆盖的区域只能是一个子网段。现在的目的就是组建一个虚拟局域网,让互联网上的玩家能够通过虚拟局 域网发现彼此。

解决思路:
发送过程:采用进程注入和socket     hook技术,把我们自行编写的一个DLL注入到星际进程,该DLL代表星际创建另外一个UDP端口7890。     星际启动时,会发送广播数据包查找局域网内的游戏主机。注入的DLL通过Hook     sendto调用可以截获这个数据包,后把内容添加一个自定义的协议首部,通过UDP     7890端口发送到外网。

接收过程:发到外网的UDP数据包通过NAT到达内网机器10.10.40.32的7890端口。注入的DLL对该数据包的自定义协议首部进行分析,然后 将去掉首部后的数据(原始星际数据包)发送给6111端口。这样就完成了接收的过程。

整个过程如下:(SC:     Starcraft,SC1代表内网机器192.168.1.6,SC2代表10.10.40.32)

                      广播找主机                                                               加入首部
SC1:6111     ------------ >     Hook     -- >     我们的DLL:7890     ------------ >     Internet   
                                                
                                                                                  去掉首部
Internet     ------------ >     我们的DLL:7890     ------------ >     SC2:6111   


问题:
目前发送过程通过远程进程注入CreateRemoteThread以及API     Hook技术已经解决。问题在于接收过程。10.10.40.32上的DLL如何将数据从7890传递到6111端口?才能让星际以为这个数据包是从本局 域网的其它IP地址传递过来的?比如从10.10.40.33?

当有10个人在发送广播数据包到10.10.40.32的7890时,如何模拟出同一个子网的10台机器出来?

目前浩方,     VS,GG-Client都有虚拟IP的概念,如何应用虚拟IP来解决这个问题呢?

百思不得其解,望高手赐教!!!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值