首页/新闻资讯/正文详情

CTF流量分析实战:USB键盘与鼠标流量提取与还原

发布时间:2026/9/25 6:25:25 来源:云帆数科 栏目:资讯中心
CTF流量分析实战:USB键盘与鼠标流量提取与还原
CTF流量分析做了几年USB这个方向真的是“老面孔”了。从入门赛到省级决赛USB流量题几乎成了标配尤其是键盘流量几乎人手一把梭。但是很多人卡在不知道USB流量到底在说什么、键盘映射怎么处理、鼠标坐标怎么还原更别提遇到数据丢包、HID设备混杂的资产包。这篇内容我结合自己实际做题和出题的经验把USB流量从原理到实操捋一遍不讲空理论全部是可复现的命令和脚本希望能帮到正在啃流量分析的朋友。1. 先说清楚USB流量分析到底在分析什么1.1 USB协议里我们真正关心的层USB协议本身是一套非常复杂的传输体系分为物理层、总线层、传输层、协议层等等。但CTF赛题里我们真正拿到的通常是一个pcap或pcapng文件里面装着的是USB总线上的通信记录用Wireshark打开后能看到URBUSB Request Block结构。CTF题目一般不会让你分析USB的控制传输、批量传输、同步传输那些底层业务绝大多数情况下我们面对的就是USB HIDHuman Interface Device类设备的数据。HID类设备最常见的三类是键盘、鼠标和触摸板/游戏手柄它们通过中断传输方式周期性上报数据。这类数据的特征是每个传输对应一个固定长度比如键盘是8字节鼠标是4字节或6字节数据内容就是设备的输入状态。从pcap里提取USB HID数据通俗地说就是把那些中断传输的URB信息里的“数据内容”抽出来然后按设备协议解码成按键、坐标、按键值、手柄摇杆值等。CTF中USB流量分析题大部分答案就在这些解码后的内容里。1.2 为什么USB流量题“既可以送分也可以防AK”USB流量题在Misc里算是一个稳定输出点但选项集约分明显。送分版只是键盘流量按固定映射表还原字符串复杂版则会加干扰比如同一个pcap里混合了键盘和鼠标流量需要按端点区分设备。多个键盘设备同时上报需要定位目标设备的地址。出现了调制机制比如键盘在普通键值上叠加了控制键Shift、Ctrl等必须考虑修饰键对大小写和符号的影响。USB包数据存在丢包中间缺少几个字节直接拼接会错位。设备上报的其实不是单字符而是扫描码有些键盘扫描码在不同标准USB HID Usage Table vs PS/2 Set 2下含义不同。不只是键盘也可能是鼠标映射成绘图轨迹、U盘读取文件内容、甚至HID伪造设备读取数据。在这些干扰下如果只会“键盘流量一把梭”脚本稍微变换一下题目形式就废了。所以理解底层协议和提取方法比死记脚本更重要。2. 一步一步拆解USB协议从抓包到HID事件2.1 认识pcap里的USB数据包结构在Wireshark中开启一个USB pcap你会看到类似usb.urb_type、usb.transfer_type、usb.device_address、usb.endpoint_address这些字段。以一个键盘输入包为例最关键的字段有usb.record_length记录长度一般8字节。usb.data_present是否包含数据。usb.data_length数据长度。usb.endpoint_address端点地址用于区分IN/OUT方向。usb.device_address设备地址用于区分不同USB设备。usb.transfer_type传输类型HID中断传输类型一般是0x02。在Wireshark中USB协议的解析结果里能看到“Leftover Capture Data”字段那个就是URB数据内容也就是我们需要的关键字节。如果是8字节键盘数据格式通常是Byte 0: 修饰键 Byte 1: 保留位 Byte 2~7: 当前按下的按键最多6个按键的扫描码修饰键的位含义如下0x00表示无修饰键0x01左Ctrl0x02左Shift0x04左Alt0x08左GUIWin/Cmd0x10右Ctrl0x20右Shift0x40右Alt0x80右GUI通常我们只关心第0字节和第2~7字节第1字节在标准协议里固定为0。鼠标数据的常见格式是4字节Byte 0: 按键状态bit0左键、bit1右键、bit2中键 Byte 1: X位移有符号 Byte 2: Y位移有符号 Byte 3: 滚轮位移也有6字节的鼠标报告多出来的是额外的坐标字段但CTF里最常见的是4字节。2.2 用Wireshark过滤器快速定位HID传输不是所有URB都是我们要的建议先用显示过滤器筛出中断传输入方向设备→主机的数据同时排除掉系统无意义的URBusb.transfer_type 0x02 usb.endpoint_address 0x81 usb.data_present 1端点0x81一般默认是HID设备的IN端点。如果设备有多个端点可以先用统计查看所有端点在Wireshark中统计 - 端点可以查看USB设备地址和端点分布或者使用tshark直接列出tshark -r usb.pcap -Y usb.transfer_type 0x02 usb.data_present 1 -T fields -e usb.device_address -e usb.endpoint_address -e usb.data_len这样你能看到有哪些设备在发送中断数据以及每种数据包的长度。键盘数据一般是8字节鼠标一般是4字节如果看到长度不规律可能是其他HID设备或混合流量。2.3 URB里的数据不等于“报文”这一步我见到很多人踩坑。Wireshark抓到的USB数据里除了我们关心的HID报告report还可能出现URB围绕的setup包、status包、间隔符等。很多CTF搬运工直接用tshark的-T fields -e usb.capdata提取usb.capdata这个字段其实是由Wireshark解析后的“USB数据”它已经去掉了URB头部剩下的才是HID报告数据。用tshark提取鼠标和键盘数据的常用命令如下tshark -r usb.pcap -Y usb.capdata usb.transfer_type 0x02 usb.endpoint_address 0x81 -T fields -e usb.capdata注意usb.capdata是一个可选字段只有Wireshark能识别出设备时才会显示。如果提不出来可以用-e usb.data.data或者提取data.data字段但那样会带上更多嵌套数据需要手动处理。我习惯先看usb.capdata不行再降级处理原始数据。3. 键盘流量基础映射与数据还原3.1 按键码与字母的映射表USB HID规范定义了一套Usage ID每个数字对应一个键位。CTF里常见的字母、数字、标点映射关系如下十进制表示Usage IDa-z0x04~0x1D1-90x1E~0x260是0x27回车0x28空格0x2C逗号0x36句点0x37斜杠0x38分号0x33引号0x34左方括号0x2F右方括号0x30反斜杠0x31减号/下划线0x2D等号/加号0x2E上标/波浪号0x35Tab0x2B退格0x2A删除0x4CHome0x4AEnd0x4D左右方向键0x50/0x51/0x52/0x4F实际做题时最常用到的是全部HID Usage ID到ASCII的映射表。我建议整理一份完整的表而不是零散记忆。网络上有很多开源键盘映射表比如usb_hid_keys.h可以转成Python字典。以下是经典的映射逻辑没有Shift修饰键时按下0x1E输出数字“1”按下Shift修饰键时同样0x1E输出字符“!”。有Shift时数字与符号切换1 - !2 - 3 - #4 - $5 - %6 - ^7 - 8 - *9 - (0 - )字母键按下Shift时切换大小写。符号键也会切换成上档符号比如分号键0x33在普通模式输出;在Shift模式下输出:。3.2 用Python还原键盘输入流程拿到一组键盘URB数据后第一步是解析每个包的修饰键和按键码然后按时间顺序拼接。先提一个最常见的还原思路每个包中如果第2~7字节里有值就代表这一时刻有键按着或按住当按键释放时这些字节会变成0。美中不足的是USB HID只报告当前时刻被按下的键不直接区分“按下”和“释放”所以我们需要通过状态变化推导。实际CTF过程里大多数USB键盘流量还原都是看“出现非0值”的包将其中的键位输出不考虑重复按住的延迟。比如一串连续的00 00 1E 00 00 00 00 00 00 00 1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 00 00 00 00 17 00 00 00 00 00那么看到0x1E就输出 “1”然后重复的0x1E在上一键释放后再次按下按一次算一次或者只算一次接着0x17输出“t”。一般题目作者会用自动输入方式生成流量每个字符的按下和释放之间都有间隔所以“每个非零包输出一次字符”基本是可行的。更稳妥的做法是记录状态变化当按键从无到有时输出对应字符当同一时刻有多个键被按下时全部输出。下面是我常用的基础还原脚本框架from capstone import * # 这里不需要 import usb.core # 也不是必须 # 实际直接读取tshark输出的字符串列表即可 hid_map { 0x04: a, 0x05: b, 0x06: c, 0x07: d, # ... 完整映射略 0x1E: 1, 0x1F: 2, 0x20: 3, 0x21: 4, # ... } SHIFT_MAP { 1: !, 2: , 3: #, 4: $, 5: %, 6: ^, 7: , 8: *, 9: (, 0: ), -: _, : , [: {, ]: }, \\: |, ;: :, \: , ,: , .: , /: ?, : ~, } def parse_capdata(capdata_str): # capdata_str 形如 00:00:1e:00:00:00:00:00 data bytes.fromhex(capdata_str.replace(:, )) mod data[0] keys data[2:] return mod, keys lines open(capdata.txt).read().strip().splitlines() result last_keys set() for line in lines: mod, keys parse_capdata(line) pressed set(k for k in keys if k ! 0) for k in pressed: if k in hid_map: ch hid_map[k] if mod 0x02 or mod 0x20: # 左右Shift ch SHIFT_MAP.get(ch, ch.upper()) result ch print(result)实际使用中我发现这个框架有一个问题同一个按键按住不动USB会不断刷出相同的非零数据在还原时如果每个包都输出字符会导致一个字符重复很多次。正常键盘输入发布时间很短重复周期很短但肉眼难以分辨。更准确的做法是记录上一次的按键集合只有当前包出现了上一次没有的键时才输出。这样按住不动的重复键不会重复输出新按下的键才会输出。如果你发现在自己的数据里还原时字符重复可以按这个思路改进。3.3 Shift处理与控制键带来的符号陷阱这是USB键盘流量里最容易被扣分的点。很多人在还原时只处理了普通字母和数字遇到Shift组合就出错。我遇到过一个题目抓到的流量只包含键盘敲击但结果需要还原出一整段英文句子里面夹着特殊符号,%,_等。如果忽略Shift修饰键你只能得到“1”“5”“-”这些下档字符完全对不上明文。处理Shift有两种策略如果题目明文是小写字母和大小写混合按0x02或0x20修饰键将字母a变成A。如果符号键被按下同时Shift被按下直接通过SHIFT_MAP转换成上档符号。还有一种情况是键盘锁CapsLock有些流量里会出现CapsLock键的按下记录0x39如果你不做状态处理后面的字母大小写全反。可以在脚本里维护一个caps_lock状态遇到0x39取反。实际CTF中出现CapsLock的很少但一旦出现就是坑。3.4 数据丢包下的容错处理USB流量在抓包时也有丢失情况特别是题目构造时使用了不完整的URB记录。举例说正常键盘数据包是8字节但pcap中有些包的usb.capdata只有6字节或者连续缺失了中间的按键值。如果直接按“每包第一位输出”的逻辑去拼接可能错位。比较好的容错方式是在提取数据前先观察所有usb.capdata的长度分布。如果发现大部分是8字节少数是6字节或4字节那么说明要么是不同端点混入鼠标要么是数据截断。需要按端点分离后再分别处理。如果是键盘数据包内部缺失那基本无法完全恢复但可以尝试通过上下文猜测缺失字符多见于英文语境下结合单词补全。另一个更隐蔽的问题是“伪数据包”也就是URB类型是中断但data字段并不是真正的HID报告而是别的类。比如有的题目会在流量里夹杂U盘SCSI命令和键盘流量混在一起。这时一定要先用端点号过滤设备再单独解析。4. 鼠标流量坐标还原与轨迹图像4.1 鼠标数据包结构鼠标协议最常见的是4字节Byte 0: 按键 Byte 1: X相对位移有符号 Byte 2: Y相对位移有符号 Byte 3: 滚轮有时是5字节多出来的可能是额外的坐标值还有高精度鼠标会输出6字节或8字节。CTF里4字节居多。X、Y是“相对位移”不是绝对坐标。这意味着我们要根据上一包的坐标累加当前包的位移才能得到当前绝对坐标。比如00 02 01 00 00 00 FF 00 00 FC 01 00第一包X2Y1如果初始坐标为(0,0)则移动后坐标为(2,1)。第二包X0Y-10xFF即-1绝对位置变成(2,0)。第三包X-4Y1绝对位置变成(-2,1)。如果需要画图坐标可能有负数处理时要平移归一化。鼠标流量题通常的玩法是鼠标在屏幕上画了一幅画可能是手写签名、曲线、二维码轮廓或者直接是笔迹。解题基本步骤是解析所有URB数据提取X和Y位移。累加得到绝对坐标数组。将坐标点绘制成图像观察内容。4.2 用Python从鼠标流量绘制轨迹处理鼠标流量时可以用tshark提取所有鼠标数据包然后逐包解析。下面这段是我常用的绘制脚本import re import matplotlib.pyplot as plt x, y 0, 0 points_x, points_y [], [] with open(mouse.txt, r) as f: for line in f: data line.strip().replace(:, ) if len(data) 8: continue # 假设标准4字节偏移从byte1开始 dx int(data[2:4], 16) dy int(data[4:6], 16) if dx 128: dx - 256 if dy 128: dy - 256 x dx y dy points_x.append(x) points_y.append(y) plt.plot(points_x, points_y, linewidth1) plt.gca().invert_yaxis() # 有些绘制方向可能需要翻转 plt.axis(equal) plt.show()需要注意位移字节是有符号的8位整数取值范围-128~127。遇到0x80以上要按补码处理成负数否则轨迹会乱。还有一个坐标系方向问题。大多数鼠标报告里的Y正方向是向上还是向下取决于驱动和坐标空间约定。在Windows GDI坐标里Y向下为正但在很多HID报告中Y正方向是向上的。画图时如果发现轨迹上下颠倒可以plt.gca().invert_yaxis()或者把y -y再累加。另外如果画出来像是镜像可以考虑X轴反转。4.3 鼠标按键与点击事件鼠标流量有时不只是画轨迹还会记录左键点击和右键点击。当Byte 0的bit0被置为1表示左键按下这时代表一次点击。如果把点击位置也画出来可以还原“鼠标点过的位置”常见于模拟用户打开文件、选择菜单等场景。解析时把当前绝对坐标记录下来作为点击点即可。如果题目中需要还原点击顺序还要按时间顺序排列这些点。必要时可以输出坐标列表再用画图工具连点形成操作轨迹。5. 实战题目与工具链从零到拿Flag的完整路径5.1 常见题型分类与识别技巧我把CTF里的USB流量题大致分成四类每类的解法侧重点不同题型数据特征解决路径键盘流量8字节报告大量非零键值按HID映射表还原字符串鼠标轨迹4/6字节报告位移为主还原坐标后绘图键盘鼠标混合存在多个端点或不同长度数据按端点分离后分别还原特殊HIDU盘、手柄数据长度不规则SCSI/Bulk传输提取文件、解析报告描述符识别技巧是看tshark导出的usb.capdata的长度分布。如果绝大多数长度为8几乎可以认定是键盘如果长度为4基本是鼠标如果还有其他长度就要检查是否为复合HID设备。有些题目会在描述符里做文章比如把键盘报告长度改成其他值。这时直接提取usb.capdata可能什么都提不到需要查看usbhid.data或解析HID Report Descriptor。这种情况极少出现但如果出现说明题目考察的是HID报告描述符解析而非简单按键映射。5.2 工具链推荐tshark、Wireshark、Python生态我平时处理USB流量核心工具链是Wireshark用于快速浏览数据包分析端点、协议细节。tshark命令行提取字段适合批量处理。Python3还原脚本处理逻辑。scapy用于重新构造或深入解析USB数据包不过USB流量在scapy里通常只是RawPcap大多数场景用tshark提取完就够了。usbhid或hid解析库用于复杂HID报告描述符解析不是必须。网上有一定流传度的“一把梭”工具比如“随波逐流”这类集成工具内置键盘流量解析。但我建议只把它当辅助验证手段不要依赖。因为题目变异很多集成工具往往只处理标准场景遇到Shift、多设备、丢包就抓瞎。亲手做一遍解析脚本才是真正牢固的掌握方式。5.3 真题模拟一份带有残缺数据的键盘捕获题目设定下载到一个keyboard.pcapng里面是有人用键盘敲了一封“信”。由于抓包问题部分数据包的存储不完整也就是说存在URB丢失。我们需要还原出明文。我的实操步骤是第一步用tshark先看基本信息tshark -r keyboard.pcapng -2 -R usb.transfer_type 0x02 usb.data_present 1 -T fields -e usb.endpoint_address -e usb.data_len如果数据长度不全为8记录一下异常长度。假设我们看到大部分8字节少数6字节说明有些键值可能被截断。这类截断常见于URB报文没被完整抓取缺掉的部分通常是尾部也就是后面几个0或后一个按键值。如果我们只关心第一个有效按键前面还是能满足。如果缺掉的是中间的某个键只能通过语义推断。第二步提取数据到文件tshark -r keyboard.pcapng -Y usb.transfer_type 0x02 usb.endpoint_address 0x81 -T fields -e usb.capdata capdata.txt第三步写脚本解析。注意先去重00:00:00:00:00:00:00:00这类空包只处理有键值的包。解码后发现是一段英文句子。如果其中有几个字符因为丢包缺失比如句子是“Hello World”缺失e变成“Hllo World”可根据上下文补全。第四步如果数据包中出现了多个USB设备地址先对usb.device_address做分组每个设备单独还原再按时间戳合并。时间戳是判断输入顺序的关键如果只用文本顺序有可能因为抓包时不同设备交错而乱序。5.4 利用HID报告描述符做深入分析HID Report Descriptor是一段二进制描述符定义设备上报的数据格式。在更复杂的USB流量题中单纯映射键值不够需要解析报告描述符来知道哪些bit是键盘、哪些bit是鼠标、或者哪个字节是特定传感器的数据。Wireshark可以解析HID报告描述符在解析树中展开“HID Protocol”层可以看到每个字段的offset和size。还有一种方式是提取描述符的原始字节用Python的hidparse库解析。不过CTF一般用不到这么深简单了解即可。5.5 如何构造自己的USB流量样例出题或练习时可以用HID工具构造模拟流量。最简单的方法是在真实机器上用usbmonLinux或者Wireshark抓取真实键盘的USB流量然后自行标注数据段。但很多时候我们并没有真实设备也可以用虚拟USB设备模拟比如用Python的pyusb构造模拟键盘设备发送报告但这需要内核驱动支持。如果没有硬件条件我建议直接在已有公开数据集或网上例题的pcap上做变体练习。比如把正常键盘流量随机删除几个非零包重新保存为pcap就能模拟丢包场景把不同设备的流量合并到一个文件里练习多设备分辨。这些做法对提升实战判断力很有帮助。6. 进阶实战混合设备流量与特殊HID设备如何搞定6.1 从键盘和鼠标混合流量中分离数据很多赛题会把键盘和鼠标流量塞进同一个pcap这个时候如果直接统一按键盘解析会解出一堆垃圾。我的经验是先分组tshark -r mixed.pcap -Y usb.transfer_type 0x02 usb.data_present 1 -T fields -e usb.device_address -e usb.endpoint_address -e usb.capdata输出里第一列是设备地址第二列是端点地址第三列是数据。按“设备地址端点地址”分组查看各组数据长度分布组A地址1.1.0端点0x81长度8字节是键盘。组B地址1.1.1端点0x82长度4字节是鼠标。分别处理这两组数据即可。有时Wireshark显示的设备地址不是简单的1.1.0而是用usb.device_address和usb.bus_id组合这种组合值也能区分设备。6.2 识别无线鼠标和特有协议无线鼠标接收器通常也是USB HID设备但上报的数据格式可能不是标准的4字节。我曾遇到一个逻辑无线鼠标接收器数据长度是6字节前两个字节是设备ID后四个才是位移和按键。这种情况下直接解析byte1和byte2可能会错。需要先观察数据中哪个字节随鼠标移动而变化。我一般采用“差分法”移动鼠标时看哪些字节在变化固定下来的是设备信息变化的才是坐标字段。还有一种游戏鼠标上报1000Hz数据量特别大且报文里有时间戳、任务ID等额外字段。CTF很少考这种但若遇到可以用Wireshark的柱状图查看不同数据的重复模式先对数据做字段判断。6.3 U盘流量与文件提取U盘流量不是HID中断传输而是Bulk传输使用SCSI命令读写数据。当题目中出现U盘读取文件我们可以从SCSI Read命令的返回值里还原出文件内容。这类题目比较硬核通常需要熟悉SCSI命令格式和USB Mass Storage协议。具体步骤是过滤usb.transfer_type 0x03批量传输。找到CBWCommand Block Wrapper包里面有SCSI操作码比如0x28表示Read(10)。对应的CSW和Data段包含文件数据。提取所有Data段并按LBA逻辑块地址拼接成文件。这已经超出了一般HID流量题的范畴但作为进阶内容值得了解。我个人碰到过两三道这类题都是提取出一个小文件然后做隐写。6.4 游戏手柄流量解析游戏手柄属于HID通常上报结构和键盘鼠标不同比如包含摇杆模拟值、按键位图等。CTF里游戏手柄题很少见但一旦出现通常是把按键序列转换为一串二进制然后转字符串。解析时先看HID描述找到哪个字节对应哪个按键。如果直接拿到的是“按键状态数组”可以按时间顺序把所有按键状态拼起来再转成ASCII。7. 常见问题与排查技巧实录7.1 为什么tshark提取不到usb.capdata这是个高频问题。有以下可能过滤器条件过严导致没匹配到数据。可以先去掉usb.transfer_type条件只留usb.data_present 1看看到底有哪些USB数据。Wireshark版本不同有些版本的usb协议解析不输出usb.capdata而是输出usb.data.data。数据包本身不是USB HID而是别的协议需要先检查包类型。我的排查习惯是先用Wireshark GUI打开pcap点开一个有数据的包看解析树中是否有“Leftover Capture Data”或“Payload”。如果能看到数据再去看tshark对应的字段名。如果实在提不到usb.capdata可以用下面方式提取原始字节tshark -r usb.pcap -Y frame.protocols usb -T fields -e data.data这种提取会把USB链路层数据也带进来需要手动剥离往返头。但至少不会丢数据。7.2 数据错位按键还原结果乱码还原出的字符串乱码通常有三个原因把鼠标数据当键盘解析了键值对应不到字母。键盘映射表用错了比如用了PS/2映射表而不是USB HID映射表。数据提取时多了一个字节前缀比如把usb.capdata当data.data提取导致整个数据流偏移。处理方法是先看一包原始数据人工确认字节含义。比如看到00 00 04 00 00 00 00 00如果设备是键盘04应该是a。如果此时脚本输出的是其他字符那大概率映射表错位。7.3 鼠标轨迹左右镜像或上下翻转我遇到过题目中鼠标轨迹是镜像的比如正常绘制是“S”还原出来是反“S”。这个时候检查X位移的符号位处理是否有误。USB鼠标的X正方向一般向右Y正方向向上但在很多绘图环境里Y正方向向下。若显示上下翻转可以在累加时对Y取反。左右镜像则把X累加方向反向。还有一次我发现同样是鼠标数据水平方向位移值总是乘以某个系数比如1.25倍导致画的图横向拉伸。如果画出来的图明显变形可以调整坐标缩放系数或者用aspectequal强制等比例。这种情况一般是因为设备DPI不同没必要深究。7.4 多个键盘设备同时上报多设备流量里如果错误合并了解析会产生乱序字符串。正确方法是要按照时间戳排序并且只保留目标设备的包。时间戳字段可以用frame.time_epoch提取。tshark在输出usb.capdata时加上-e frame.time_epoch写入文件后按时间排序。7.5 从空包到字符重复按键问题对于按住不动的重复包正确逻辑是“状态变化时输出”而不是“每个包都输出”。下面这个改进版解析片段可以处理重复键last_keys set() result for line in lines: mod, keys parse_capdata(line) cur_keys set(k for k in keys if k ! 0) new_keys cur_keys - last_keys for k in new_keys: if k in hid_map: ch hid_map[k] if mod 0x02 or mod 0x20: ch SHIFT_MAP.get(ch, ch.upper()) result ch last_keys cur_keys使用这个逻辑同一键重复上报不会重复输出但新按键按下和旧按键释放时都会触发识别。唯一要注意的是当两个键连续快速切换时新键输出会正常不会漏。8. 个人经验与沉淀USB流量这类题给我最大的感触是它不是考你背了多少脚本而是考你有没有真正理解HID上报机制。我见过太多人拿到的映射表能跑通普通题但一改Shift、一改多设备、一改鼠标轨迹就卡住。所以平时做练习不要只满足于拿flag要把每一道的pcap都拆开看对照Wireshark解析树亲手确认字段是什么端点是什么设备地址是什么数据长度为什么是8或4。这样拆过十道题之后再遇到新题目大概率扫一眼数据就能判断出解法。另外保存几个自己的工具脚本比如tshark提取命令、键盘还原脚本、鼠标绘图脚本比赛时能省一半时间。别贪心去背一份万能脚本猜一个完整的工具链然后把数据流喂进去输出结果是最容易被坑的。

