-
-
Save IntelFelix/05dccd4928ebf0b348539f23326fd13b to your computer and use it in GitHub Desktop.
code for rp2040-one hid injector
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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