树莓派PiPico BadUSB 教程

树莓派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 多媒体按键常量

具体操作

模拟键盘

先导入以下库

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)来等待系统识别设备

接下来,定义主程序函数

# === 主程序函数 ===
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)

# === 配置紧急停止引脚(使用 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  # 正常完成

然后就是主程序

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

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

演示代码

# 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("程序结束。")
posted @ 2026-01-18 12:03  DrJIE  阅读(2)  评论(0)    收藏  举报