如何防止Windows在尝试通过Pcap.net连接到某人时发送RST数据包?

时间:2012-10-22 09:24:15

标签: windows sockets tcp pcap pcap.net

我正在尝试使用Pcap.Net打开tcp连接。

我发送以下包裹:

SYN packet

服务器正在响应:

SYN-ACK

此后,Windows自己发送重置数据包:

RST

为什么会发生这种情况,如何阻止此行为?

我在Windows 7上这样做

3 个答案:

答案 0 :(得分: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是我的项目)。

答案 1 :(得分:4)

基本上,问题是scapy在用户空间中运行,而Windows内核将首先接收SYN-ACK。您的Windows内核将发送TCP RST,因为在您有机会对scapy做任何事情之前,它不会在有问题的端口号上打开套接字。

典型的解决方案(在linux中)是防止内核在运行脚本时在该TCP端口(12456)上接收RST数据包...问题是我不认为Windows防火墙允许您对于数据包丢弃,这是细粒度的(即查看TCP标志)。

也许最简单的解决方案是在Linux VM下执行此操作并使用iptables来实现RST丢弃。

答案 2 :(得分:2)

使用Boring Old Winsock与服务器建立TCP连接,而不是构建自己的TCP-over-IP-over-Ethernet数据包并将其发送到服务器,或以某种方式说服Windows Internet协议栈忽略从服务器获得的SYN + ACK(以及所有后续数据包),以便它不会从服务器看到SYN + ACK,注意没有进程尝试从192.168.1.3:12456建立TCP连接使用标准的内核网络堆栈(即没有人试图使用Boring Old Winsock设置它)到192.168.1.1:80,然后发回一个RST告诉服务器没有人在机器上的端口12456上监听。 / p>

您可以使用WinDivert执行后者。它本身似乎没有.NET包装器,所以如果你打算使用.NET而不是Boring Old Unmanaged C或Boring Old Unmanaged C ++,你可能不得不寻找一个。