前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用于监控USB设备连接事件的取证工具

用于监控USB设备连接事件的取证工具

作者头像
FB客服
发布于 2019-08-28 07:08:36
发布于 2019-08-28 07:08:36
2.3K00
代码可运行
举报
文章被收录于专栏:FreeBufFreeBuf
运行总次数:0
代码可运行

usbrip(是“USB Ripper”的简写,而不是“USB R.I.P.”)是一个带有CLI接口的开源取证工具,可用于跟踪/监控Linux机器上的USB设备连接事件(即USB事件历史记录,“已连接”和“已断开连接”事件)。

描述

usbrip是纯Python 3编写的一个小软件(使用一些外部模块,参见Dependencies/PIP),它会通过解析Linux的日志文件(/var/log/syslogor/var/log/messages取决于发行版本) 来构建USB事件历史表格,其中可能包含的内容有:“已连接”(日期和时间),“User”,“VID”(供应商ID),“PID”(产品ID),“Product”,“制造商”,“序列号”, “端口”和“断开连接”(日期和时间)。

此外,它还可以:

将收集到的信息导出为JSON转储文件; 生成一个授权(可信)USB设备列表作为JSON(称之为auth.json); 基于auth.json搜索“违规事件”:显示(或生成另一个JSON)USB设备,这些设备出现在历史记录中但不会出现在auth.json中; 当使用-s标志安装时创建加密存储(7zip存档)以在crontab调度程序的帮助下自动备份和积累USB事件; 根据特定USB设备的VID和/或PID搜索其他详细信息。

快速开始

usbrip可在PyPI下载和安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ pip3 install usbrip

截图

Git Clone

为简单起见,让我们同意所有出现~/usbrip$前缀的命令都在~/usbrip目录中执行,该目录是由git clone创建的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ git clone https://github.com/snovvcrash/usbrip.git usbrip && cd usbrip
~/usbrip$

依赖

usbrip仅适用于未修改的系统日志文件结构。因此,如果更改syslogs的格式(如,使用syslog-ng或rsyslog),它将无法解析USB历史记录。这就是为什么“Connected”和“Disconnected”字段的时间戳没有年份的原因。

deb 包

