模拟服务器-客户端 TCP 通信



我有一个设备(中国制造),效果很好,但有一个非常烦人的缺陷。这是一种按摩设备,只有在启动时连接到互联网时才有效。一旦启动,它将在没有互联网的情况下工作,直到它被关闭。简而言之,如果互联网关闭,它将永远无法工作,或者不可能将此设备带到没有连接的区域。

我打算做的是使用运行服务器模拟器软件和一些DNS重新路由的旧PC和WiFi路由器(使用PC作为WAN)在启动时模拟其服务器/客户端通信。

我将在路由器上连接设备,它与中国服务器的通信由PC模拟。

谁能告诉我从哪里开始,需要的工具等?我是一名程序员,但对数据包仿真/重放不熟悉。我已经嗅探了设备所做的数据包,并且在设备的每次启动/重新启动时始终保持一致。以下是wireshark捕获(IMG):

WireShark 数据包捕获

您有两个任务,恕我直言,它们都不需要特殊工具:

将请求重定向到本地地址

您需要设置本地DNS服务器并将其配置为在恒德查找时提供本地IP地址。我没有深入研究这部分,但谷歌有很多论坛讨论不同DNS服务器的必要配置。

设备最有可能从 DHCP 服务器获取 DNS 服务器地址。因此,您需要通过配置 DHCP 服务器(我想在您的路由器上运行)将设备指向本地 DNS,而不是默认的 DNS。

一旦您的DHCP配置了本地DNS并且本地DNS将hedgdete重定向到本地IP地址,您就可以自由地转到第二部分,即

模拟服务器行为

服务器必须等待来自客户端的一些初始数据,然后再发送一些数据。这种逻辑不适合常见的"重放数据包"工具功能,但是在你喜欢的任何语言上实现具有所需功能的哑TCP服务器是非常容易的。打开套接字,等待数据,发送数据,没什么大不了的,不是吗?所以我不会费心寻找合适的工具,而是会创建新的工具。

如果您需要快速的概念验证,您正确理解数据流,在开始编码之前,您可以在Unix系统上尝试netcat实用程序以进行快速服务器仿真。我曾经做过以下操作:从跟踪中提取交换的有效载荷数据并保存为二进制文件(例如 file1.bin 在第一个请求后由服务器发送,file2.bin 在第二个请求后发送等),然后使用这样的东西:cat - file1.bin - file2.bin | nc -l -p <local_port> -n.使用不带破折号的cat会导致nc将所有文件内容发送到客户端(一旦连接)。Dash的意思是"使用来自控制台输入而不是文件的数据",它们仅用作流量控制。cat挂在第一个破折号上等待用户输入,因此按ctrl+d继续下一个文件内容并发送 file1.bin,然后挂在第二个破折号上。因此,您等待第一个请求,按ctrl+d发送 file1.bin 内容,然后等待第二个请求,按ctrl+d发送 file2.bin 内容,依此类推。

编辑

您通常正确理解从wireshark痕迹中提取数据的想法,但我想澄清一些微妙之处。

当您说"保存的二进制文件

"时,您的意思是将单独捕获的数据包保存为二进制文件,以便netcat可以将它们作为回复一一发送给客户端(在dash的帮助下)?如果是这样,如何将捕获的数据包保存为二进制文件?我可以从 wireshark 捕获文件中提取它们,将其粘贴到新文件并另存为二进制文件吗?

只需要保存数据包的有效负载部分,而不是整个数据包。不应提取TCP标头,IP标头等,仅应保存TCP数据部分。查看本答案的第二部分以获取操作方法。我想,在您的情况下,TCP 数据由二进制数据而不是纯文本组成,因此您需要将其复制为"原始二进制"并使用一些二进制编辑器,允许将"原始二进制"粘贴到诸如 frhed 之类的文件中。所以是的,你创建新文件并将从wireshark复制的数据粘贴到其中,所以文件由与数据包有效载荷完全相同的字节组成。

另一件事要提一下,TCP是一个流协议,一个数据包并不总是意味着一个响应消息。如果您看到几个最大大小的 TCP 数据包(也称为 MTU,通常为 1.5 KB),没有 PSH 标志,后跟带有 PSH 标志的较小大小的数据包,则它们都包含单个响应消息的一部分,因此它们的有效负载应组合成一个"fileX.bin"。

最新更新