<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=USB</id>
	<title>USB - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=USB"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=USB&amp;action=history"/>
	<updated>2026-05-07T04:29:42Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=USB&amp;diff=261&amp;oldid=prev</id>
		<title>127.0.0.1：​创建页面，内容为“{{Ctf_Wiki}} &lt;span id=&quot;usb&quot;&gt;&lt;/span&gt; = USB =  == 简介 ==  &#039;&#039;&#039;USB详述&#039;&#039;&#039;: [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf]  * 鼠标协议  鼠标移动时表现为连续性，与键盘击键的离散性不一样，不过实际上鼠标动作所产生的数据包也是离散的，毕竟计算机表现的连续性信息都是由大量离散信息构成的  File:./figure/mouse.pn…”</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=USB&amp;diff=261&amp;oldid=prev"/>
		<updated>2023-07-03T05:56:35Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Ctf_Wiki}} &amp;lt;span id=&amp;quot;usb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; = USB =  == 简介 ==  &amp;#039;&amp;#039;&amp;#039;USB详述&amp;#039;&amp;#039;&amp;#039;: [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf]  * 鼠标协议  鼠标移动时表现为连续性，与键盘击键的离散性不一样，不过实际上鼠标动作所产生的数据包也是离散的，毕竟计算机表现的连续性信息都是由大量离散信息构成的  File:./figure/mouse.pn…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ctf_Wiki}}&lt;br /&gt;