相关推荐

辉芒微MCU烧录校验全指南:从Hex到FMD-Link实操
辉芒微MCU烧录校验全指南:从Hex到FMD-Link实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:25:25

SpringBoot+MySQL学生成绩管理系统开发实践
SpringBoot+MySQL学生成绩管理系统开发实践

1. 项目背景与核心价值作为一名长期从事教育信息化系统开发的工程师,我深知学生成绩管理是每所学校最基础也最关键的日常事务。传统Excel表格管理方式在数据安全、多人协作和统计分析方面存在明显短板。这个基于SpringBoot和MySQL的学生成绩管理系统,正是… · 2026/9/25 6:25:19

AI编程工具上传.git目录引发隐私争议:技术原理与开发者防护指南
AI编程工具上传.git目录引发隐私争议:技术原理与开发者防护指南

1. 事件背景与核心争议拆解1.1 一个“仓库快照”功能为何引发轩然大波事情的起因并不复杂。有开发者在日常使用 ZCode 这款 AI 编程辅助工具时,通过抓包和本地文件监控发现,工具在特定操作触发下,会把当前项目的.git目录整体打包上传。注意&a… · 2026/9/25 6:25:19

8G显存跑30秒视频:minimaxh3显存精控四步法
8G显存跑30秒视频:minimaxh3显存精控四步法

