首页 > 其他分享 >使用Hook拦截sendto函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例

使用Hook拦截sendto函数解决虚拟局域网部分游戏联机找不到房间的问题——以文明6为例

时间:2023-01-18 02:55:49浏览次数:58  
标签:游戏 hook 为例 端口 dll Hook sendto socket

正文

本文代码及编译好的二进制文件可以在下面这个仓库找到。

https://gitcode.net/PeaZomboss/miscellaneous

源代码在文件夹230113-civ6hooksendto
若要下载二进制,请到https://gitcode.net/PeaZomboss/miscellaneous/-/releases/civ6-hook-binary

起因

许多单机游戏都有局域网联机功能,尽管许多也提供了互联网联机功能,但是一般这些游戏的土豆服务器让玩家非常恼火,于是出现了诸如游侠等对战平台。使用这些平台使用局域网联机功能就可以获得比较稳定的联机体验。还有一种方法就是搭建虚拟局域网(VLAN)了,比如使用N2N就可以搭建一个(需要自备服务器)。

本人和哥们当时玩文明6就用到了由Bug侠基于N2N开发的EasyN2N,在这里感谢作者免费提供服务器供我们使用。尽管EasyN2N集成了WinIPBroadcast这款广播转发工具,不过在实际使用中发现有的时候没有作用,总是需要去改网卡跃点,这就造成了一定的麻烦。

局域网联机的游戏基本上是通过向 255.255.255.255 发送 UDP 广播数据包来传播游戏房间信息,但是 Windows 只会在首选的网络接口(网卡)上发送全局 IP 广播数据包,也就是说局域网游戏的信息没有被 Windows 在虚拟局域网接口上广播

以上摘自https://bugxia.com/3128.html,原出处https://www.bilibili.com/read/cv14633088

由于N2N是使用虚拟网卡来实现虚拟局域网的搭建,所以我们只要想办法把游戏的广播发到虚拟网卡就可以解决问题了。不过实际上把广播转发到每张网卡就可以了,因为这样比较方便实现。

于是我就想到了使用Hook技术,把游戏发的广播内容拦截了,再给他转发岂不是就能解决问题了?

还真是。

于是就上网查了一下资料,花了不少时间上手做了一个demo,自己用着感觉不错,然后几个月过去了,突然回想起来以前写过的程序,又想到文明6正在更新,打算等他更完了再快乐联机,就想着把原来的代码梳理一下,然后重新写了个新的,然后顺便温习一下相关知识。

好了事情的起因就是这样子了。

技术介绍

本方法是针对使用虚拟网卡技术的虚拟局域网,并不适用其他方案的虚拟局域网。

本方法和https://bugxia.com/3269.html里用到的ForceBindIP原理一致,不过这个软件似乎并不开源。

本方法使用Hook技术(确切说是Inline Hook)以及socket技术,需要对基本的Windows编程和socket编程有一定的知识。

Hook介绍

Hook技术一般翻译为钩子技术,就是提前在特定事件或消息处挂上钩子,等执行到此处就会触发钩子,执行钩子的代码。Windows系统提供了SetWindowsHookEx等一系列函数实现Hook的功能。

而所谓Inline Hook就是把任何函数调用的前几个字节改成一句跳转指令,跳转到自己的地方执行,然后返回到原来的主调函数,此时就获得了函数的参数等一系列信息。许多人做的微信Hook就是这么搞的,不过缺点就是一旦函数地址或者参数变了,就得编写相应的代码。

当然对于游戏来说,其发送广播比如离不开系统调用,所以我们只要hook系统调用就可以了,而系统函数的地址都是可以通过GetProcAddress找到。

当然如果只是这样还只能hook自己的进程,想要hook其他进程就得先把hook代码编进一个dll,再想办法让目标进程加载这个dll,这个过程叫注入(inject)。

当我们的dll打入敌人内部,就可以窥探其全部的虚拟地址空间,这样我们就可以大施拳脚,为所欲为了

标签:游戏,hook,为例,端口,dll,Hook,sendto,socket
From: https://www.cnblogs.com/PeaZomboss/p/17059052.html

相关文章