什么定义了 Scapy 发送/接收?

What defines Scapy send / receive?

我正在用 Scapy 做一些 Wi-Fi 脚本,我想做一个 WPS 请求。作为其中的一部分,我需要执行一系列数据包,例如 EAPOL(开始),然后从路由器接收 EAP(请求,身份)数据包。

如果我使用适当的数据包执行 SRP(EAPOL),Scapy 将超时等待响应,因为对于 Scapy 使用的任何定义,身份请求似乎都不适合 'response' 数据包。

或者我试图在发送数据包后直接启动 sniff(),但是它似乎没有及时启动来接收数据包。

一个独立的嗅探线程(在一个单独的控制台中启动window)确实看到了如下的 AP 响应。

RadioTap / Dot11 / LLC / SNAP / EAPOL EAP_PACKET / EAP / Padding

所以我的问题是

干杯。

send/receive对由层实现的answers方法定义。

例如,这里是 IP 层的 answers 方法:

def answers(self, other):
    if not isinstance(other,IP):
        return 0
    if conf.checkIPaddr and (self.dst != other.src):
        return 0
    if ( (self.proto == socket.IPPROTO_ICMP) and
         (isinstance(self.payload, ICMP)) and
         (self.payload.type in [3,4,5,11,12]) ):
        # ICMP error message
        return self.payload.payload.answers(other)

    else:
        if ( (conf.checkIPaddr and (self.src != other.dst)) or
             (self.proto != other.proto) ):
            return 0
        return self.payload.answers(other.payload)

您想做的是开发自己的 answers(request, potential_response) 函数并接收原始数据包。然后,您使用 answers 函数来决定哪个原始数据包是答案。

要接收原始数据包,您可以使用sniff函数:

sniff(count=1,timeout=0.001)

尽管如您所见,它的缺点是不一定及时开始。所以,你想看看 sniff 的实现方式。在内部,它使用 conf.L2listen,您也可以使用它。

因此,在发送请求之前,执行 s=conf.L2listen(),然后执行 s.recv(65536) 以接收数据包。您可以使用 sel = select([s],[],[],0.001) 等待一定时间让数据包到达。如果s in sel[0],则可以从socket中读取数据,否则超时。

超时参数以秒为单位,所以我所有的示例都指定了 1 毫秒的超时。