浩方客户端基本原理就是:当你用浩方游戏客户端登陆进入相应的房间后,服务器端会自动给你分配一个“虚拟IP地址",不论你的上网接入方式是拨号/ADSL/LAN/CABLE   MODEM,在同一个游戏房间里,你就会有一个虚拟IP,这个IP只是为了玩家之间联网游戏用的。浩方游戏平台通过把tcp/ip协议转换为ipx协议,虚拟局域网,为大家提供了一个作战平台。但游戏开始后,玩家之间就是p2p的关系了,游戏速度和平台无关。而且浩方为了使突袭爱好者玩起来更快更爽,不断优化系统,优化数据包的传输速度。

浩方对战平台是一个基于VPN技术的、将互联网上的两个或多个用户模拟成在同一局域网的通用性联网技术,其本质是提供用户间的数据交换。
使用的主要技术是Hook socket(Hook API),DLL注入。

发现一个和功能类似的软件:Gamer's Internet Tunnel。分析了一下,它是用WinCpap把网卡置于sniff模式,截获数据包,对发出的游戏数据包(IPX包)加上IP头封成 IP包,分别发给VLan成员;对收到的IP包,如果是VLan的包就去掉IP头转成IPX包,而其它数据包不受影响。 它也能对Ip包作同样的操作,像魔兽3没有用IPX,用的是IP协议。 浩方没有sniff,它应该是用hook截取指定程序的数据包然后作同样操作。

对浩方对战平台的技术研究,最近得出了未经证实的结果。
某有关方面专家这样描述了平台的工作原理:
1.假设有A、B两用户,IP地质分别是A(1.1.1.150)和B(2.2.2.170)
2.互联的双方游戏(假设是war3)启动之后,平台将监控电脑上运行的特定进程(war3进程),并截取这个进程发送的数据包。
3.平台修改A发出的数据包,把用户IP地址修改为(2.2.2.171)发送给B,这时候对B看到A的IP地址前三位也是(2.2.2),便会把A认为 是局域网的邻居。平台同样对B发给A的数据包进行如此的处理让A也认为B是同一局域网的用户。由此实现了模拟局域网的功能。

这个工作原理可以解释浩方对战平台的运作特征,例如每个房间都只有250人,这是因为IP地址的最后一位最多为255(偶尔多出来的VIP用户实际上是用了那些在房间里面但没有游戏的IP地址)所以也就会有一部分运气(RP)太差或者说太好的玩家不能在房间内看到主机。

看 完以上资料也许大家要发挥愤青的基础技能,好好的干他个HF。但实际上我们也应该从我做起,不要在房间里挂机。这样的话投诉看不到游戏的45个人会越来越 多,致使HF修改房间设定以及VIP的设定。当然HF会有别的相当不厚道的方法,例如:将房间基础人数改为200,55VIP,但这毕竟是后话了。

第一,对战平台客户端不可能是用的嗅探的方式抓包,比如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来解决这个问题呢?

百思不得其解,望高手赐教!!!
<object><param name="movie" value="http://6.cn/p/LJJA9eWkFMVmXeEZIb2MZw" /><embed src="http://6.cn/p/LJJA9eWkFMVmXeEZIb2MZw" width="480" height="415" type="application/x-shockwave-flash" /></object>