Skip to content

Instantly share code, notes, and snippets.

@IntelFelix
Created November 3, 2025 08:31
Show Gist options
  • Select an option

  • Save IntelFelix/05dccd4928ebf0b348539f23326fd13b to your computer and use it in GitHub Desktop.

Select an option

Save IntelFelix/05dccd4928ebf0b348539f23326fd13b to your computer and use it in GitHub Desktop.
code for rp2040-one hid injector
# code.py — простой офлайн-инжектор на RP2040 (CircuitPython)
# Понимает команды уровня Ducky v1: REM, DELAY, STRING, ENTER,
# GUI/CTRL/ALT/SHIFT <key>, TAB, BACKSPACE, ESC.
import time
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
kbd = Keyboard(usb_hid.devices)
layout = KeyboardLayoutUS(kbd)
# соответствия "слов" на имена клавиш Keycode
NAMED_KEYS = {
"ENTER": Keycode.ENTER,
"TAB": Keycode.TAB,
"BACKSPACE": Keycode.BACKSPACE,
"ESC": Keycode.ESCAPE,
"ESCAPE": Keycode.ESCAPE,
"SPACE": Keycode.SPACE,
"UP": Keycode.UP_ARROW,
"DOWN": Keycode.DOWN_ARROW,
"LEFT": Keycode.LEFT_ARROW,
"RIGHT": Keycode.RIGHT_ARROW,
"DELETE": Keycode.DELETE,
"HOME": Keycode.HOME,
"END": Keycode.END,
}
MODS = {
"GUI": Keycode.GUI,
"WINDOWS": Keycode.GUI, # синоним
"CTRL": Keycode.CONTROL,
"CONTROL": Keycode.CONTROL,
"ALT": Keycode.ALT,
"SHIFT": Keycode.SHIFT,
}
def key_from_token(tok: str):
t = tok.strip().upper()
if t in NAMED_KEYS:
return NAMED_KEYS[t]
# Буквы/цифры: Keycode.A ... Keycode.Z, Keycode.ONE ... и т.п.
if len(t) == 1 and "A" <= t <= "Z":
return getattr(Keycode, t)
# Попытаться как имя константы Keycode.*
return getattr(Keycode, t, None)
def send_combo(mod: str, keytok: str):
kc = key_from_token(keytok)
if kc is None:
return
kbd.send(MODS[mod], kc)
def do_line(line: str):
line = line.rstrip("\r\n")
if not line or line.lstrip().startswith("REM"):
return # комментарий/пустая строка
parts = line.split(" ", 1)
cmd = parts[0].upper()
arg = parts[1] if len(parts) > 1 else ""
if cmd == "DELAY":
# задержка в миллисекундах
ms = int(arg) if arg.isdigit() else 0
time.sleep(ms / 1000.0)
elif cmd == "STRING":
# печать строки в EN (US) раскладке
layout.write(arg)
elif cmd in ("ENTER", "TAB", "BACKSPACE", "ESC", "ESCAPE", "SPACE",
"UP", "DOWN", "LEFT", "RIGHT", "DELETE", "HOME", "END"):
kbd.send(NAMED_KEYS.get(cmd if cmd != "ESCAPE" else "ESC", Keycode.ENTER))
elif cmd in MODS:
# Пример: GUI r | CTRL ALT DELETE (поддержим несколько)
tokens = arg.strip().split()
if not tokens:
return
if len(tokens) == 1:
send_combo(cmd, tokens[0])
else:
# несколько модификаторов/клавиш: CTRL ALT DELETE
klist = []
for t in [cmd] + tokens:
if t.upper() in MODS:
klist.append(MODS[t.upper()])
else:
k = key_from_token(t)
if k: klist.append(k)
kbd.send(*klist)
else:
# неизвестное — просто печатаем как STRING
layout.write(line)
time.sleep(0.03) # микропаузка для стабильности
# Подождём, пока ОС опознает HID-клавиатуру
time.sleep(1.2)
# Читаем payload.txt из корня диска
try:
with open("/payload.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
except Exception:
# Фоллбэк: демо-скрипт
lines = [
"DELAY 1500\n",
"GUI r\n",
"DELAY 300\n",
"STRING notepad\n",
"ENTER\n",
"DELAY 500\n",
"STRING RP2040 is alive!\n",
"ENTER\n",
]
for ln in lines:
do_line(ln)
# Один прогон — и тишина
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment