QCSuper 是一款与基于 Qualcomm 的手机和调制解调器通信的工具,能够捕获原始 2G/3G/4G(部分型号支持 5G)无线电帧等数据。
它将允许你生成 PCAP 捕获文件,可通过已 root 的 Android 手机、USB 网卡或现有其他格式的捕获文件来实现。

在安装之后,你可以将已 root 的手机通过 USB 连接,配合兼容设备使用时,操作简单到只需:```bash qcsuper --adb --wireshark-live
或者,如果你已手动启用在手机上暴露 Diag 端口(具体步骤可能因手机调制解调器和制造商而异,请参阅下文说明),或者如果你插入了移动宽带上网卡:```bash
qcsuper --usb-modem auto --wireshark-live
它使用 Qualcomm Diag 协议(也称为 QCDM 或 DM,即诊断监视器)来与手机基带通信。
你愿意报告你的设备是否正常工作吗?你可以打开一个 Github issue。
附录:
博客文章/演示: 介绍 QCSuper:一款用于在基于 Qualcomm 的手机上捕获 2G/3G/4G 空中流量的工具
更多文档:
QCSuper 近期在 Ubuntu LTS 22.04+ 上进行测试和开发,也已在 Windows 11 上使用。它依赖于一些 Python 模块。建议使用 Linux 以获得更好的兼容性。
要使用它,你的手机必须已 root 或通过 USB 暴露一个 diag 服务端口。为了检查与手机的兼容性,请在 GSMArena 等网站上查找手机型号,并检查其是否配备 Qualcomm 处理器。
要打开 QCSuper 生成的 PCAP 文件,你可以使用任何 Wireshark 2.x - 4.x 版本查看 2G/3G 帧,但查看 4G 帧至少需要 Wireshark 2.5.x(若要查看从 4G 帧中解密的单个 NAS 消息,则需要 2.6.x)。Ubuntu 目前为所有版本提供了足够新的构建版本。
5G 帧的解码已在 Wireshark 3.6.x 及以上版本 下测试,并将通过自动安装 Wireshark Lua 插件来完成(在 Windows 下位于 %APPDATA%\Wireshark\plugins,在 Linux 和 macOS 下位于 ~/.local/lib/wireshark/plugins)。如果你希望避免安装,可以通过设置 DONT_INSTALL_WIRESHARK_PLUGIN=1 环境变量来跳过。
要以系统级方式从 PyPI 安装 QCSuper 的稳定版本,你可以运行以下命令:```bash
sudo apt install python3-pip wireshark
sudo pip3 install --upgrade qcsuper --break-system-packages
然后,你只需在终端中输入 `qcsuper` 即可运行 QCSuper。
为了将开发版安装到特定文件夹中,请打开终端并输入以下内容:```bash
# Download QCSuper
git clone https://github.com/P1sec/qcsuper
cd qcsuper
# Install dependencies
sudo apt install python3-pip wireshark
sudo pip3 install --upgrade . --break-system-packages
然后,从 qcsuper/ 目录运行 QCSuper,在终端中使用 ./qcsuper.py 命令。
在 Linux 上,你可以使用 uv 包管理器来安装 QCSuper,它是 PIP 的现代替代方案。
首先,在终端中运行以下命令之一来安装 uv:```bash
sudo snap install --classic astral-uv # On Ubuntu
sudo dnf install -y uv # On Fedora
sudo pacman -S uv # On Archlinux, Manjaro
curl -LsSf https://astral.sh/uv/install.sh | sh # On Debian and others
然后,运行以下命令来安装最新的稳定版本:```bash
uv tool install qcsuper
或者,您可以使用以下命令安装最新的开发版本:```bash uv tool install git+https://github.com/P1sec/qcsuper
然后你只需在终端中输入这个:```bash
qcsuper
但是,如果您需要以 root 身份运行 qcsuper(例如因为您正在从调制解调器设备读取数据),则在使用 sudo 运行 uv 时,qcsuper 可能不在 $PATH 中,因此可能需要执行以下操作:```bash
sudo env "PATH=$PATH" qcsuper
如果你希望参与该工具的开发,可以使用以下命令下载源代码,然后在 `~/.local/bin` 中创建指向源代码目录的 QCSuper 符号链接:```bash
git clone https://github.com/P1sec/qcsuper
cd qcsuper
uv sync # Create .venv in the current directory
uv tool install -e . # Create symlinks into ~/.local/bin
QCSuper 可以在 Windows 上运行,但您应事先确保 Google 的 ADB 提示符能在您的机器上与您的设备正常配合运行,并且如果您的设备需要直接通过伪串行 USB 连接到 Diag 端口,您还应该手动创建 libusb-win32 过滤器(通过安装后可在“开始”菜单中访问的实用程序)。
(请注意,如果您切换设备模式,相关的 USB PID/VID 可能会发生变化,可能需要重新在 libusb-win32 过滤器创建实用程序中关联驱动——和/或视情况在 Windows 外围设备管理器中进行关联。)
在 Windows 上,您可能(除了 Google 的 ADB 内核驱动程序之外)需要根据您的手机型号下载并安装手机的 USB 驱动程序(这可能包括通用的 Qualcomm USB 驱动程序)。请在 Google 上搜索您的手机型号 +“USB driver”或“ADB driver”以获取说明。
然后,您需要确保可以使用 adb 访问您的设备。您可以在此处找到有关如何下载和设置 adb 的教程。adb.exe shell(或您使用的任何可执行文件路径,QCSuper 的 qcsuper/inputs/external/adb 文件夹中提供了一份 ADB 可执行文件的副本)命令必须显示一个提示符才能继续。
然后,请按顺序执行以下链接(该工具近期已在 Windows 11 上测试过——不保证能在 Windows 7 上运行):
%PATH% 系统变量已更新。要安装所需的 Python 模块,请打开命令提示符并输入:```bash pip3 install --upgrade pyserial pyusb crcmod pycrate https://github.com/pyocd/libusb-package/archive/master.zip
仍在命令提示符中,使用 `cd` 命令进入包含 QCSuper 的目录。然后您可以执行命令(如果您从在线安装程序安装了 Python 3,则命令应以 `py qcsuper.py` 或 `py3 qcsuper.py` 开头;如果您从 Microsoft Store 安装,则应为 `python3.exe .\qcsuper.py`)。
如上所述,您可能需要通过“开始”菜单中提供的实用程序添加 `libusb-win32` 过滤器,以确保在模式切换后的设备上,QCSuper 能够看到对应 Diag 端口的接口(如果 ADB 驱动正常工作且设备已正确 root,则首次使用 `--adb` 标志运行工具的尝试失败应会触发模式切换)。
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/48811/e7aab43a3643cd941857febb8fcb8e2d7bf8c3638629a4e5591dc689afa48c07.png" alt="为小米手机的 Diag 端口添加 libusb-win32 过滤器的截图">
</p>
## 支持的协议
QCSuper 支持捕获少量移动无线协议。这些协议被放置在 [GSMTAP 头部](http://osmocom.org/projects/baseband/wiki/GSMTAP) 之后,该头部是一个标准头部(封装在 UDP/IP 中),用于标识协议;GSMTAP 数据包被放入 [PCAP 文件](https://wiki.wireshark.org/Development/LibpcapFileFormat) 中,可通过 Wireshark 进行完整分析。
2G/3G/4G 协议可划分为几个“层”:第 1 层涉及数字无线电调制和多路复用,第 2 层处理诸如分段和确认之类的事务,第 3 层是实际的信令或用户数据。
QCSuper 通常允许您在层 3 上捕获,因为这是使用 Wireshark 分析最实用的层次,也是 Diag 协议原生提供的内容(并且这里有一些有趣的信息)。
* 2G (GSM):第 3 层及以上(RR/...)
* 2.5G(GPRS 和 EDGE):第 2 层及以上(MAC-RLC/...),用于数据确认
* 3G(UMTS):第 3 层及以上(RRC/...)
* 此外,它还支持在单独的 GSMTAP 帧中重组 SIB(系统信息块,即向所有用户广播的数据),因为 Wireshark 目前还无法自行完成此操作:标志 `--reassemble-sibs`
* 4G(LTE):第 3 层及以上(RRC/...)
* 此外,它还支持将解密的 NAS 消息(这些消息以加密形式嵌入在 RRC 数据包中)放入附加帧中:标志 `--decrypt-nas`
默认情况下,不包含设备发送的 IP 流量,您只看到信令帧。您可以使用 `--include-ip-traffic` 选项包含您生成的 IP 流量(IP 在 2G/3G/4G 中基本上就是您的数据流量的第 3 层,不同之处在于其头部可能会被压缩(ROHC),并且可能包含一个很小的 PPP 头部)。
您发送的数据流量使用与信令流量不同的信道;该信道通过信令流量进行建立。因此,QCSuper 应向您显示与该信道如何建立相关的所有细节。
## 使用须知
要使用 QCSuper,您需要指定一个输入源(例如:`--adb`(Android 手机)、`--usb-modem`)以及一个或多个模块(`--wireshark-live` 用于打开 Wireshark,`--pcap-dump` 用于将流量写入 PCAP 文件,`--info` 用于获取有关设备的通用信息……)。
您可以输入的一些命令如下:```bash
# Open Wireshark directly, using a rooted Android phone as an input,
# for compatible phones:
$ qcsuper --adb --wireshark-live
# ^ this command is equivalent to (prefer this when running as root):
$ qcsuper --adb --pcap-dump - | wireshark -k -i -
# Same, but dump to a PCAP file instead of opening Wireshark directly
$ qcsuper --adb --pcap-dump /tmp/my_pcap.pcap
或者,如果它不够简单而无法使用:```bash
$ qcsuper --usb-modem auto --wireshark-live
$ lsusb (..) Bus 001 Device 076: ID 05c6:9091 Qualcomm, Inc. Intex Aqua Fish & Jolla C Diagnostic Mode $ qcsuper --usb-modem 1d6b:0003 --wireshark-live # With vendor ID:product ID... $ qcsuper --usb-modem 002:001 --wireshark-live # ...or with bus ID:device ID
$ lsusb -v (..) $ qcsuper --usb-modem 1d6b:0003:1:0 --wireshark-live # With vendor ID:product ID:configuration:interface... $ qcsuper --usb-modem 002:001:1:0 --wireshark-live # ...or with bus ID:device ID:configuration:interface
$ qcsuper --usb-modem /dev/ttyUSB2 --wireshark-live
$ qcsuper --usb-modem /dev/ttyHS2 --wireshark-live
以下是 QCSuper 的当前使用说明:```
usage: qcsuper [-h] [--cli] [--efs-shell] [--efs-shell2] [-v] (--adb | --adb-wsl2 ADB_WSL2 | --tcp IP_ADDRESS:TCP_PORT | --usb-modem TTY_DEV | --dlf-read DLF_FILE |
--json-geo-read JSON_FILE) [--info] [--pcap-dump PCAP_FILE] [--wireshark-live] [--memory-dump OUTPUT_DIR] [--dlf-dump DLF_FILE] [--json-geo-dump JSON_FILE]
[--decoded-sibs-dump] [--reassemble-sibs] [--decrypt-nas] [--include-ip-traffic] [--start MEMORY_START] [--stop MEMORY_STOP]
A tool for communicating with the Qualcomm DIAG protocol (also called QCDM or DM).
options:
-h, --help show this help message and exit
--cli Use a command prompt, allowing for interactive completion of commands.
--efs-shell Spawn an interactive shell to navigate within the embedded filesystem (EFS) of the baseband device.
--efs-shell2 Spawn an interactive shell to navigate within the embedded filesystem (EFS) of the baseband device. Use the secondary filesystem known as "alternate".
-v, --verbose Add output for each received or sent Diag packet.
Input mode:
Choose an one least input mode for DIAG data.
--adb Use a rooted Android phone with USB debugging enabled as input (requires adb).
--adb-wsl2 ADB_WSL2 Unix path to the Windows adb executable. Equivalent of --adb command but with WSL2/Windows interoperability.
--tcp IP_ADDRESS:TCP_PORT
Connect to remote TCP service exposing DIAG interface.
--usb-modem TTY_DEV Use an USB modem exposing a DIAG pseudo-serial port through USB.
Possible syntaxes:
- "auto": Use the first device interface in the system found where the
following criteria is matched, by order of preference:
- bInterfaceClass=255/bInterfaceSubClass=255/bInterfaceProtocol=48/bNumEndpoints=2
- bInterfaceClass=255/bInterfaceSubClass=255/bInterfaceProtocol=255/bNumEndpoints=2
- usbserial or hso device name (Linux/macOS): "/dev/tty{USB,HS,other}{0-9}"
- COM port identifier (Windows): "COM{0-9}"
- "vid:pid[:cfg:intf]" (vendor ID/product ID/optional bConfigurationValue/optional
bInterfaceNumber) format in hexa: e.g. "05c6:9091" or "05c6:9091:1:0 (vid and pid
are four zero-padded hex digits, cfg and intf are canonical values from the USB
descriptor, or guessed using the criteria specified for "auto" above if not specified)
- "bus:addr[:cfg:intf]" (USB bus/device address/optional bConfigurationValue/optional
bInterfaceNumber) format in decimal: e.g "001:003" or "001:003:0:3" (bus and addr are
three zero-padded digits, cfg and intf are canonical values from the USB descriptor)
--dlf-read DLF_FILE Read a DLF file generated by QCSuper or QXDM, enabling interoperability with vendor software.
--json-geo-read JSON_FILE
Read a JSON file generated using --json-geo-dump.
Modules:
Modules writing to a file will append when it already exists, and consider it Gzipped if their name contains ".gz".
--info Read generic information about the baseband device.
--pcap-dump PCAP_FILE
Generate a PCAP file containing GSMTAP frames for 2G/3G/4G, to be loaded using Wireshark.
--wireshark-live Same as --pcap-dump, but directly spawn a Wireshark instance.
--memory-dump OUTPUT_DIR
Dump the memory of the device (may not or partially work with recent devices).
--dlf-dump DLF_FILE Generate a DLF file to be loaded using QCSuper or QXDM, with network protocols logging.
--json-geo-dump JSON_FILE
Generate a JSON file containing both raw log frames and GPS coordinates, for further reprocessing. To be used in combination with --adb.
--decoded-sibs-dump Print decoded SIBs to stdout (experimental, requires pycrate).
PCAP generation options:
To be used along with --pcap-dump or --wireshark-live.
--reassemble-sibs Include reassembled UMTS SIBs as supplementary frames, also embedded fragmented in RRC frames.
--decrypt-nas Include unencrypted LTE NAS as supplementary frames, also embedded ciphered in RRC frames.
--include-ip-traffic Include unframed IP traffic from the UE.
Memory dumping options:
To be used along with --memory-dump.
--start MEMORY_START Offset at which to start to dump memory (hex number), by default 00000000.
--stop MEMORY_STOP Offset at which to stop to dump memory (hex number), by default ffffffff.
Specifying - to pipe data from stdin or towards stdout is supported (gzipped content may not be detected).
本 README 文件并非关于如何 root 手机(让手机允许您运行诸如 "su" 之类的命令)的指南。
在大多数较新的 Android 设备上,您必须首先使用手机开发者设置中的 "OEM/引导加载程序解锁" 选项来解锁引导加载程序,然后您可以使用诸如 Magisk 之类的工具,该工具将使您获得针对手机引导加载程序的修补镜像,然后您可以通过 fastboot 模式 将其加载到手机上。
当您的手机已 root 时,QCSuper 在基于 Qualcomm 的设备上更容易正常工作,但通常也有方法在不 root 手机的情况下启用手机上的 Qualcomm Diag USB 模式(也称为 "DM"、Diag Monitor)。这取决于您的手机厂商,并且通过例如在手机拨号键盘上输入一组神奇的数字组合来实现。请参阅下方"如何手动启用我手机上的诊断端口?"一节以了解更多详情。
在 root 手机之前,请记住,您可能还想在已解锁 OEM 的手机上加载备用恢复映像(例如 TWRP),以便使用 TWRP 等工具执行分区备份(这可能就像通过 Fastboot 加载映像、在 TWRP 设置中启用 ADB 链接,然后对 /dev/block/by-name 文件夹). 中的选定分区使用 adb pull 一样简单)。
有关在您的手机型号上获取 root 权限或启用 Diag 模式的具体说明,您可以在 XDA-developers 论坛上使用适当的关键字搜索相关信息。
在基于 Qualcomm/MSM 且搭载 Linux 内核 4.9 或更早版本的 Android 设备上(这大致包括 Android 12 之前的部分设备以及 Android 10 之前的所有设备),基于 Qualcomm 的 Android 设备通常包含一个名为 /dev/diag 的系统设备,该设备允许将数据传送到基带的诊断端口。
在基于 Qualcomm/MSM 且搭载 Linux 内核 4.14 或更高版本的 Android 设备上(这大致包括 Android 10 以来的部分设备以及 Android 13 以来的所有设备),/dev/diag 已消失,因为对应的 diagchar 模块在较新的 AOSP/Linux 内核中默认被禁用。
在搭载 Linux 4.9 或更早版本 MSM 内核的设备上,使用 --adb 标志时,QCSuper 将自动尝试通过 ADB 连接,然后尝试传输一个连接到 /dev/diag 设备的可执行工具,以便使用诸如 su -c /data/local/tmp/adb_bridge 之类的命令以 root 身份启动它,随后通过 TCP 与设备传输诊断数据(同时也通过 ADB 转发相应的 TCP 端口)。
在搭载 Linux 4.14 或更高版本 MSM 内核的设备上,使用 --adb 标志时,QCSuper 将尝试自动通过 ADB 连接,然后尝试使用诸如 su -c 'setprop sys.usb.config diag,adb' 之类的命令切换手机的 USB 端口模式,接着执行相当于 --usb-modem auto 标志的操作(见下文)。
--usb-modem <value> 标志允许 QCSuper 通过 USB 上的伪串行端口连接到 Qualcomm 诊断端口,与 ADB 无关,这是使用外部设备连接到基于 Android 的手机的 Qualcomm diag 协议的最常见方式。
要使用 --usb-modem <value> 标志,必须在相应的手机上启用 Qualcomm 诊断端口,换句话说,手机应该事先已进行 USB 模式切换。
对设备进行 USB 模式切换的最常见方法是以 root 身份执行诸如 setprop sys.usb.config diag,adb 之类的命令,但也可能存在其他方法(对于某些手机厂商)来启用 Qualcomm 的 USB 诊断模式,例如参见此页面了解在某些设备上无需 root 即可启用 Diag 的可能方法——这通常意味着在手机拨号键盘上输入一组神奇的数字组合。
在其他设备上,也可能可以使用由手机厂商签名并具有系统相关权限的 APK 文件来在无需 root 的情况下启用 Diag 模式(例如,搜索适用于小米设备的相关 com.longcheertel.midtest APK)。
一旦您的设备已正确切换模式,通过 ADB 运行 getprop sys.usb.config 命令应显示包含 diag 的文本字符串。
然后,在您的计算机一侧,运行 lsusb(在 Linux 上)应显示一行提及您设备的信息,例如:```
Bus 001 Device 076: ID 05c6:9091 Qualcomm, Inc. Intex Aqua Fish & Jolla C Diagnostic Mode
注意此输出中出现的 `001:076`(总线索引/设备索引标识符)和 `05c6:9091`(供应商 ID/产品 ID)信息。
一旦你获得了这些信息,**你可以尝试在 QCSuper 中使用诸如 `--usb-modem 05c6:9091` 或 `--usb-modem 001:076` 之类的标志**(请注意数字填充)。
如果这还不能确定,你可以使用 `lsusb -v -d 05c6:9091` 命令,该命令应产生详细输出,包括相应 USB 设备的 USB 配置、接口和端点:```
Bus 001 Device 027: ID 05c6:9091 Qualcomm, Inc. Intex Aqua Fish & Jolla C Diagnostic Mode
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.01
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x05c6 Qualcomm, Inc.
idProduct 0x9091 Intex Aqua Fish & Jolla C Diagnostic Mode
bcdDevice 5.04
iManufacturer 1 Xiaomi
iProduct 2 Mi 11
iSerial 3 d94f4341
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x0086
bNumInterfaces 4
bConfigurationValue 1
iConfiguration 4 Default composition
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 48
iInterface 0
[...]
在设备未被正确检测到的情况下,QCSuper 允许你手动选择希望尝试连接的配置和接口的标识符(在原始 USB 描述符中分别标记为 bConfigurationValue 和 bInterfaceNumber)。
例如,--usb-modem 05c6:9091:1:0 标志将分别在相关设备上选择配置 1 和接口 0。 --usb-modem 05c6:9091:1:4 将使用配置 1 选择接口 4。
如果未指定配置和接口索引的详细信息,它将按优先顺序选择系统 USB 总线上符合以下条件的第一个接口描述符:
bInterfaceClass=255/bInterfaceSubClass=255/bInterfaceProtocol=48/bNumEndpoints=2bInterfaceClass=255/bInterfaceSubClass=255/bInterfaceProtocol=255/bNumEndpoints=2当使用 --usb-modem auto 标志时,将选择第一个暴露符合此标准的 USB 接口的设备;如有必要,在 Linux 上还会选择底层的 /dev/ttyUSB*(usbserial 模块)或 /dev/ttyHS*(hso 模块)字符设备,前提是设备已被内核模块检测并挂载(请参阅下方“将 QCSuper 与 USB 调制解调器配合使用”一节)。
另外,在 Linux 上,也可以使用 usbserial 模块手动创建与给定 USB 设备接口相对应的 /dev/ttyUSB* 端点,然后你即可使用 QCSuper 并通过诸如 --usb-modem /dev/ttyUSB0 之类的标志进行连接(这可能要求以 root 权限运行 QCSuper)。为此,你可以使用如下命令:```
sudo rmmod usbserial
sudo modprobe usbserial vendor=0x05c6 product=0x9091
## 将 QCSuper 与 USB 调制解调器配合使用
您可以使用 `--usb-modem <device>` 选项将 QCSuper 与暴露 Diag 端口的 USB 调制解调器配合使用,其中 `<device>` 是 Linux 上伪串行设备的名称(例如 `/dev/ttyUSB0`、`/dev/ttyHS2` 及其他可能)或 Windows 上 COM 端口的名称(例如 `COM2`、`COM3`)。
请注意,在大多数设置中,您需要以 root 身份运行 QCSuper 才能使用此模式,尤其是为了处理串口干扰。
如果您不知道 `/dev` 下哪些设备暴露了 Diag 端口,您可能需要逐一尝试多个设备。您可以尝试通过停止 ModemManager 守护进程(`sudo systemctl stop ModemManager`)并运行以下命令来自动检测:`sudo ModemManager --debug 2>&1 | grep -i 'port is QCDM-capable'`,然后按 Ctrl-C。
请注意,如果一开始您就无法通过例如 ModemManager 使用您的设备,那么很可能该设备并未完全配置好,它也无法与 QCSuper 配合使用。一些可能的坑包括:
* 您没有为设备应用正确的[模式切换](https://wiki.archlinux.org/index.php/USB_3G_Modem#Mode_switching)命令。
* 如果您购买的设备之前插有来自其他运营商的 SIM 卡,您的设备可能被 SIM 卡锁定。您可能需要使用原运营商的解锁码,并将其像 PIN 码一样提交给设备:`sudo mmcli -i 0 --pin=<your_unlock_code>`
如果您的基于 Qualcomm 的 USB 设备默认不暴露 Diag 端口,您可能需要通过 AT 端口输入以下内容以启用 Diag 端口:```
AT$QCDMG
请注意,同一时间只能有一个客户端与 Diag 端口通信。这适用于两个 QCSuper 实例,或 QCSuper 与 ModemManager 实例。
如果您的系统上运行着 ModemManager,QCSuper 将尝试动态添加一条 udev 规则,以防止其访问 Diag 端口并重启其守护进程,因为这是目前实现此目的的最佳方式。关闭 QCSuper 时会移除该规则。
QCSuper 已成功在以下设备上测试通过:
不过,其目标是在捕获功能上兼容尽可能广泛的基于高通芯片组的设备。
其他可用设备列表见:https://github.com/P1sec/QCSuper/issues?q=label:"confirmed+working"
欢迎通过提交 Github issue 来报告您的设备是否工作正常。
还有一些其他实现了部分 Diag 协议的开源工具,用途各异: