使用Wireshark捕捉USB通信数据

USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。USB接口支持设备的即插即用和热插拔功能,是应用在PC领域的接口技术。

现在,越来越多的人喜欢使用USB设备了。很多的设备都会选择使用USB接口来作为设备的通信端口,而这也是一种流行的趋势,这有助于不同设备之间标准的统一。那么,你对USB设备的工作方式和运行机制真的了解吗?无论你是一个硬件黑客,还是一名对外围设备感兴趣的技术爱好者,USB设备都是一个非常具有挑战性的领域。在Wireshark的帮助下,我们不仅可以嗅探并截获到USB设备所发送的数据流信息,而且我们还可以将这些捕获到的数据存储至我们的主机中。我们实验所使用的主机安装的操作系统为Windows或者Linux。

在这篇文章中,我们将会讨论如何使用Wireshark来捕捉USB设备的通信数据。在我撰写这篇文章的过程中,我使用到了下列材料:

Wireshark 2.0.1 (SVN)
Linux kernel 4.1.6

在实际操作过程中,你可以选择使用版本号高于1.2.0的任意版本Wireshark来进行操作。在此,我并没有在本文中提供Windows系统的操作步骤,我会在实验操作完成之后的第一时间给大家提供这部分的信息。

一些背景知识

在我们开始操作之前,我觉得还是得给大家介绍一些有关USB设备的基础知识。USB有其自己的标准和规范。基本而言,我们可以通过以下三种方式来使用USB:

USB UART接口
USB HID(交互设备)
USB存储设备

UART,即通用异步接收/发送器。这类设备只能够利用USB来进行数据的接收和发送操作。实际上,这类设备与普通的通信设备并没有本质上的区别。

HID,即人机交互设备。这也是USB作为接口来使用的一种典型应用。这类设备包括键盘,鼠标,游戏控制器,以及很多简单的显示设备等等。

最后就是USB存储设备,这也是最常见的一种USB使用形式。比如说外接硬盘,U盘和闪存驱动器等等,这些都属于USB存储设备这一类。

正如你所了解的那样,USB交互设备和USB存储器这两大类USB设备是目前我们使用最为广泛的。

现在,每一种USB设备,尤其是人机交互设备和存储设备,都有一串特殊的数字,这串数字被称为厂商ID和产品ID。这两个数字一般是成对出现的。厂商ID用于标明该产品是由哪一个制造商所生产的,而产品ID是产品的标识符。需要注意的是,产品ID并不是序列号。具体情况如下图所示:

上图所显示的是连接至我这台计算机的USB设备信息。我们可以调用lsusb命令来查看系统中的USB设备信息。

首先,我们要选择一个设备来进行实验。我有一个罗技无线鼠标,这是一种人机交互设备。而这个鼠标中也配备有一个数据接收装置,所以我决定将这个无线鼠标作为我的实验对象。你能从上图所示的信息中找到这个鼠标吗?没错,就是第四个。该设备的具体信息如下:

Bus 003 Device 010: ID 046d:c52f Logitech, Inc. Unifying Receiver

ID部分所显示的数据为046d:c52f,这是厂商ID和产品ID(厂商ID: 产品ID)。很明显,厂商ID为046d,产品ID为c52f。

除此之外,我们可以看到开头的“Bus 003 Device 010”。这段信息告诉我们这一USB设备所连接的是哪一条总线。这是一条非常重要的信息。

准备工作

现在,我们需要使用root权限来运行Wireshark,并利用Wireshark来嗅探USB通信数据。当然了,我们并不建议大家利用root权限来进行操作。我们可以使用Linux提供的usbmon来为我们获取和导出数据信息的操作赋予足够的权限。具体请参考Linux-udev。我们所要做的就是创建一个usbmon group,然后将我们的账号加入这个组,最后生成相应的udev规则。相关操作命令如下:

addgroup usbmon
gpasswd -a $USER usbmon
echo 'SUBSYSTEM=="usbmon", GROUP="usbmon", MODE="640"' > /etc/udev/rules.d/99-usbmon.rules

接下来,我们需要使用usbmon的内核模块。如果系统还未加载该模块,我们可以使用root权限并运行下列命令来进行加载。

modprobe usbmon

数据捕捉

打开Wireshark之后,我们可以看到如下图所示的接口列表。你应该能看到形如usbmonX的信息,其中X为数字。下图显示的是我的信息(没错,我使用了root权限):

如果Wireshark检测到了接口中有数据流信息,它会以波形图的形式将信息显示给我们。那么,我们该选择哪一个呢?还记得我之前说过的吗?没错,数字“X”所对应的就是设备所连接的USB总线。在我的操作过程中,目标设备为usbmon3。我们打开它之后,就可以看到其中的数据流信息了。点击usbmon接口,然后点击那个蓝色的鱼鳍图标。

