1

我们有一个设备从空中接收 802.11p MAC 帧并将它们完全不变地馈送到串行端口(没有网络层标头),我们希望看到它们在 Wireshark 中排列,所以我们可以有一种自制的嗅探器这个 802.11p 协议。

我的方法(在带有 python 的 linux 中)是,打开串行端口,读取帧并将它们写入 Wireshark 将监听的命名管道。经过大量搜索后,我发现我必须写入该管道的格式必须类似于 pcap 文件格式。我查看了一些执行 pcap 格式化的 python 模块(scapy、pcapy、dpkt),但我找不到任何获得纯 MAC 帧并以wireshark 可以的方式简单地将其写入 pcap 格式的文件的模块阅读,无需我进行所有解析。你的建议是什么?

4

1 回答 1

1

仅仅创建一个水龙头设备并将帧写入其中怎么样?然后,您可以像使用任何其他设备一样嗅探该tap设备。这里有一个使用Pythonwireshark中的设备的示例,这里有一个更长的 C 语言教程(实际上是关于设备)。taptun

注意:我没有对此进行测试,但这个想法似乎很合理......

更新:这似乎有效。它基于上述要点,但只是从文件中读取帧数据并将其写入设备:

import sys
import fcntl
import os
import struct
import subprocess

TUNSETIFF = 0x400454ca
TUNSETOWNER = TUNSETIFF + 2
IFF_TUN = 0x0001
IFF_TAP = 0x0002
IFF_NO_PI = 0x1000

# Open TUN device file.
tun = open('/dev/net/tun', 'r+b')
# Tell it we want a TUN device named lars0.
ifr = struct.pack('16sH', 'lars0', IFF_TAP | IFF_NO_PI)
fcntl.ioctl(tun, TUNSETIFF, ifr)
# Optionally, we want it be accessed by the normal user.
fcntl.ioctl(tun, TUNSETOWNER, 1000)

# Bring it up and assign addresses.
subprocess.check_call(['ifconfig', 'lars0', 'up'])

print 'waiting'
sys.stdin.readline()

# Read an IP packet been sent to this TUN device.
packet = list(open('/tmp/packet.raw').read())

# Write the reply packet into TUN device.
os.write(tun.fileno(), ''.join(packet))

print 'waiting'
sys.stdin.readline()
于 2012-05-25T18:32:09.063 回答