我试图用Pcap.Net打开一个TCP连接。
我送包如下:
服务器与响应:
这之后,Windows自身发送复位包:
这究竟是为什么,以及如何阻止这种行为?
我在Windows上做这7
我试图用Pcap.Net打开一个TCP连接。
我送包如下:
服务器与响应:
这之后,Windows自身发送复位包:
这究竟是为什么,以及如何阻止这种行为?
我在Windows上做这7
哈里斯先生说,你可以使用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是我的项目)。
从本质上讲,问题是scapy
用户空间中运行,并且Windows内核将首先收到SYN-ACK。 您的Windows内核会发送一个TCP RST,因为它不会有一个插座上有问题的端口号开放,你有机会做任何事情之前Scapy的。
(在Linux)的典型解决方案是从TCP端口(12456),而正在运行的脚本,在接收到RST包防火墙内核......问题是,我不认为Windows防火墙允许您成为这个颗粒状(即在看TCP标志)的数据包丢弃。
也许最简单的解决办法就是做这一个Linux虚拟机下,并使用iptables
实施RST下降。
无论是使用无聊的老的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 ++。