然后呢?

我们在成功捕获了数据流信息之后,我们能做什么呢?这一切都将取决于我们自己。通常情况下,我们可以通过这些信息来了解设备与主机的通信机制。而且在某些情况下,我们还可以利用这些信息并结合我们自己的知识来对其进行逆向工程分析。

时间: 2024-08-01 02:34:59

使用Wireshark捕捉USB通信数据的相关文章

如何用Wireshark捕获USB数据?

现在越来越多的电子设备采用USB接口进行通讯,通讯标准也在逐步提高.那么,我们就会好奇这些设备是如何工作的?而无论你是一个硬件黑客,业余爱好者或者只是对它有一点兴趣的,USB对我们都是具有挑战性的. 事实上通过wireshark,我们可以捕获到usb设备发送给我们主机的数据,这样就可以进一步研究了. 本文中,我们将向大家介绍怎样通过wireshark捕获usb数据,使用的环境如下: Wireshark 2.0.1(SVN) Linux kernel 4.1.6 你也可以用其他版本的wiresha

VC++ 6.0 C8051F340 USB 通信 CAN 数据解析

// HelloWorld.cpp : Defines the entry point for the console application. // /***************************************************************************** * VC++ 6.0 C8051F340 USB 通信 CAN 数据解析 * 声明: * 1. 这是在<VC++ 6.0 C8051F340 USB PC侧通信 Demo>的基础上的代码:

c# usb 通信

问题描述 c#USB通信的示例或者资料啊!..类似于串口一样可以发送接收数据的..... 解决方案 解决方案二:无论是串口还是USB.那端得连一个设备吧.你是那个设备通信.不应该是和一根线子通信.你和设备通信,就得知道那个设备提供什么东东.问你的设备商要.解决方案三:目标设备是一个单片机啊,就是想通过USB来让单片机和PC通信,类似于串口这样的收发数据.解决方案四:我也想知道,一起等资料.解决方案五:我也想知道,一起等资料.解决方案六:网上找了好多,都是千篇一律的检测是否插入USB设备.有资料的

如何用c或c++提取wireshark抓取的数据包中的数据

问题描述 如何用c或c++提取wireshark抓取的数据包中的数据 我用wireshark抓取了数据包 如何通过程序提取出其中我想要的信息呢?求程序 解决方案 http://wenku.baidu.com/link?url=HmlLwziHvQ2eDGwL-fYNxviUawq7lCSA4X866SQYy-r1NVuqC-pcwV7_8gCkVMmlzFiozXpYVmfdabGw_pLk57s6E1hQgkOugvIOuToJKvC

android应用-蓝牙串口通信数据接收问题

问题描述 蓝牙串口通信数据接收问题 各位高人,我在做一个关于蓝牙串口通信的项目,现在涉及到接收返回的数据并进行处理. 现在的问题是数据总是接收不全.接收的数据有两种格式,1.以F2或F5开头的三个字节的 数据.2 是以F1 开头的12个字节的数据.以下是我接收的数据 03-12 14:08:03.214: D/BluetoothService(31197): --buffer.length is: 12. InStream.read() buffer is: f12140001000000304

tcp数据接收-TCP通信 数据接收 数据分析

问题描述 TCP通信 数据接收 数据分析 我在用c++做TCP客户端 建立连接之后能够向服务器端发送数据 但是新建立的线程用来接收服务器的回发数据 并进行数据分析 再输出 ~~ 一直接收不到数据~~有木有大神给个例子 参考下 980020740@qq.com

485 232-232转USB读取数据正确,但485转USB读取数据出错,用调试助手都可以正常接收数据。

问题描述 232转USB读取数据正确,但485转USB读取数据出错,用调试助手都可以正常接收数据. 用485转USB读取数据有时候正确,有时候乱码.硬件应该没有问题,用调试工具可以正确接收数据. 本人使用的是控件编写的测试程序,,,实在不行用API编写不知道会不会有同样情况..求大神指导... variant_inp = m_ctrlComm.GetInput(); safearray_inp = variant_inp; len = safearray_inp.GetOneDimSize();

f320 usb通信-F320的USB端口D+和D-端口能复用普通I/O口么?

问题描述 F320的USB端口D+和D-端口能复用普通I/O口么? F320的USB端口D+和D-端口,想要两种工作方式,当和电脑连接的时候这两个端口做USB的D+和D-进行USB通信,当工作的时候这两个端口能不能做普通的I/O口么? 解决方案 可以的,c8051f320单片机本来就支持交叉分配资源. 解决方案二: 工作时 USB通信吗?保持USB 识别不断线吗?

C#中如何实现USB通信

问题描述 最近我需要用C#做一个USB通信的程序,即使用电脑和USB线链接设备,发送命令来控制设备.请问如何能够实现,谢谢.