安装WinPcapy

pip install WinPcapy

WinPcapy获取本机网卡

首先需要到导入WinPcapDevices

from winpcapy import WinPcapDevices

然后只需要:

devices = WinPcapDevices.list_devices()

devices是类似字典的格式,键值对应的是本机上具体的一个网卡,但是存在真实网卡和虚拟网卡。根据不同发送接收函数调用,会用上devices中的键或者值。

WinPcapy捕获数据

首先需要导入WinPcapUtils

from winpcapy import WinPcapUtils

目前,我使用过的方法有两种:

def capture_on_device_name(device_name, callback)

该函数参数device_name表示的是具体的某个网卡,在devices中是用键来表示的,callback参数表示是回调函数,处理捕获到的数据包。所以可以这样写:

keys_list = list(devices.keys())
WinPcapUtils.capture_on_device_name(keys_list[0], packet_callback)

第二种方法是:

def capture_on(pattern, callback)

该函数参数pattern表示通配符,用来匹配devices中值所对应的内容,callback参数表示回调函数,仍然是处理捕获的到数据包。所以可以这样写:

WinPcapUtils.capture_on("*Inte*", packet_callback)

两个函数中都涉及到处理捕获数据包的回调函数,该函数可以这样写:

def packet_callbakc(win_pcap, param, header, pkt_data)
    # pkt_data就是捕获到的数据,可以按字节的方式直接处理,
    # 也可以使用dpkt包对pkt_data处理。

WinPcapy发送数据

目前,我使用到的方法是:

def packet_send(self, pattern, packet_buffer, callback = None, limit = 10)

该函数参数pattern表示通配符,用来匹配devices中值所对应的内容,packet_buffer表示发送的数据,callbacklimit参数没有使用过,个人看函数解释认为是回调处理反馈的数据包和捕获包的上限。 在python3中,可以这样写:

WinPcapUtils.packet_send("*Inte*", bytes.fromhex(data))

这里data实际上是十六进制数据,表示,我目前还只测试过将十六进制数据发,没有测试过其他类型。这里的data甚至可以这样写:

data = "00010203"

通过抓包可以看到获取的数据是以太网数据头协议的包,长度只有4,和发出去的是一致的内容,通常,这里需要自己构造协议头。

WinPcapy发送数据例子

from winpcapy import WinPcapDevices
from winpcapy import WinPcapUtils
import time

if __name__ == "__main__":
    while True:
        WinPcapUtils.send_packet("*R*", bytes.fromhex("00010203"))
        time.sleep(1)

WinPcapy接收数据例子

from winpcapy import WinPcapDevices
from winpcapy import WinPcapUtils


def packet_callback(win_pcap, param, header, pkt_data):
    if len(pkt_data) == 4:
        print(pkt_data)

if __name__ == "__main__":
    WinPcapUtils.capture_on("*R*", packet_callback)

这里capture_on或者capture_on_device_name方法会自动持续捕获数据包,网卡的通配符需要根据自己的实际情况写。