树莓派PiPico BadUSB 教程

安装 CircuitPython for Pi Pico

过程省略

添加adafruit_hid库到Lib文件夹

过程省略

核心模块说明

模块 用途
usb_hid.devices 获取已连接的 HID 设备列表(通常只有 1 个)
adafruit_hid.keyboard.Keyboard 模拟键盘按键
adafruit_hid.keycode.Keycode 定义按键常量(如 Keycode.A, Keycode.ENTER
adafruit_hid.mouse.Mouse 模拟鼠标移动/点击
adafruit_hid.consumer_control.ConsumerControl 控制音量、播放等
adafruit_hid.consumer_control_code.ConsumerControlCode 多媒体按键常量

具体操作

模拟键盘

先导入以下库

1
2
3
4
5
6
7
import time
import usb_hid # 提供对USB HID设备(如键盘、鼠标)的底层访问接口
import digitalio # 用于控制数字输入/输出引脚(如LED、按钮等)
import board # 提供对开发板引脚的标准化访问(如 board.D13)
from adafruit_hid.keyboard import Keyboard # 用于创建虚拟USB键盘,模拟按键操作
from adafruit_hid.keycode import Keycode # 提供标准键盘按键的常量(如 ENTER、CTRL 等)
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS #键盘布局类,可以自动处理字母、数字、常见符号和大小写

可以先time.sleep(2)来等待系统识别设备

接下来,定义主程序函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# === 主程序函数 ===
def main():
keyboard = Keyboard(usb_hid.devices) # 初始化键盘
layout = KeyboardLayoutUS(keyboard) #初始化文本

# keyboard.send(Keycode.CAPS_LOCK)

# 示例:打开记事本并输入文本(完全可见、无害)
keyboard.send(Keycode.GUI, Keycode.R)
time.sleep(0.3)
layout.write("notepad\n")
time.sleep(1)
layout.write("This is a safe demo from Raspberry Pi Pico!\n")
layout.write("Time: " + str(time.monotonic()) + "\n")

# keyboard.send(Keycode.CAPS_LOCK)

配置紧急停止引脚(使用 GP1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# === 配置紧急停止引脚(使用 GP1)===
# 用杜邦线将 GP1 短接到 GND 表示“停止”
emergency_stop = digitalio.DigitalInOut(board.GP1)
emergency_stop.direction = digitalio.Direction.INPUT
emergency_stop.pull = digitalio.Pull.UP # 上拉:未短接时为 True,短接 GND 时为 False

def wait_with_abort(seconds, abort_pin):
"""倒计时,期间检测是否触发紧急停止"""
print(f"倒计时 {seconds} 秒... (短接 GP1 到 GND 可取消)")
for i in range(seconds, 0, -1):
if not abort_pin.value: # 检测到短接(低电平)
print("⚠️ 检测到紧急停止!程序终止。")
return False # 中止
print(f"{i}...")
time.sleep(1)
return True # 正常完成

然后就是主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# === 主程序 ===
print("程序启动!")
if not wait_with_abort(2, emergency_stop):
# 用户在 2 秒内短接了 GP1 → 安全退出
print("已安全退出,未执行任何操作。")
else:
# 超时未停止 → 执行自动化
print("开始执行自动化任务...")

try:
main()
print("✅ 任务完成!")
except Exception as e:
print("❌ 执行出错:", e)

演示代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# code.py - 带紧急停止的自动化脚本

import time
import usb_hid
import digitalio
import board
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS

# === 配置紧急停止引脚(使用 GP1)===

# 用杜邦线将 GP1 短接到 GND 表示“停止”

emergency_stop = digitalio.DigitalInOut(board.GP1)
emergency_stop.direction = digitalio.Direction.INPUT
emergency_stop.pull = digitalio.Pull.UP # 上拉:未短接时为 True,短接 GND 时为 False

def wait_with_abort(seconds, abort_pin):
"""倒计时,期间检测是否触发紧急停止"""
print(f"倒计时 {seconds} 秒... (短接 GP1 到 GND 可取消)")
for i in range(seconds, 0, -1):
if not abort_pin.value: # 检测到短接(低电平)
print("⚠️ 检测到紧急停止!程序终止。")
return False # 中止
print(f"{i}...")
time.sleep(1)
return True # 正常完成

# === 主程序函数 ===

def main():
keyboard = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(keyboard)

# keyboard.send(Keycode.CAPS_LOCK)

# 示例:打开记事本并输入文本(完全可见、无害)
keyboard.send(Keycode.GUI, Keycode.R)
time.sleep(0.3)
layout.write("notepad\n")
time.sleep(1)
layout.write("This is a safe demo from Raspberry Pi Pico!\n")
layout.write("Time: " + str(time.monotonic()) + "\n")

# keyboard.send(Keycode.CAPS_LOCK)

# === 主程序 ===

print("程序启动!")
if not wait_with_abort(2, emergency_stop):
# 用户在 2 秒内短接了 GP1 → 安全退出
print("已安全退出,未执行任何操作。")
else:
# 超时未停止 → 执行自动化
print("开始执行自动化任务...")

try:
main()
print("✅ 任务完成!")
except Exception as e:
print("❌ 执行出错:", e)

print("程序结束。")