如何尝试通过Pcap.net连接到别人时阻止Windows发送RST包?(How to preven

2019-07-01 16:46发布

我试图用Pcap.Net打开一个TCP连接。

我送包如下:

服务器与响应:

这之后,Windows自身发送复位包:

这究竟是为什么,以及如何阻止这种行为?

我在Windows上做这7

Answer 1:

哈里斯先生说,你可以使用WinDivert做你想要什么。 例如,活动一下TCP握手,你可以写类似如下:

// TCP handshake using WinDivert:
HANDLE handle = DivertOpen("inbound && tcp.SrcPort == 80 && tcp.Syn && tcp.Ack", 0, 0, 0);
DivertSend(handle, synPacket, sizeof(synPacket), dstAddr, NULL);
...
DivertRecv(handle, synAckPacket, sizeof(synAckPacket), &srcAddr, &length);
...
DivertSend(handle, ackPacket, sizeof(ackPacket), dstAddr, NULL);
...

所述DivertRecv()函数重定向的服务器响应到用户空间之前它是由Windows TCP / IP堆栈处理。 因此,没有讨厌的TCP RST将会产生。 DivertSend()注入数据包。

这是WinDivert和WinPcap的之间的主要区别。 后者仅仅是一个包嗅探器,而前者可以拦截/过滤器/块的流量。

WinDivert是用C写的,所以你就需要编写自己的.NET包装。

(通常披露:WinDivert是我的项目)。



Answer 2:

从本质上讲,问题是scapy用户空间中运行,并且Windows内核将首先收到SYN-ACK。 您的Windows内核会发送一个TCP RST,因为它不会有一个插座上有问题的端口号开放,你有机会做任何事情之前Scapy的。

(在Linux)的典型解决方案是从TCP端口(12456),而正在运行的脚本,在接收到RST包防火墙内核......问题是,我不认为Windows防火墙允许您成为这个颗粒状(即在看TCP标志)的数据包丢弃。

也许最简单的解决办法就是做这一个Linux虚拟机下,并使用iptables实施RST下降。



Answer 3:

无论是使用无聊的老的Winsock做一个TCP连接到服务器上,而不是构建自己的TCP-IP上的以太网数据包,并将它们发送到服务器,或者通过某种方式说服的Windows Internet协议栈忽略SYN + ACK(以及所有后续数据包),你从服务器获取,所以它不从服务器上看到SYN + ACK,请注意,没有进程试图建立一条从192.168.1.3:12456至192.168 TCP连接。 1.1:80使用内核网络堆栈的标准(即,没有人试图将其设置使用无聊的老Winsock的),并发送回一个RST,以告诉服务器有没有人在计算机上的端口12456监听。

你也许可以做到使用后者WinDivert 。 它本身并不似乎有一个.NET包装,所以你可能需要找一个,如果你要使用.NET,而不是无聊的老非托管C或无聊的老非托管C ++。



文章来源: How to prevent Windows from sending RST packet when trying to connect to somebody via Pcap.net?