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

Emulate Server-Client TCP Communication

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

我打算做的是在启动时模拟它的 server/client 通信,方法是使用一台旧 PC 运行 服务器仿真器软件和一些 DNS 重新路由以及WiFi路由器(使用PC作为WAN)。

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

任何人都可以告诉我从哪里开始、需要的工具等吗?我是一名程序员,但不熟悉数据包 emulation/replay。我已经嗅探了设备所做的数据包,并且它在设备的每个 start/restart 上始终保持一致。这是 wireshark 捕获 (IMG):

WireShark Packet Capture

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

将请求重定向到本地地址

您需要设置本地 DNS 服务器并配置它以在 hengdetech 查找时提供本地 IP 地址。我没有深入探讨这一部分,但是 google 有很多论坛讨论不同 DNS 服务器的必要配置。

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

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

模拟服务器行为

服务器在发回一些数据之前必须等待来自客户端的一些初始数据。这样的逻辑不太适合常见的 "replay packets" 工具功能,但是很容易在您喜欢的任何语言上实现具有所需功能的哑 TCP 服务器。打开套接字、等待数据、发送数据,没什么大不了的,不是吗?所以我不会费心去寻找合适的工具,而是会创造新的工具。

如果您需要快速验证概念,证明您正确理解数据流,在开始编码之前,您可以尝试 Unix 系统上的 netcat 实用程序以快速模拟服务器。我做了以下一次:从跟踪中提取交换的有效负载数据并保存为二进制文件(例如 file1.bin 在第一次请求后由服务器发送,file2.bin 在第二次请求后发送等),然后使用类似这样的东西:cat - file1.bin - file2.bin | nc -l -p <local_port> -n。使用不带破折号的 cat 会导致 nc 在连接后将所有文件内容发送到客户端。破折号表示 "use data from console input rather than file",它们仅用作流量控制。 cat 挂在第一个破折号上等待用户输入,因此按 ctrl+d 继续下一个文件内容并发送 file1.bin,然后在第二个破折号上挂起。所以你等待第一个请求,按ctrl+d发送file1.bin内容,然后等待第二个请求,按ctrl+d发送file2.bin内容等等。

编辑

您通常对从 wireshark 跟踪中提取数据的想法是正确的,但我想澄清一些细微之处。

When you said "saved binaries", did you mean to save individually captured packets as binaries so that netcat could send them to clients as a reply one by one (with the help of dash) ? If so, how do I save captured packets as binaries? Can I just extract them from the wireshark capture files, paste it on a new file and save as binary?

只需要保存数据包的有效负载部分,而不是整个数据包。 TCP header、IP header等不应该被提取出来,只需要保存tcp data部分。检查 this answer for howto. I suppose, TCP data in your case consists of binary data rather than plain text, so you need to copy it as "raw binary" and use some binary editor allowing to paste "raw binary" into file such as frhed 的第二部分。所以是的,您创建了新文件并将从 wireshark 复制的数据粘贴到其中,因此文件包含与数据包有效负载完全相同的字节。

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