1. 为什么8G显存能跑30秒视频?先破除三个常见误解很多人看到“8G显存跑30秒视频”第一反应是:不可能。显卡显存不够,模型加载不进去,中间缓存撑爆,帧生成直接OOM——这是实打实踩过坑后形成的肌肉记忆。但最近两周我用… · 2026/9/25 6:54:15

Substrate区块链开发框架详解:从Runtime架构到实战链上开发
Substrate区块链开发框架详解:从Runtime架构到实战链上开发

“substrate”这个词在开发者社区里热度一直不低,但搜索它的人往往带着不同期待。有人以为是生物化学里的酶底物,有人想找半导体材料,更多的人其实是冲着区块链开发框架来的。如果你是从“想自己搭一条链”这个需求点进来的,那这篇… · 2026/9/25 6:54:15

wx_channels_download v260830 更新详解:视频号直播「边下载边播放」与下载菜单自定义能力
wx_channels_download v260830 更新详解:视频号直播「边下载边播放」与下载菜单自定义能力

桌面应用视频网络MCP 服务 【免费下载链接】wx_channels_download 微信视频号下载器 项目地址: https://gitcode.com/gh_mirrors/wx/wx_channels_download 点击查看 免费下载 本文基于仓库内版本发布文档 docs/releases/260830.md 编写,围绕 v260830 版… · 2026/9/25 6:54:15

