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

时间:2017-03-15 02:26:10

标签: server wireshark emulation packets

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

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

我将在路由器上连接设备,并通过PC模拟其与中文服务器的通信。

任何人都可以告诉我从哪里开始,需要的工具等?我是程序员,但对数据包仿真/重播不熟悉。我已经嗅探了设备所执行的数据包,并且在每次启动/重启设备时始终保持一致。这里是wireshark capture(IMG):

WireShark Packet Capture

1 个答案:

答案 0 :(得分:1)

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

将请求重定向到本地地址

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

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

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

模拟服务器行为

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

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

修改

您通常会想到从wireshark轨迹中提取数据,但我想澄清一些细微之处。

  

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

只需要保存数据包的有效负载部分,而不是整个数据包。不应提取TCP头,IP头等,只应保存tcp数据部分。检查this answer的第二部分以了解方法。我想,您的案例中的TCP数据由二进制数据而不是纯文本组成,因此您需要将其复制为“原始二进制”并使用一些二进制编辑器,允许将“原始二进制”粘贴到文件中,例如frhed。所以,是的,您创建了新文件并将从wireshark复制的数据粘贴到其中,因此文件包含与数据包有效负载完全相同的字节。

另外需要提及的是,TCP是一种流协议,一个数据包并不总是意味着一个响应消息。如果你看到几个最大大小的TCP数据包(也就是MTU,通常是1.5千字节),没有PSH标志,后面是带有PSH标志的较小数据包,它们都包含单个响应消息的一部分,所以它们的有效负载应该是合并为一个“fileX.bin”。