python3.6 (或更新) interpreter python3-venv p7zip-full(由storages模块使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~$ sudo apt install python3-venv p7zip-full -y

PIP 包

usbrip使用以下外部模块:

terminaltables termcolor

手动

手动解析Python依赖关系(实际上并不需要pip或setup.py,可以自动化该过程,请参阅安装部分)创建虚拟环境(可选)并从内部运行pip:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ python3 -m venv venv && source venv/bin/activate
(venv) ~/usbrip$ pip install -r requirements.txt

或者你可以通过下面的pipenv单行命令为你完成所有的工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ pipenv install && pipenv shell

之后你就可以非常轻松的运行usbrip了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(venv) ~/usbrip$ python -m usbrip -h
Or
(venv) ~/usbrip$ python __main__.py -h

安装

有两种方法可以将usbrip安装到你的系统中:pip或setup.py。

pip 或 setup.py

首先,usbrip是pip可安装的。这意味着在git cloning了repo之后,你可以简单地启动pip安装过程,然后在终端的任何地方运行usbrip,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ python3 -m venv venv && source venv/bin/activate
(venv) ~/usbrip$ pip install .
(venv) ~/usbrip$ usbrip -h

或者,如果你想在本地解析Python依赖关系,请使用setup.py:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ python3 -m venv venv && source venv/bin/activate
(venv) ~/usbrip$ python setup.py install
(venv) ~/usbrip$ usbrip -h

注意:你可能希望在Python虚拟环境处于活动状态时运行安装过程(如上所示)。

install.sh

其次,usbrip也可以使用./installers/install.sh脚本安装到系统中。

当使用./installers/install.sh时,可以使用一些额外的功能:

自动创建虚拟环境; 存储模块变为可用:你可以设置crontab job,按计划备份USB事件(你可以在usbrip/cron/usbrip.cron中找到crontab job的示例)。

警告:如果你使用的是crontab计划任务,则需要使用sudo crontab -e配置cron job,以强制storage update子模块以root用户身份运行,并保护USB事件存储的密码。存储密码保存在/var/opt/usbrip/usbrip.ini中。

./installers/uninstall.sh脚本会从系统中删除所有安装项。

要安装usbrip命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ chmod +x ./installers/install.sh
~/usbrip$ sudo -H ./installers/install.sh [-l/--local] [-s/--storages]
~/usbrip$ cd
~$ usbrip -h

启用-l开关后,将从本地.tar包(./3rdPartyTools/)而不是PyPI解析Python依赖项。

启用-s开关后,不仅会安装usbrip项目,还会创建受信任的USB设备,历史记录和违规存储列表。

注意:在安装期间使用-s选项时,请确保系统日志至少包含一个外部USB设备条目。这是usbrip成功创建受信任设备列表(并因此成功创建违规存储)的必要条件。

安装完成后,你可以删除usbrip文件夹。

路径

安装后,usbrip的文件存放分布路径如下:

/opt/usbrip/— 项目的主目录; /var/opt/usbrip/usbrip.ini—usbrip配置文件:保存7zip存储的密码; /var/opt/usbrip/storage/—USB事件存储:history.7z和violation.7z(在安装过程中创建); /var/opt/usbrip/log/— usbrip日志(建议在使用crontab时记录usbrip活动,参见usbrip/cron/usbrip.cron); /var/opt/usbrip/trusted/— 受信任USB设备列表(在安装过程中创建); /usr/local/bin/usbrip— 符号链接(symlink)到/opt/usbrip/venv/bin/usbrip脚本。

cron

Cron jobs可以设置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ sudo crontab -l > tmpcron && echo "" >> tmpcron
~/usbrip$ cat usbrip/cron/usbrip.cron | tee -a tmpcron
~/usbrip$ sudo crontab tmpcron
~/usbrip$ rm tmpcron

uninstall.sh

卸载usbrip:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/usbrip$ chmod +x ./installers/uninstall.sh
~/usbrip$ sudo ./installers/uninstall.sh [-a/--all]

启用-a开关后,不仅会删除usbrip项目目录,还会删除所有存储和usbrip日志。

还有就是不要忘记删除cron job。

使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ---------- BANNER ----------

$ usbrip banner
Get usbrip banner.

# ---------- EVENTS ----------

$ usbrip events history [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Get USB event history.

$ usbrip events open <DUMP.JSON> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Open USB event dump.

$ usbrip events gen_auth <OUT_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Generate a list of trusted (authorized) USB devices.

$ usbrip events violations <IN_AUTH.JSON> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-f <FILE> [<FILE> ...]] [-q] [--debug]
Get USB violation events based on the list of trusted devices.

# ---------- STORAGE ----------

$ usbrip storage list <STORAGE_TYPE> [-q] [--debug]
List contents of the selected storage (7zip archive). STORAGE_TYPE is "history" or "violations".

$ usbrip storage open <STORAGE_TYPE> [-t | -l] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [-c <COLUMN> [<COLUMN> ...]] [-q] [--debug]
Open selected storage (7zip archive). Behaves similary to the EVENTS OPEN submodule.

$ usbrip storage update <STORAGE_TYPE> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
Update storage — add USB events to the existing storage (7zip archive). COMPRESSION_LEVEL is a number in [0..9].

$ usbrip storage create <STORAGE_TYPE> [-a <ATTRIBUTE> [<ATTRIBUTE> ...]] [-e] [-n <NUMBER_OF_EVENTS>] [-d <DATE> [<DATE> ...]] [--user <USER> [<USER> ...]] [--vid <VID> [<VID> ...]] [--pid <PID> [<PID> ...]] [--prod <PROD> [<PROD> ...]] [--manufact <MANUFACT> [<MANUFACT> ...]] [--serial <SERIAL> [<SERIAL> ...]] [--port <PORT> [<PORT> ...]] [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
Create storage — create 7zip archive and add USB events to it according to the selected options.

$ usbrip storage passwd <STORAGE_TYPE> [--lvl <COMPRESSION_LEVEL>] [-q] [--debug]
Change password of the existing storage.

# ---------- IDs ----------

$ usbrip ids search [--vid <VID>] [--pid <PID>] [--offline] [-q] [--debug]
Get extra details about a specific USB device by its <VID> and/or <PID> from the USB ID database.

$ usbrip ids download [-q] [--debug]
Update (download) the USB ID database.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Help

获取模块名称列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip -h

获取特定模块的子模块名称列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip <module> -h

获取特定子模块的所有开关列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip <module> <submodule> -h

示例

显示所有USB设备的事件历史记录,banner输出,信息消息和用户交互(-q,--quiet),(-l,--list)表示为列表包含最新的100个条目( -n NUMBER,--number NUMBER):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip events history -ql -n 100

显示外部USB设备的事件历史记录(-e,--external,实际上已断开连接),表示为包含“Connected”,“VID”,“PID”,“Disconnected”的表(-t,--table) 和“序列号”列(-c COLUMN [COLUMN],--column COLUMN [COLUMN])按日期过滤从外部文件中获取的日志(-f FILE [FILE ...],--file FILE [FILE ...]):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip events history -et -c conn vid pid disconn serial -d "Dec  9" "Dec 10" -f /var/log/syslog.1 /var/log/syslog.2.gz

构建所有USB设备的事件历史记录,并将输出重定向到文件以进一步的分析。当输出流不是终端stdout(如 | 或 >)时,输出中将没有ANSI转义字符,因此可以随意使用它。另外需要注意的是,usbrip使用了一些UNICODE符号,因此将生成的文件转换为UTF-8编码(如使用encov),以及将换行符更改为Windows样式会更方便(如使用awk)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
usbrip history events -t | awk '{ sub("$", "\r"); print }' > usbrip.out && enconv -x UTF8 usbrip.out

备注:即使已经将输出发送到stdout,也可以自己去掉转义字符。你只需将输出数据复制到usbrip.out并添加一条awk指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
awk '{ sub("$", "\r"); gsub("\\x1B\\[[0-?]*[ -/]*[@-~]", ""); print }' usbrip.out && enconv -x UTF8 usbrip.out

将受信任的USB设备列表生成为json文件(trusted/auth.json),其中包含9月26日连接的前三个设备的“VID”和“PID”属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip events gen_auth trusted/auth.json -a vid pid -n 3 -d "Sep 26"

警告:有时不同的USB闪存驱动器可能具有相同的序列号。到目前为止,usbrip还没有办法处理这种情况,也就是说它将把一对具有相同SN(如果存在)的设备视为与可信设备列表和gen_auth模块相同的设备。

根据“PID”属性的可信USB设备列表(trusted/auth.json)搜索外部USB设备的事件历史记录,并将结果事件限定为“Bob”作为用户,“EvilUSBManufacturer”为制造商,“1234567890”为序列号,并将输出表示为具有“Connected”,“VID”和“PID”列的表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip events violations trusted/auth.json -a pid -et --user Bob --manufact EvilUSBManufacturer --serial 1234567890 -c conn vid pid

通过VID(--vid VID)和PID(--pid PID)搜索特定USB设备的详细信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip ids search --vid 0781 --pid 5580

下载最新版本的usb_ids/usb.ids数据库(源码可在此处查看):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ usbrip ids download

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
SD NAND应用存储功能描述(3)总线信号电压和时序
当信号电平为3.3V时,主机重复用HCS=1和S18R=1发出ACMD41,直到响应就绪。第一个ACMD41的参数(HCS和S18R)是有效的,但所有后续的ACMD41都应该使用相同的参数发布。如果“Bit 31”表示“ready”,则主机需要检查cc和S18A。
杭州瀚海微
2024/06/25
2010
SD NAND应用存储功能描述(3)总线信号电压和时序
瀚海微SD NAND之SD 协议(44)SD协议的专业术语和命令缩写
Block 基本数据传输单位
杭州瀚海微
2024/09/04
1560
瀚海微SD NAND之SD 协议(44)SD协议的专业术语和命令缩写
SD NAND存储功能描述(21)数据读写
主机选择一张卡进行CMD7的数据读取操作,并设置CMD16面向块的数据传输的有效块长度。读操作的基本总线时序如下图所示。该序列从单个块读取命令(CMD17)开始,该命令在参数字段中指定起始地址。响应像往常一样在CMD行上发送。
杭州瀚海微
2024/07/22
1350
SD NAND存储功能描述(21)数据读写
SD NAND存储功能描述(2)初始化命令
初始化过程从SD SEND OP COND (ACMD41)开始,通过设置其操作条件和OCR中的HCS位。HCS (Host Capacity Support)位设置为1表示主机支持SDHC卡或SDXC卡。
杭州瀚海微
2024/06/24
1840
SD NAND存储功能描述(2)初始化命令
STM32如何使用UHS-I的SD卡
UHS-I的SD卡速度比一般的CLASS10和CLASS8的SD卡速度要快很多。在stm32h7的系列里开始支持UHS-1的SD卡,具体的做法在官方的demo中有示范。电路连接如下:
用户9736681
2022/05/11
1.9K0
STM32如何使用UHS-I的SD卡
SD NAND之SD 协议(33)1.8V供电的驱动强度
cmd6功能组3用于选择驱动强度。从函数0到3定义了4个级别。命令功能0为默认的硬盘强度。选择方法遵循CMD6定义。如果更改驱动强度失败,则仍然选择当前驱动强度。
杭州瀚海微
2024/08/18
1270
SD NAND之SD 协议(33)1.8V供电的驱动强度
瀚海微SD NAND之SD 协议(45)SD电路设计
本附录提供了一种使用安装在SD NAND附近的去耦电容来降低由浪涌电流引起的电压降的方法。
杭州瀚海微
2024/09/05
1110
瀚海微SD NAND之SD 协议(45)SD电路设计
瀚海微SD NAND应用之SD协议系统功能和概念(1) 基础知识
(1)默认速度模式:3.3V信令,频率最高可达25mhz,最高可达12.5 MB/sec
杭州瀚海微
2024/06/14
1260
瀚海微SD NAND应用之SD协议系统功能和概念(1) 基础知识
SD NAND存储功能描述(8)专用命令CMD55 56
当卡接收到这个命令时,会使卡将下面的命令解释为一个特定于应用程序的命令ACMD。ACMD提供命令扩展,具有与常规命令相同的结构,并且可能具有相同的CMD号。卡通过它出现在APP_CMD之后的事实将其识别为ACMD。当没有定义ACMD时,卡将其视为常规命令。
杭州瀚海微
2024/07/02
2370
SD NAND存储功能描述(8)专用命令CMD55  56
14_TF编程
​ 多媒体存储卡(英语:Multimedia Card),又译MMC卡,是一种快闪记忆卡标准。在1997年由西门子及闪迪共同开发,技术基于东芝的NAND快闪记忆技术,因此较早期基于Intel NOR快闪记忆技术的存储卡(例如CF卡)更细小。MMC卡大小与一张邮票差不多,约24mm x 32mm x 1.5mm。MMC卡原本使用1bit串联接口,但较新的标准则容许同时发送4 bit或8 bits的数据。近年MMC卡技术已差不多完全被SD卡所代替;但由于MMC卡仍可被兼容SD卡的设备所读取,因此仍有其作用。这项技术一个公开标准,所有愿意改进它或者为它开发产品的公司都可使用。
韦东山
2022/05/05
1.7K0
14_TF编程
SD NAND存储功能描述(11)命令系统CMD8
虽然Rev 1.01 SD存储卡支持高达12.5 MB/秒的接口速度,但为了支持主机不断增长的性能需求和内存大小持续增长,25 MB/秒的速度是必要的。为了实现25 MB/sec的接口速度,时钟速率增加到50 MHz, CLK/CMD/DAT信号时序和电路条件被重新考虑并从物理层规范1.01版本更改。
杭州瀚海微
2024/07/05
1610
SD NAND存储功能描述(11)命令系统CMD8
SD NAND存储功能描述(14)命令类a
SD Memory Card系统的命令集分为几类,如下表所示。每个类都支持一组卡片功能。表4-20根据卡支持的命令进行设置。一个CCC位对应一个支持的命令号,设置为1。ccc中包含强制命令的类总是被设置为1。具有特定功能的卡可能需要支持一些可选命令。
杭州瀚海微
2024/07/10
1290
SD NAND存储功能描述(14)命令类a
瀚海微SD NAND之SD 协议(29)硬件接口
除了那些连接到内部卡电路的线路外,还有两个写保护/卡检测开关的触点,它们是插座的一部分。这些触点不是强制性的,但如果它们存在,则应按下图所示进行连接。当使用DAT3检测卡时,应断开DAT3的RDAT,另接一个电阻接地。
杭州瀚海微
2024/08/11
1470
瀚海微SD NAND之SD 协议(29)硬件接口
SD NAND存储功能描述(17)命令类d
所有响应都通过命令行CMD发送。响应传输总是从与响应码字对应的位串的最左位开始。代码长度取决于响应类型。
杭州瀚海微
2024/07/16
1030
SD NAND存储功能描述(17)命令类d
瀚海微SD NAND存储功能描述(25)SD Registers
在卡接口内定义了六个寄存器:OCR, CID, CSD, RCA, DSR和SCR。这些只能通过相应的命令访问。OCR、CID、CSD和SCR寄存器携带卡片/内容特定信息,而RCA和DSR寄存器是存储实际配置参数的配置寄存器。为了使将来的扩展成为可能,该卡应在寄存器的保留位中返回0。
杭州瀚海微
2024/08/06
1210
瀚海微SD NAND存储功能描述(25)SD Registers
SD NAND应用存储功能描述(6)读写数据
选择宽总线(4位总线宽度)操作模式可以使用AcMD6选择/取消选择。默认总线上电或GO IDLE (CMDO)后的宽度为1位总线宽度。
杭州瀚海微
2024/06/28
1000
SD NAND应用存储功能描述(6)读写数据
SD NAND存储功能描述(12)时钟控制和CRC
主机可以使用SD Memory Card总线时钟信号将卡切换到节能模式或控制总线上的数据流(以避免欠运行或过运行)。主机不允许降低时钟频率或关闭时钟。
杭州瀚海微
2024/07/08
1950
SD NAND存储功能描述(12)时钟控制和CRC
MK米客方德SD NAND参考设计
R1~R5 (10K-100 kΩ)是上拉电阻,当SD NAND处于高阻抗模式时,保护CMD和DAT线免受总线浮动。
命运之光
2024/09/28
750
MK米客方德SD NAND参考设计
SD NAND存储功能描述(28)RCA Registers
可写的16位相对卡地址寄存器携带卡在卡识别期间由卡发布的卡地址。此地址用于卡片识别程序后的寻址主机卡通信。RCA寄存器的缺省值为Ox0000。保留值Ox0000,通过CMD7将所有卡设置为standby状态。
杭州瀚海微
2024/08/09
1300
SD NAND存储功能描述(28)RCA Registers
GoPro 4 Black使用指南
没想到吧~居然可以看到我解读说明书.主要是机器功能复杂,我也还没有玩到随心所欲的地步...记录一下,熟悉机器用.
云深无际
2021/04/14
3.3K0
GoPro 4 Black使用指南
推荐阅读
相关推荐
SD NAND应用存储功能描述(3)总线信号电压和时序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档