【问题标题】:How to read from stdin using dpkt.pcap.Reader?如何使用 dpkt.pcap.Reader 从标准输入读取?
【发布时间】:2017-07-08 12:23:54
【问题描述】:

我目前正在尝试使用 USBPcap + Python/dpkt 分析传入的 USB 流量,并以光学 USB 鼠标作为示例输入设备。

启动包含命令的批处理文件后

USBPcapCMD.exe -d \\.\USBPcap7 -o - | pipetest.py

以下代码完美运行:

# pipetest.py
# sniffing for USB-mouse activities
import sys
import dpkt, struct

try:
    f = open('c:\\users\\user\\downloads\\test.pcap','wb')
    while True:
        inpt = sys.stdin.read(34)        # package length
        f.write(inpt)
except KeyboardInterrupt:
   f.close()

f = open('c:\\users\\user\\downloads\\test.pcap','rb')
pcap = dpkt.pcap.Reader(f)
print

for ts, buf in pcap:
    data = struct.unpack("b"*7, buf[-7:]) # 7-byte leftover with mouse info
    print data 

f.close()

输出是:

34
34
34
34
34
34
34
34
34
34
34
34
^C
(3, 4, 0, 0, 0, 0, 0)  <---|
(3, 0, 0, 0, 0, 0, 0)      |
(3, 4, 0, 0, 0, 0, 0)  <---|
(3, 0, 0, 0, 0, 0, 0)      |------ Four clicks with mouse wheel
(3, 4, 0, 0, 0, 0, 0)  <---|
(3, 0, 0, 0, 0, 0, 0)      |
(3, 4, 0, 0, 0, 0, 0)  <---|
(0, 0, 0, 9, 0, 1, 7)

很遗憾,我在对捕获的数据进行实时分析时遇到了问题。如何让 dpkt.pcap.Reader() 使用 sys.stdin 而不是 open('foo.pcap')?

附:我一定可以的

USBPcapCMD.exe -d \\.\USBPcap2 -o - | "C:\Program Files\Wireshark\Wireshark.exe" -k -i -

official mini-tutorial 所示,但我想使用 USB 嗅探器 + Python 执行实时 USB 流量。

P.P.S. Python/PyUSB + libusb-win32 完美运行,但我确实需要 USBPcap! :)

【问题讨论】:

    标签: python-2.7 usb pcap dpkt


    【解决方案1】:

    您可以为此使用命名管道 (FIFO缓冲区)https://en.wikipedia.org/wiki/Named_pipe#In_Windows)参见createNamedPipe in pythonWindows named pipes in practice

    您创建命名管道,从您的 python 程序中打开 USBpcap 并将输出通过管道传输到您刚刚创建的命名管道(How to Run an .exe File in Pythonhow to run an exe file with the arguments using python),然后使用 dpkt.pcap.Reader() 从命名管道中读取

    https://msdn.microsoft.com/de-de/library/windows/desktop/aa365590%28v=vs.85%29.aspx

    https://msdn.microsoft.com/de-de/library/windows/desktop/aa365592%28v=vs.85%29.aspx

    【讨论】: