采用Hook WinsockAPI实现对战平台的虚拟局域网的一些问题
akyca 2007-03-15 12:06:34 目的:想实现一个类似浩方的虚拟局域网的游戏对战客户端,但不同于浩方的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来解决这个问题呢?
百思不得其解,望高手赐教!!!