BentoML Hello World 实战:用 30 行代码将 Hugging Face 文本摘要模型封装为 HTTP 服务
BentoML Hello World 实战:用 30 行代码将 Hugging Face 文本摘要模型封装为 HTTP 服务

模型推理服务人工智能后端大模型MLOpsLLMOps 【免费下载链接】BentoML The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more! 项目地址: https://gitcode.com/gh_mirrors/be/BentoM… · 2026/9/25 6:54:15

ClawHub 的 specs/ 治理体系:规格、计划与回归记录的双轨文档系统
ClawHub 的 specs/ 治理体系:规格、计划与回归记录的双轨文档系统

后端前端AI 技能AI 插件搜索引擎 【免费下载链接】clawhub Skill Plugin Registry for OpenClaw 项目地址: https://gitcode.com/gh_mirrors/mo/clawhub 点击查看 免费下载 ClawHub(OpenClaw 的 Skill Plugin Registry)在仓库中维护了一套… · 2026/9/25 6:54:15

NodeGui CorrectionMode 枚举详解:QAbstractSpinBox 数值纠正策略与 setCorrectionMode 实践
NodeGui CorrectionMode 枚举详解:QAbstractSpinBox 数值纠正策略与 setCorrectionMode 实践

桌面应用跨平台 【免费下载链接】nodegui A library for building cross-platform native desktop applications with Node.js and CSS 🚀. React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org 项目地址: https://git… · 2026/9/25 6:54:09

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码