&amp;lt;span id=&amp;quot;usb&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
= USB =&lt;br /&gt;
&lt;br /&gt;
== 简介 ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;USB详述&amp;#039;&amp;#039;&amp;#039;: [https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf]&lt;br /&gt;
&lt;br /&gt;
* 鼠标协议&lt;br /&gt;
&lt;br /&gt;
鼠标移动时表现为连续性，与键盘击键的离散性不一样，不过实际上鼠标动作所产生的数据包也是离散的，毕竟计算机表现的连续性信息都是由大量离散信息构成的&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/mouse.png|mouse]]&lt;br /&gt;
&lt;br /&gt;
每一个数据包的数据区有四个字节，第一个字节代表按键，当取0x00时，代表没有按键、为0x01时，代表按左键，为0x02时，代表当前按键为右键。第二个字节可以看成是一个signed byte类型，其最高位为符号位，当这个值为正时，代表鼠标水平右移多少像素，为负时，代表水平左移多少像素。第三个字节与第二字节类似，代表垂直上下移动的偏移。&lt;br /&gt;
&lt;br /&gt;
得到这些点的信息后,即可恢复出鼠标移动轨迹&lt;br /&gt;
&lt;br /&gt;
* Tools&lt;br /&gt;
** [https://github.com/WangYihang/UsbMiceDataHacker UsbMiceDataHacker]&lt;br /&gt;
* 键盘协议&lt;br /&gt;
&lt;br /&gt;
键盘数据包的数据长度为8个字节，击键信息集中在第3个字节&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/keyboard.png|keyboard]]&lt;br /&gt;
&lt;br /&gt;
根据data值与具体键位的对应关系&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/keyboard_pro.png|keyboard_pro]]&lt;br /&gt;
&lt;br /&gt;
可从数据包恢复出键盘的案件信息&lt;br /&gt;
&lt;br /&gt;
* Tools&lt;br /&gt;
** [https://github.com/WangYihang/UsbKeyboardDataHacker UsbKeyboardDataHacker]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;参考&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* https://www.anquanke.com/post/id/85218&lt;br /&gt;
&lt;br /&gt;
== 例题 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;code&amp;gt;Xman&amp;lt;/code&amp;gt;三期夏令营排位赛练习题：&amp;lt;code&amp;gt;AutoKey&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WP：https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
问题描述：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/task_AutoKey.png|task_AutoKey]]&lt;br /&gt;
&lt;br /&gt;
这道题是我参加 &amp;lt;code&amp;gt;Xman&amp;lt;/code&amp;gt; 三期夏令营选拔赛出的一道题，我们如何对其进行分析？&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;流量包是如何捕获的&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 流量包是如何捕获的？ ===&lt;br /&gt;
&lt;br /&gt;
首先我们从上面的数据包分析可以知道，这是个 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 的流量包，我们可以先尝试分析一下 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 的数据包是如何捕获的。&lt;br /&gt;
&lt;br /&gt;
在开始前，我们先介绍一些 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 的基础知识。 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 有不同的规格，以下是使用 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 的三种方式：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;l USB UART&lt;br /&gt;
l USB HID&lt;br /&gt;
l USB Memory&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;UART&amp;lt;/code&amp;gt; 或者 &amp;lt;code&amp;gt;Universal Asynchronous Receiver/Transmitter&amp;lt;/code&amp;gt; 。这种方式下，设备只是简单的将 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 用于接受和发射数据，除此之外就再没有其他通讯功能了。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;HID&amp;lt;/code&amp;gt; 是人性化的接口。这一类通讯适用于交互式，有这种功能的设备有：键盘，鼠标，游戏手柄和数字显示设备。&lt;br /&gt;
&lt;br /&gt;
最后是 &amp;lt;code&amp;gt;USB Memory&amp;lt;/code&amp;gt; ，或者说是数据存储。 &amp;lt;code&amp;gt;External HDD&amp;lt;/code&amp;gt; ， &amp;lt;code&amp;gt;thumb drive/flash drive&amp;lt;/code&amp;gt; 等都是这一类的。&lt;br /&gt;
&lt;br /&gt;
其中使用的最广的不是 &amp;lt;code&amp;gt;USB HID&amp;lt;/code&amp;gt; 就是 &amp;lt;code&amp;gt;USB Memory&amp;lt;/code&amp;gt; 了。&lt;br /&gt;
&lt;br /&gt;
每一个 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 设备（尤其是 &amp;lt;code&amp;gt;HID&amp;lt;/code&amp;gt; 或者 &amp;lt;code&amp;gt;Memory&amp;lt;/code&amp;gt; ）都有一个供应商 &amp;lt;code&amp;gt;ID（Vendor ID）&amp;lt;/code&amp;gt; 和产品识别码&amp;lt;code&amp;gt;（Product Id）&amp;lt;/code&amp;gt; 。 &amp;lt;code&amp;gt;Vendor ID&amp;lt;/code&amp;gt; 是用来标记哪个厂商生产了这个 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 设备。 &amp;lt;code&amp;gt;Product ID&amp;lt;/code&amp;gt; 用来标记不同的产品，他并不是一个特殊的数字，当然最好不同。如下图：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/Product-ID.png|Product-ID]]&lt;br /&gt;
&lt;br /&gt;
上图是我在虚拟机环境下连接在我电脑上的 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 设备列表，通过 &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; 查看命令。&lt;br /&gt;
&lt;br /&gt;
例如说，我在 &amp;lt;code&amp;gt;VMware&amp;lt;/code&amp;gt; 下有一个无线鼠标。它是属于 &amp;lt;code&amp;gt;HID&amp;lt;/code&amp;gt; 设备。这个设备正常的运行，并且通过&amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; 这个命令查看所有 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 设备，现在大家能找出哪一条是这个鼠标吗？？没有错，就是第四个，就是下面这条：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
其中，&amp;lt;code&amp;gt;ID 0e0f:0003&amp;lt;/code&amp;gt; 就是 &amp;lt;code&amp;gt;Vendor-Product ID&amp;lt;/code&amp;gt; 对， &amp;lt;code&amp;gt;Vendor ID&amp;lt;/code&amp;gt; 的值是 &amp;lt;code&amp;gt;0e0f&amp;lt;/code&amp;gt; ，并且 &amp;lt;code&amp;gt;Product ID&amp;lt;/code&amp;gt; 的值是 &amp;lt;code&amp;gt;0003&amp;lt;/code&amp;gt; 。 &amp;lt;code&amp;gt;Bus 002 Device 002&amp;lt;/code&amp;gt; 代表 &amp;lt;code&amp;gt;usb&amp;lt;/code&amp;gt; 设备正常连接，这点需要记下来。&lt;br /&gt;
&lt;br /&gt;
我们用 &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; 权限运行 &amp;lt;code&amp;gt;Wireshark&amp;lt;/code&amp;gt; 捕获 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 数据流。但是通常来说我们不建议这么做。我们需要给用户足够的权限来获取 &amp;lt;code&amp;gt;Linux&amp;lt;/code&amp;gt; 中的 &amp;lt;code&amp;gt;usb&amp;lt;/code&amp;gt; 数据流。我们可以用 &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; 来达到我们的目的。我们需要创建一个用户组 &amp;lt;code&amp;gt;usbmon&amp;lt;/code&amp;gt; ，然后把我们的账户添加到这个组中。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;addgroup usbmon&lt;br /&gt;
gpasswd -a $USER usbmon&lt;br /&gt;
echo &amp;#039;SUBSYSTEM==&amp;quot;usbmon&amp;quot;, GROUP=&amp;quot;usbmon&amp;quot;, MODE=&amp;quot;640&amp;quot;&amp;#039; &amp;gt; /etc/udev/rules.d/99-usbmon.rules&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
接下来，我们需要 &amp;lt;code&amp;gt;usbmon&amp;lt;/code&amp;gt; 内核模块。如果该模块没有被加载，我们可以通过以下命令加载该模块：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;modprobe usbmon&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
打开 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; ，你会看到 &amp;lt;code&amp;gt;usbmonX&amp;lt;/code&amp;gt; 其中 &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; 代表数字。下图是我们本次的结果（我使用的是&amp;lt;code&amp;gt;root &amp;lt;/code&amp;gt;）：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/usbmon0.png|usbmon0]]&lt;br /&gt;
&lt;br /&gt;
如果接口处于活跃状态或者有数据流经过的时候， &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 的界面就会把它以波形图的方式显示出来。那么，我们该选那个呢？没有错，就是我刚刚让大家记下来的，这个X的数字就是对应这 &amp;lt;code&amp;gt;USB Bus&amp;lt;/code&amp;gt; 。在本文中是 &amp;lt;code&amp;gt;usbmon0&amp;lt;/code&amp;gt; 。打开他就可以观察数据包了。&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/analysis-usbmon0.png|analysis-usbmon0]]&lt;br /&gt;
&lt;br /&gt;
通过这些，我们可以了解到 &amp;lt;code&amp;gt;usb&amp;lt;/code&amp;gt; 设备与主机之间的通信过程和工作原理，我们可以来对流量包进行分析了。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;如何去分析一个usb流量包&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== 如何去分析一个USB流量包？ ===&lt;br /&gt;
&lt;br /&gt;
根据前面的知识铺垫，我们大致对 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 流量包的抓取有了一个轮廓了，下面我们介绍一下如何分析一个 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 流量包。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 协议的细节方面参考 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 的 &amp;lt;code&amp;gt;wiki&amp;lt;/code&amp;gt; ：https://wiki.wireshark.org/USB&lt;br /&gt;
&lt;br /&gt;
我们先拿 &amp;lt;code&amp;gt;GitHub&amp;lt;/code&amp;gt; 上一个简单的例子开始讲起：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/example-usbpcap.png|example-usbpcap]]&lt;br /&gt;
&lt;br /&gt;
我们分析可以知道， &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 协议的数据部分在 &amp;lt;code&amp;gt;Leftover Capture Data&amp;lt;/code&amp;gt; 域之中，在 &amp;lt;code&amp;gt;Mac&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;Linux&amp;lt;/code&amp;gt; 下可以用 &amp;lt;code&amp;gt;tshark&amp;lt;/code&amp;gt; 命令可以将 &amp;lt;code&amp;gt;leftover capture data&amp;lt;/code&amp;gt; 单独提取出来，命令如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tshark -r example.pcap -T fields -e usb.capdata //如果想导入usbdata.txt文件中，后面加上参数：&amp;gt;usbdata.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;Windows&amp;lt;/code&amp;gt; 下装了 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 的环境下，在 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt;目录下有个 &amp;lt;code&amp;gt;tshark.exe&amp;lt;/code&amp;gt; ，比如我的在 &amp;lt;code&amp;gt;D:\Program Files\Wireshark\tshark.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/Windows-tshark.png|Windows-tshark]]&lt;br /&gt;
&lt;br /&gt;
调用 &amp;lt;code&amp;gt;cmd&amp;lt;/code&amp;gt; ，定位到当前目录下，输入如下命令即可：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;tshark.exe -r example.pcap -T fields -e usb.capdata //如果想导入usbdata.txt文件中，后面加上参数：&amp;amp;gt;usbdata.txt&amp;lt;/pre&amp;gt;&lt;br /&gt;
有关 &amp;lt;code&amp;gt;tshark&amp;lt;/code&amp;gt; 命令的详细使用参考 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 官方文档：https://www.wireshark.org/docs/man-pages/tshark.html&lt;br /&gt;
&lt;br /&gt;
运行命令并查看 &amp;lt;code&amp;gt;usbdata.txt&amp;lt;/code&amp;gt; 发现数据包长度为八个字节&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/usbdata.png|usbdata]]&lt;br /&gt;
&lt;br /&gt;
关于 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 的特点应用我找了一张图，很清楚的反应了这个问题：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/usb-feature.png|usb-feature]]&lt;br /&gt;
&lt;br /&gt;
这里我们只关注 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 流量中的键盘流量和鼠标流量。&lt;br /&gt;
&lt;br /&gt;
键盘数据包的数据长度为 &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; 个字节，击键信息集中在第 &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; 个字节，每次 &amp;lt;code&amp;gt;key stroke&amp;lt;/code&amp;gt; 都会产生一个 &amp;lt;code&amp;gt;keyboard event usb packet&amp;lt;/code&amp;gt; 。&lt;br /&gt;
&lt;br /&gt;
鼠标数据包的数据长度为 &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; 个字节，第一个字节代表按键，当取 &amp;lt;code&amp;gt;0x00&amp;lt;/code&amp;gt; 时，代表没有按键、为0x01时，代表按左键，为 &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt; 时，代表当前按键为右键。第二个字节可以看成是一个 &amp;lt;code&amp;gt;signed byte&amp;lt;/code&amp;gt; 类型，其最高位为符号位，当这个值为正时，代表鼠标水平右移多少像素，为负时，代表水平左移多少像素。第三个字节与第二字节类似，代表垂直上下移动的偏移。&lt;br /&gt;
&lt;br /&gt;
我翻阅了大量的 &amp;lt;code&amp;gt;USB&amp;lt;/code&amp;gt; 协议的文档，在这里我们可以找到这个值与具体键位的对应关系：https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;usb keyboard&amp;lt;/code&amp;gt; 的映射表 根据这个映射表将第三个字节取出来，对应对照表得到解码：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/keyboard_pro.png|keyboard_pro]]&lt;br /&gt;
&lt;br /&gt;
我们写出如下脚本：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;mappings = { 0x04:&amp;quot;A&amp;quot;,  0x05:&amp;quot;B&amp;quot;,  0x06:&amp;quot;C&amp;quot;, 0x07:&amp;quot;D&amp;quot;, 0x08:&amp;quot;E&amp;quot;, 0x09:&amp;quot;F&amp;quot;, 0x0A:&amp;quot;G&amp;quot;,  0x0B:&amp;quot;H&amp;quot;, 0x0C:&amp;quot;I&amp;quot;,  0x0D:&amp;quot;J&amp;quot;, 0x0E:&amp;quot;K&amp;quot;, 0x0F:&amp;quot;L&amp;quot;, 0x10:&amp;quot;M&amp;quot;, 0x11:&amp;quot;N&amp;quot;,0x12:&amp;quot;O&amp;quot;,  0x13:&amp;quot;P&amp;quot;, 0x14:&amp;quot;Q&amp;quot;, 0x15:&amp;quot;R&amp;quot;, 0x16:&amp;quot;S&amp;quot;, 0x17:&amp;quot;T&amp;quot;, 0x18:&amp;quot;U&amp;quot;,0x19:&amp;quot;V&amp;quot;, 0x1A:&amp;quot;W&amp;quot;, 0x1B:&amp;quot;X&amp;quot;, 0x1C:&amp;quot;Y&amp;quot;, 0x1D:&amp;quot;Z&amp;quot;, 0x1E:&amp;quot;1&amp;quot;, 0x1F:&amp;quot;2&amp;quot;, 0x20:&amp;quot;3&amp;quot;, 0x21:&amp;quot;4&amp;quot;, 0x22:&amp;quot;5&amp;quot;,  0x23:&amp;quot;6&amp;quot;, 0x24:&amp;quot;7&amp;quot;, 0x25:&amp;quot;8&amp;quot;, 0x26:&amp;quot;9&amp;quot;, 0x27:&amp;quot;0&amp;quot;, 0x28:&amp;quot;n&amp;quot;, 0x2a:&amp;quot;[DEL]&amp;quot;,  0X2B:&amp;quot;    &amp;quot;, 0x2C:&amp;quot; &amp;quot;,  0x2D:&amp;quot;-&amp;quot;, 0x2E:&amp;quot;=&amp;quot;, 0x2F:&amp;quot;[&amp;quot;,  0x30:&amp;quot;]&amp;quot;,  0x31:&amp;quot;\\&amp;quot;, 0x32:&amp;quot;~&amp;quot;, 0x33:&amp;quot;;&amp;quot;,  0x34:&amp;quot;&amp;#039;&amp;quot;, 0x36:&amp;quot;,&amp;quot;,  0x37:&amp;quot;.&amp;quot; }&lt;br /&gt;
nums = []&lt;br /&gt;
keys = open(&amp;#039;usbdata.txt&amp;#039;)&lt;br /&gt;
for line in keys:&lt;br /&gt;
    if line[0]!=&amp;#039;0&amp;#039; or line[1]!=&amp;#039;0&amp;#039; or line[3]!=&amp;#039;0&amp;#039; or line[4]!=&amp;#039;0&amp;#039; or line[9]!=&amp;#039;0&amp;#039; or line[10]!=&amp;#039;0&amp;#039; or line[12]!=&amp;#039;0&amp;#039; or line[13]!=&amp;#039;0&amp;#039; or line[15]!=&amp;#039;0&amp;#039; or line[16]!=&amp;#039;0&amp;#039; or line[18]!=&amp;#039;0&amp;#039; or line[19]!=&amp;#039;0&amp;#039; or line[21]!=&amp;#039;0&amp;#039; or line[22]!=&amp;#039;0&amp;#039;:&lt;br /&gt;
         continue&lt;br /&gt;
    nums.append(int(line[6:8],16))&lt;br /&gt;
    # 00:00:xx:....&lt;br /&gt;
keys.close()&lt;br /&gt;
output = &amp;quot;&amp;quot;&lt;br /&gt;
for n in nums:&lt;br /&gt;
    if n == 0 :&lt;br /&gt;
        continue&lt;br /&gt;
    if n in mappings:&lt;br /&gt;
        output += mappings[n]&lt;br /&gt;
    else:&lt;br /&gt;
        output += &amp;#039;[unknown]&amp;#039;&lt;br /&gt;
print(&amp;#039;output :n&amp;#039; + output)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
结果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/usb-solved.png|usb-solved]]&lt;br /&gt;
&lt;br /&gt;
我们把前面的整合成脚本，得：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
DataFileName = &amp;quot;usb.dat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
presses = []&lt;br /&gt;
&lt;br /&gt;
normalKeys = {&amp;quot;04&amp;quot;:&amp;quot;a&amp;quot;, &amp;quot;05&amp;quot;:&amp;quot;b&amp;quot;, &amp;quot;06&amp;quot;:&amp;quot;c&amp;quot;, &amp;quot;07&amp;quot;:&amp;quot;d&amp;quot;, &amp;quot;08&amp;quot;:&amp;quot;e&amp;quot;, &amp;quot;09&amp;quot;:&amp;quot;f&amp;quot;, &amp;quot;0a&amp;quot;:&amp;quot;g&amp;quot;, &amp;quot;0b&amp;quot;:&amp;quot;h&amp;quot;, &amp;quot;0c&amp;quot;:&amp;quot;i&amp;quot;, &amp;quot;0d&amp;quot;:&amp;quot;j&amp;quot;, &amp;quot;0e&amp;quot;:&amp;quot;k&amp;quot;, &amp;quot;0f&amp;quot;:&amp;quot;l&amp;quot;, &amp;quot;10&amp;quot;:&amp;quot;m&amp;quot;, &amp;quot;11&amp;quot;:&amp;quot;n&amp;quot;, &amp;quot;12&amp;quot;:&amp;quot;o&amp;quot;, &amp;quot;13&amp;quot;:&amp;quot;p&amp;quot;, &amp;quot;14&amp;quot;:&amp;quot;q&amp;quot;, &amp;quot;15&amp;quot;:&amp;quot;r&amp;quot;, &amp;quot;16&amp;quot;:&amp;quot;s&amp;quot;, &amp;quot;17&amp;quot;:&amp;quot;t&amp;quot;, &amp;quot;18&amp;quot;:&amp;quot;u&amp;quot;, &amp;quot;19&amp;quot;:&amp;quot;v&amp;quot;, &amp;quot;1a&amp;quot;:&amp;quot;w&amp;quot;, &amp;quot;1b&amp;quot;:&amp;quot;x&amp;quot;, &amp;quot;1c&amp;quot;:&amp;quot;y&amp;quot;, &amp;quot;1d&amp;quot;:&amp;quot;z&amp;quot;,&amp;quot;1e&amp;quot;:&amp;quot;1&amp;quot;, &amp;quot;1f&amp;quot;:&amp;quot;2&amp;quot;, &amp;quot;20&amp;quot;:&amp;quot;3&amp;quot;, &amp;quot;21&amp;quot;:&amp;quot;4&amp;quot;, &amp;quot;22&amp;quot;:&amp;quot;5&amp;quot;, &amp;quot;23&amp;quot;:&amp;quot;6&amp;quot;,&amp;quot;24&amp;quot;:&amp;quot;7&amp;quot;,&amp;quot;25&amp;quot;:&amp;quot;8&amp;quot;,&amp;quot;26&amp;quot;:&amp;quot;9&amp;quot;,&amp;quot;27&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;28&amp;quot;:&amp;quot;&amp;lt;RET&amp;gt;&amp;quot;,&amp;quot;29&amp;quot;:&amp;quot;&amp;lt;ESC&amp;gt;&amp;quot;,&amp;quot;2a&amp;quot;:&amp;quot;&amp;lt;DEL&amp;gt;&amp;quot;, &amp;quot;2b&amp;quot;:&amp;quot;\t&amp;quot;,&amp;quot;2c&amp;quot;:&amp;quot;&amp;lt;SPACE&amp;gt;&amp;quot;,&amp;quot;2d&amp;quot;:&amp;quot;-&amp;quot;,&amp;quot;2e&amp;quot;:&amp;quot;=&amp;quot;,&amp;quot;2f&amp;quot;:&amp;quot;[&amp;quot;,&amp;quot;30&amp;quot;:&amp;quot;]&amp;quot;,&amp;quot;31&amp;quot;:&amp;quot;\\&amp;quot;,&amp;quot;32&amp;quot;:&amp;quot;&amp;lt;NON&amp;gt;&amp;quot;,&amp;quot;33&amp;quot;:&amp;quot;;&amp;quot;,&amp;quot;34&amp;quot;:&amp;quot;&amp;#039;&amp;quot;,&amp;quot;35&amp;quot;:&amp;quot;&amp;lt;GA&amp;gt;&amp;quot;,&amp;quot;36&amp;quot;:&amp;quot;,&amp;quot;,&amp;quot;37&amp;quot;:&amp;quot;.&amp;quot;,&amp;quot;38&amp;quot;:&amp;quot;/&amp;quot;,&amp;quot;39&amp;quot;:&amp;quot;&amp;lt;CAP&amp;gt;&amp;quot;,&amp;quot;3a&amp;quot;:&amp;quot;&amp;lt;F1&amp;gt;&amp;quot;,&amp;quot;3b&amp;quot;:&amp;quot;&amp;lt;F2&amp;gt;&amp;quot;, &amp;quot;3c&amp;quot;:&amp;quot;&amp;lt;F3&amp;gt;&amp;quot;,&amp;quot;3d&amp;quot;:&amp;quot;&amp;lt;F4&amp;gt;&amp;quot;,&amp;quot;3e&amp;quot;:&amp;quot;&amp;lt;F5&amp;gt;&amp;quot;,&amp;quot;3f&amp;quot;:&amp;quot;&amp;lt;F6&amp;gt;&amp;quot;,&amp;quot;40&amp;quot;:&amp;quot;&amp;lt;F7&amp;gt;&amp;quot;,&amp;quot;41&amp;quot;:&amp;quot;&amp;lt;F8&amp;gt;&amp;quot;,&amp;quot;42&amp;quot;:&amp;quot;&amp;lt;F9&amp;gt;&amp;quot;,&amp;quot;43&amp;quot;:&amp;quot;&amp;lt;F10&amp;gt;&amp;quot;,&amp;quot;44&amp;quot;:&amp;quot;&amp;lt;F11&amp;gt;&amp;quot;,&amp;quot;45&amp;quot;:&amp;quot;&amp;lt;F12&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
shiftKeys = {&amp;quot;04&amp;quot;:&amp;quot;A&amp;quot;, &amp;quot;05&amp;quot;:&amp;quot;B&amp;quot;, &amp;quot;06&amp;quot;:&amp;quot;C&amp;quot;, &amp;quot;07&amp;quot;:&amp;quot;D&amp;quot;, &amp;quot;08&amp;quot;:&amp;quot;E&amp;quot;, &amp;quot;09&amp;quot;:&amp;quot;F&amp;quot;, &amp;quot;0a&amp;quot;:&amp;quot;G&amp;quot;, &amp;quot;0b&amp;quot;:&amp;quot;H&amp;quot;, &amp;quot;0c&amp;quot;:&amp;quot;I&amp;quot;, &amp;quot;0d&amp;quot;:&amp;quot;J&amp;quot;, &amp;quot;0e&amp;quot;:&amp;quot;K&amp;quot;, &amp;quot;0f&amp;quot;:&amp;quot;L&amp;quot;, &amp;quot;10&amp;quot;:&amp;quot;M&amp;quot;, &amp;quot;11&amp;quot;:&amp;quot;N&amp;quot;, &amp;quot;12&amp;quot;:&amp;quot;O&amp;quot;, &amp;quot;13&amp;quot;:&amp;quot;P&amp;quot;, &amp;quot;14&amp;quot;:&amp;quot;Q&amp;quot;, &amp;quot;15&amp;quot;:&amp;quot;R&amp;quot;, &amp;quot;16&amp;quot;:&amp;quot;S&amp;quot;, &amp;quot;17&amp;quot;:&amp;quot;T&amp;quot;, &amp;quot;18&amp;quot;:&amp;quot;U&amp;quot;, &amp;quot;19&amp;quot;:&amp;quot;V&amp;quot;, &amp;quot;1a&amp;quot;:&amp;quot;W&amp;quot;, &amp;quot;1b&amp;quot;:&amp;quot;X&amp;quot;, &amp;quot;1c&amp;quot;:&amp;quot;Y&amp;quot;, &amp;quot;1d&amp;quot;:&amp;quot;Z&amp;quot;,&amp;quot;1e&amp;quot;:&amp;quot;!&amp;quot;, &amp;quot;1f&amp;quot;:&amp;quot;@&amp;quot;, &amp;quot;20&amp;quot;:&amp;quot;#&amp;quot;, &amp;quot;21&amp;quot;:&amp;quot;$&amp;quot;, &amp;quot;22&amp;quot;:&amp;quot;%&amp;quot;, &amp;quot;23&amp;quot;:&amp;quot;^&amp;quot;,&amp;quot;24&amp;quot;:&amp;quot;&amp;amp;&amp;quot;,&amp;quot;25&amp;quot;:&amp;quot;*&amp;quot;,&amp;quot;26&amp;quot;:&amp;quot;(&amp;quot;,&amp;quot;27&amp;quot;:&amp;quot;)&amp;quot;,&amp;quot;28&amp;quot;:&amp;quot;&amp;lt;RET&amp;gt;&amp;quot;,&amp;quot;29&amp;quot;:&amp;quot;&amp;lt;ESC&amp;gt;&amp;quot;,&amp;quot;2a&amp;quot;:&amp;quot;&amp;lt;DEL&amp;gt;&amp;quot;, &amp;quot;2b&amp;quot;:&amp;quot;\t&amp;quot;,&amp;quot;2c&amp;quot;:&amp;quot;&amp;lt;SPACE&amp;gt;&amp;quot;,&amp;quot;2d&amp;quot;:&amp;quot;_&amp;quot;,&amp;quot;2e&amp;quot;:&amp;quot;+&amp;quot;,&amp;quot;2f&amp;quot;:&amp;quot;{&amp;quot;,&amp;quot;30&amp;quot;:&amp;quot;}&amp;quot;,&amp;quot;31&amp;quot;:&amp;quot;|&amp;quot;,&amp;quot;32&amp;quot;:&amp;quot;&amp;lt;NON&amp;gt;&amp;quot;,&amp;quot;33&amp;quot;:&amp;quot;\&amp;quot;&amp;quot;,&amp;quot;34&amp;quot;:&amp;quot;:&amp;quot;,&amp;quot;35&amp;quot;:&amp;quot;&amp;lt;GA&amp;gt;&amp;quot;,&amp;quot;36&amp;quot;:&amp;quot;&amp;lt;&amp;quot;,&amp;quot;37&amp;quot;:&amp;quot;&amp;gt;&amp;quot;,&amp;quot;38&amp;quot;:&amp;quot;?&amp;quot;,&amp;quot;39&amp;quot;:&amp;quot;&amp;lt;CAP&amp;gt;&amp;quot;,&amp;quot;3a&amp;quot;:&amp;quot;&amp;lt;F1&amp;gt;&amp;quot;,&amp;quot;3b&amp;quot;:&amp;quot;&amp;lt;F2&amp;gt;&amp;quot;, &amp;quot;3c&amp;quot;:&amp;quot;&amp;lt;F3&amp;gt;&amp;quot;,&amp;quot;3d&amp;quot;:&amp;quot;&amp;lt;F4&amp;gt;&amp;quot;,&amp;quot;3e&amp;quot;:&amp;quot;&amp;lt;F5&amp;gt;&amp;quot;,&amp;quot;3f&amp;quot;:&amp;quot;&amp;lt;F6&amp;gt;&amp;quot;,&amp;quot;40&amp;quot;:&amp;quot;&amp;lt;F7&amp;gt;&amp;quot;,&amp;quot;41&amp;quot;:&amp;quot;&amp;lt;F8&amp;gt;&amp;quot;,&amp;quot;42&amp;quot;:&amp;quot;&amp;lt;F9&amp;gt;&amp;quot;,&amp;quot;43&amp;quot;:&amp;quot;&amp;lt;F10&amp;gt;&amp;quot;,&amp;quot;44&amp;quot;:&amp;quot;&amp;lt;F11&amp;gt;&amp;quot;,&amp;quot;45&amp;quot;:&amp;quot;&amp;lt;F12&amp;gt;&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # check argv&lt;br /&gt;
    if len(sys.argv) != 2:&lt;br /&gt;
        print &amp;quot;Usage : &amp;quot;&lt;br /&gt;
        print &amp;quot;        python UsbKeyboardHacker.py data.pcap&amp;quot;&lt;br /&gt;
        print &amp;quot;Tips : &amp;quot;&lt;br /&gt;
        print &amp;quot;        To use this python script , you must install the tshark first.&amp;quot;&lt;br /&gt;
        print &amp;quot;        You can use `sudo apt-get install tshark` to install it&amp;quot;&lt;br /&gt;
        print &amp;quot;        Thank you for using.&amp;quot;&lt;br /&gt;
        exit(1)&lt;br /&gt;
&lt;br /&gt;
    # get argv&lt;br /&gt;
    pcapFilePath = sys.argv[1]&lt;br /&gt;
    &lt;br /&gt;
    # get data of pcap&lt;br /&gt;
    os.system(&amp;quot;tshark -r %s -T fields -e usb.capdata &amp;gt; %s&amp;quot; % (pcapFilePath, DataFileName))&lt;br /&gt;
&lt;br /&gt;
    # read data&lt;br /&gt;
    with open(DataFileName, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        for line in f:&lt;br /&gt;
            presses.append(line[0:-1])&lt;br /&gt;
    # handle&lt;br /&gt;
    result = &amp;quot;&amp;quot;&lt;br /&gt;
    for press in presses:&lt;br /&gt;
        Bytes = press.split(&amp;quot;:&amp;quot;)&lt;br /&gt;
        if Bytes[0] == &amp;quot;00&amp;quot;:&lt;br /&gt;
            if Bytes[2] != &amp;quot;00&amp;quot;:&lt;br /&gt;
                result += normalKeys[Bytes[2]]&lt;br /&gt;
        elif Bytes[0] == &amp;quot;20&amp;quot;: # shift key is pressed.&lt;br /&gt;
            if Bytes[2] != &amp;quot;00&amp;quot;:&lt;br /&gt;
                result += shiftKeys[Bytes[2]]&lt;br /&gt;
        else:&lt;br /&gt;
            print &amp;quot;[-] Unknow Key : %s&amp;quot; % (Bytes[0])&lt;br /&gt;
    print &amp;quot;[+] Found : %s&amp;quot; % (result)&lt;br /&gt;
&lt;br /&gt;
    # clean the temp data&lt;br /&gt;
    os.system(&amp;quot;rm ./%s&amp;quot; % (DataFileName))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
效果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/example-solved.png|example-solved]]&lt;br /&gt;
&lt;br /&gt;
另外贴上一份鼠标流量数据包转换脚本：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;nums = [] &lt;br /&gt;
keys = open(&amp;#039;usbdata.txt&amp;#039;,&amp;#039;r&amp;#039;) &lt;br /&gt;
posx = 0 &lt;br /&gt;
posy = 0 &lt;br /&gt;
for line in keys: &lt;br /&gt;
if len(line) != 12 : &lt;br /&gt;
     continue &lt;br /&gt;
x = int(line[3:5],16) &lt;br /&gt;
y = int(line[6:8],16) &lt;br /&gt;
if x &amp;gt; 127 : &lt;br /&gt;
    x -= 256 &lt;br /&gt;
if y &amp;gt; 127 : &lt;br /&gt;
    y -= 256 &lt;br /&gt;
posx += x &lt;br /&gt;
posy += y &lt;br /&gt;
btn_flag = int(line[0:2],16)  # 1 for left , 2 for right , 0 for nothing &lt;br /&gt;
if btn_flag == 1 : &lt;br /&gt;
    print posx , posy &lt;br /&gt;
keys.close()&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
键盘流量数据包转换脚本如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;nums=[0x66,0x30,0x39,0x65,0x35,0x34,0x63,0x31,0x62,0x61,0x64,0x32,0x78,0x33,0x38,0x6d,0x76,0x79,0x67,0x37,0x77,0x7a,0x6c,0x73,0x75,0x68,0x6b,0x69,0x6a,0x6e,0x6f,0x70]&lt;br /&gt;
s=&amp;#039;&amp;#039;&lt;br /&gt;
for x in nums:&lt;br /&gt;
    s+=chr(x)&lt;br /&gt;
print s&lt;br /&gt;
mappings = { 0x41:&amp;quot;A&amp;quot;,  0x42:&amp;quot;B&amp;quot;,  0x43:&amp;quot;C&amp;quot;, 0x44:&amp;quot;D&amp;quot;, 0x45:&amp;quot;E&amp;quot;, 0x46:&amp;quot;F&amp;quot;, 0x47:&amp;quot;G&amp;quot;,  0x48:&amp;quot;H&amp;quot;, 0x49:&amp;quot;I&amp;quot;,  0x4a:&amp;quot;J&amp;quot;, 0x4b:&amp;quot;K&amp;quot;, 0x4c:&amp;quot;L&amp;quot;, 0x4d:&amp;quot;M&amp;quot;, 0x4e:&amp;quot;N&amp;quot;,0x4f:&amp;quot;O&amp;quot;,  0x50:&amp;quot;P&amp;quot;, 0x51:&amp;quot;Q&amp;quot;, 0x52:&amp;quot;R&amp;quot;, 0x53:&amp;quot;S&amp;quot;, 0x54:&amp;quot;T&amp;quot;, 0x55:&amp;quot;U&amp;quot;,0x56:&amp;quot;V&amp;quot;, 0x57:&amp;quot;W&amp;quot;, 0x58:&amp;quot;X&amp;quot;, 0x59:&amp;quot;Y&amp;quot;, 0x5a:&amp;quot;Z&amp;quot;, 0x60:&amp;quot;0&amp;quot;, 0x61:&amp;quot;1&amp;quot;, 0x62:&amp;quot;2&amp;quot;, 0x63:&amp;quot;3&amp;quot;, 0x64:&amp;quot;4&amp;quot;,  0x65:&amp;quot;5&amp;quot;, 0x66:&amp;quot;6&amp;quot;, 0x67:&amp;quot;7&amp;quot;, 0x68:&amp;quot;8&amp;quot;, 0x69:&amp;quot;9&amp;quot;, 0x6a:&amp;quot;*&amp;quot;, 0x6b:&amp;quot;+&amp;quot;,  0X6c:&amp;quot;separator&amp;quot;, 0x6d:&amp;quot;-&amp;quot;,  0x6e:&amp;quot;.&amp;quot;, 0x6f:&amp;quot;/&amp;quot; }&lt;br /&gt;
output = &amp;quot;&amp;quot;&lt;br /&gt;
for n in nums:&lt;br /&gt;
    if n == 0 :&lt;br /&gt;
        continue&lt;br /&gt;
    if n in mappings:&lt;br /&gt;
        output += mappings[n]&lt;br /&gt;
    else:&lt;br /&gt;
        output += &amp;#039;[unknown]&amp;#039;&lt;br /&gt;
print &amp;#039;output :\n&amp;#039; + output&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
那么对于 &amp;lt;code&amp;gt;xman&amp;lt;/code&amp;gt; 三期夏令营排位赛的这道题，我们可以模仿尝试如上这个例子：&lt;br /&gt;
&lt;br /&gt;
首先我们通过 &amp;lt;code&amp;gt;tshark&amp;lt;/code&amp;gt; 将 &amp;lt;code&amp;gt;usb.capdata&amp;lt;/code&amp;gt; 全部导出：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;tshark -r task_AutoKey.pcapng -T fields -e usb.capdata //如果想导入usbdata.txt文件中，后面加上参数：&amp;gt;usbdata.txt&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
结果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/tshark-task_AutoKey.png|tshark-task_AutoKey]]&lt;br /&gt;
&lt;br /&gt;
我们用上面的 &amp;lt;code&amp;gt;python&amp;lt;/code&amp;gt; 脚本将第三个字节取出来，对应对照表得到解码：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;mappings = { 0x04:&amp;quot;A&amp;quot;,  0x05:&amp;quot;B&amp;quot;,  0x06:&amp;quot;C&amp;quot;, 0x07:&amp;quot;D&amp;quot;, 0x08:&amp;quot;E&amp;quot;, 0x09:&amp;quot;F&amp;quot;, 0x0A:&amp;quot;G&amp;quot;,  0x0B:&amp;quot;H&amp;quot;, 0x0C:&amp;quot;I&amp;quot;,  0x0D:&amp;quot;J&amp;quot;, 0x0E:&amp;quot;K&amp;quot;, 0x0F:&amp;quot;L&amp;quot;, 0x10:&amp;quot;M&amp;quot;, 0x11:&amp;quot;N&amp;quot;,0x12:&amp;quot;O&amp;quot;,  0x13:&amp;quot;P&amp;quot;, 0x14:&amp;quot;Q&amp;quot;, 0x15:&amp;quot;R&amp;quot;, 0x16:&amp;quot;S&amp;quot;, 0x17:&amp;quot;T&amp;quot;, 0x18:&amp;quot;U&amp;quot;,0x19:&amp;quot;V&amp;quot;, 0x1A:&amp;quot;W&amp;quot;, 0x1B:&amp;quot;X&amp;quot;, 0x1C:&amp;quot;Y&amp;quot;, 0x1D:&amp;quot;Z&amp;quot;, 0x1E:&amp;quot;1&amp;quot;, 0x1F:&amp;quot;2&amp;quot;, 0x20:&amp;quot;3&amp;quot;, 0x21:&amp;quot;4&amp;quot;, 0x22:&amp;quot;5&amp;quot;,  0x23:&amp;quot;6&amp;quot;, 0x24:&amp;quot;7&amp;quot;, 0x25:&amp;quot;8&amp;quot;, 0x26:&amp;quot;9&amp;quot;, 0x27:&amp;quot;0&amp;quot;, 0x28:&amp;quot;n&amp;quot;, 0x2a:&amp;quot;[DEL]&amp;quot;,  0X2B:&amp;quot;    &amp;quot;, 0x2C:&amp;quot; &amp;quot;,  0x2D:&amp;quot;-&amp;quot;, 0x2E:&amp;quot;=&amp;quot;, 0x2F:&amp;quot;[&amp;quot;,  0x30:&amp;quot;]&amp;quot;,  0x31:&amp;quot;\\&amp;quot;, 0x32:&amp;quot;~&amp;quot;, 0x33:&amp;quot;;&amp;quot;,  0x34:&amp;quot;&amp;#039;&amp;quot;, 0x36:&amp;quot;,&amp;quot;,  0x37:&amp;quot;.&amp;quot; }&lt;br /&gt;
nums = []&lt;br /&gt;
keys = open(&amp;#039;usbdata.txt&amp;#039;)&lt;br /&gt;
for line in keys:&lt;br /&gt;
    if line[0]!=&amp;#039;0&amp;#039; or line[1]!=&amp;#039;0&amp;#039; or line[3]!=&amp;#039;0&amp;#039; or line[4]!=&amp;#039;0&amp;#039; or line[9]!=&amp;#039;0&amp;#039; or line[10]!=&amp;#039;0&amp;#039; or line[12]!=&amp;#039;0&amp;#039; or line[13]!=&amp;#039;0&amp;#039; or line[15]!=&amp;#039;0&amp;#039; or line[16]!=&amp;#039;0&amp;#039; or line[18]!=&amp;#039;0&amp;#039; or line[19]!=&amp;#039;0&amp;#039; or line[21]!=&amp;#039;0&amp;#039; or line[22]!=&amp;#039;0&amp;#039;:&lt;br /&gt;
         continue&lt;br /&gt;
    nums.append(int(line[6:8],16))&lt;br /&gt;
    # 00:00:xx:....&lt;br /&gt;
keys.close()&lt;br /&gt;
output = &amp;quot;&amp;quot;&lt;br /&gt;
for n in nums:&lt;br /&gt;
    if n == 0 :&lt;br /&gt;
        continue&lt;br /&gt;
    if n in mappings:&lt;br /&gt;
        output += mappings[n]&lt;br /&gt;
    else:&lt;br /&gt;
        output += &amp;#039;[unknown]&amp;#039;&lt;br /&gt;
print(&amp;#039;output :n&amp;#039; + output)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
运行结果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/task_AutoKey-solved.png|task_AutoKey-solved]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;output :n[unknown]A[unknown]UTOKEY&amp;#039;&amp;#039;.DECIPHER&amp;#039;[unknown]MPLRVFFCZEYOUJFJKYBXGZVDGQAURKXZOLKOLVTUFBLRNJESQITWAHXNSIJXPNMPLSHCJBTYHZEALOGVIAAISSPLFHLFSWFEHJNCRWHTINSMAMBVEXO[DEL]PZE[DEL]IZ&amp;#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
我们可以看出这是自动密匙解码，现在的问题是在我们不知道密钥的情况下应该如何解码呢？&lt;br /&gt;
&lt;br /&gt;
我找到了如下这篇关于如何爆破密匙：http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-autokey-cipher/&lt;br /&gt;
&lt;br /&gt;
爆破脚本如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;from ngram_score import ngram_score&lt;br /&gt;
from pycipher import Autokey&lt;br /&gt;
import re&lt;br /&gt;
from itertools import permutations&lt;br /&gt;
&lt;br /&gt;
qgram = ngram_score(&amp;#039;quadgrams.txt&amp;#039;)&lt;br /&gt;
trigram = ngram_score(&amp;#039;trigrams.txt&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
ctext = &amp;#039;MPLRVFFCZEYOUJFJKYBXGZVDGQAURKXZOLKOLVTUFBLRNJESQITWAHXNSIJXPNMPLSHCJBTYHZEALOGVIAAISSPLFHLFSWFEHJNCRWHTINSMAMBVEXPZIZ&amp;#039;&lt;br /&gt;
&lt;br /&gt;
ctext = re.sub(r&amp;#039;[^A-Z]&amp;#039;,&amp;#039;&amp;#039;,ctext.upper())&lt;br /&gt;
# keep a list of the N best things we have seen, discard anything else&lt;br /&gt;
&lt;br /&gt;
class nbest(object):&lt;br /&gt;
    def __init__(self,N=1000):&lt;br /&gt;
        self.store = []&lt;br /&gt;
        self.N = N&lt;br /&gt;
&lt;br /&gt;
    def add(self,item):&lt;br /&gt;
        self.store.append(item)&lt;br /&gt;
        self.store.sort(reverse=True)&lt;br /&gt;
        self.store = self.store[:self.N]&lt;br /&gt;
&lt;br /&gt;
    def __getitem__(self,k):&lt;br /&gt;
        return self.store[k]&lt;br /&gt;
&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return len(self.store)&lt;br /&gt;
        &lt;br /&gt;
#init&lt;br /&gt;
N=100&lt;br /&gt;
for KLEN in range(3,20):&lt;br /&gt;
    rec = nbest(N)&lt;br /&gt;
    for i in permutations(&amp;#039;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#039;,3):&lt;br /&gt;
        key = &amp;#039;&amp;#039;.join(i) + &amp;#039;A&amp;#039;*(KLEN-len(i))&lt;br /&gt;
        pt = Autokey(key).decipher(ctext)&lt;br /&gt;
        score = 0&lt;br /&gt;
        for j in range(0,len(ctext),KLEN):&lt;br /&gt;
            score += trigram.score(pt[j:j+3])&lt;br /&gt;
        rec.add((score,&amp;#039;&amp;#039;.join(i),pt[:30]))&lt;br /&gt;
&lt;br /&gt;
    next_rec = nbest(N)&lt;br /&gt;
    for i in range(0,KLEN-3):&lt;br /&gt;
        for k in xrange(N):&lt;br /&gt;
            for c in &amp;#039;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#039;:&lt;br /&gt;
                key = rec[k][1] + c&lt;br /&gt;
                fullkey = key + &amp;#039;A&amp;#039;*(KLEN-len(key))&lt;br /&gt;
                pt = Autokey(fullkey).decipher(ctext)&lt;br /&gt;
                score = 0&lt;br /&gt;
                for j in range(0,len(ctext),KLEN):&lt;br /&gt;
                    score += qgram.score(pt[j:j+len(key)])&lt;br /&gt;
                next_rec.add((score,key,pt[:30]))&lt;br /&gt;
        rec = next_rec&lt;br /&gt;
        next_rec = nbest(N)&lt;br /&gt;
    bestkey = rec[0][1]&lt;br /&gt;
    pt = Autokey(bestkey).decipher(ctext)&lt;br /&gt;
    bestscore = qgram.score(pt)&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        pt = Autokey(rec[i][1]).decipher(ctext)&lt;br /&gt;
        score = qgram.score(pt)&lt;br /&gt;
        if score &amp;gt; bestscore:&lt;br /&gt;
            bestkey = rec[i][1]&lt;br /&gt;
            bestscore = score       &lt;br /&gt;
    print bestscore,&amp;#039;autokey, klen&amp;#039;,KLEN,&amp;#039;:&amp;quot;&amp;#039;+bestkey+&amp;#039;&amp;quot;,&amp;#039;,Autokey(bestkey).decipher(ctext)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
跑出来的结果如下：&lt;br /&gt;
&lt;br /&gt;
[[File:./figure/usbpwn.png|usbpwn]]&lt;br /&gt;
&lt;br /&gt;
我们看到了 &amp;lt;code&amp;gt;flag&amp;lt;/code&amp;gt; 的字样，整理可得如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;-674.914569565 autokey, klen 8 :&amp;quot;FLAGHERE&amp;quot;, HELLOBOYSANDGIRLSYOUARESOSMARTTHATYOUCANFINDTHEFLAGTHATIHIDEINTHEKEYBOARDPACKAGEFLAGISJHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
我们把字段进行分割看：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;HELLO&lt;br /&gt;
BOYS&lt;br /&gt;
AND&lt;br /&gt;
GIRLS&lt;br /&gt;
YOU&lt;br /&gt;
ARE&lt;br /&gt;
SO&lt;br /&gt;
SMART&lt;br /&gt;
THAT&lt;br /&gt;
YOU&lt;br /&gt;
CAN&lt;br /&gt;
FIND&lt;br /&gt;
THE&lt;br /&gt;
FLAG&lt;br /&gt;
THAT&lt;br /&gt;
IH&lt;br /&gt;
IDE&lt;br /&gt;
IN&lt;br /&gt;
THE&lt;br /&gt;
KEY&lt;br /&gt;
BOARD&lt;br /&gt;
PACKAGE&lt;br /&gt;
FLAG&lt;br /&gt;
IS&lt;br /&gt;
JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
最后的 &amp;lt;code&amp;gt;flag&amp;lt;/code&amp;gt; 就是 &amp;lt;code&amp;gt;flag{JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参考文献 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.cnblogs.com/ECJTUACM-873284962/p/9473808.html&lt;br /&gt;
* https://blog.csdn.net/songze_lee/article/details/77658094&lt;br /&gt;
* https://wiki.wireshark.org/USB&lt;br /&gt;
* https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf&lt;br /&gt;
* https://www.wireshark.org/docs/man-pages/tshark.html&lt;br /&gt;
* http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-autokey-cipher/&lt;br /&gt;
* https://hackfun.org/2017/02/22/CTF%E4%B8%AD%E9%82%A3%E4%BA%9B%E8%84%91%E6%B4%9E%E5%A4%A7%E5%BC%80%E7%9A%84%E7%BC%96%E7%A0%81%E5%92%8C%E5%8A%A0%E5%AF%86/&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>