【TeamT5 分析】為什麼資安代管已成趨勢?企業資安策略的下一步
技術分析

技術解析:輸入裝置之鍵盤與滑鼠探討(ATtiny85)

2026.01.11IR Team
Share:
本部落格文章僅供學術研究與教育目的使用。
早期想使用 USB 當鍵盤的輸入裝置,只有想到 Teensy by PJRC(4.1),但隨著科技的進步,各種電子產品越來越多(MCU),自從 Arduino (2005) 的普及使得踏入電子領域的入門門檻變的容易,目前 Arduino 廣為使用的開發版為 Arduino Uno R3(ATmega328P)/R4(RA4M1=ARM Cortex-M4)/Nano(ATmega328P),而高通在 2025 年 10 月收購 Arduino 後也發行了一版 Q (Qualcomm QRB2210)。
如果想縮小 Arduino Nano 的體積,可以選擇 Adafruit / DEFRobot / Seeed XIAO(小) 等系列,但要便宜好用不心痛的,也許 Digispark ATtiny85/ESP32-XX Super Mini 是個不錯的選擇,這裡使用 ATtiny85 的 MCU(ATmel 後來被 Microchip 收購),ATmel AVR 基於哈佛架構進行改良,屬於精簡指令集(RISC: Reduced Instruction Set Computing),與 Arduino 一樣都是 ATeml 晶片。
ATtiny85 為 8 支腳的 MCU,工作電壓 (1.8V~5.5V),扣掉 VCC/GND 還有 6 支腳,支援 TWI(Two-Wire Interface 相容 I2C)/SPI,以數位接腳做使用有 6 支,以類比數位轉換(ADC)接腳有 4 支,2 支脈衝寬度調變(PWM:Pulse Width Modulation)腳。
以 Attiny85 為例,可以得知快閃記憶體(Flash Memory)有 8 KB,程式計數器 (Program Count) 每次加 1 (2 byte, PC+1),但位址空間不夠時,也會出現 4 byte (PC+2),用常規組語指令 2 byte 計算,最多大約可放 4096 (8KB/2) 條指令,但如果不接 ISP(In-System Programming)/SPI(Serial Peripheral Interface) 燒錄,想使用 USB 進行燒錄,必需存放 Bootloader (1.5~2K),大多都會使用 Micronucleus (Micronucleus is a bootloader designed for AVR ATtiny microcontrollers with a minimal usb interface),如果含有 Bootloader 程式碼最多就剩 6K 的空間。靜態記憶體(SRAM)有 512 KB,可以看到資料記憶體前面有 0x20(32) 是存放暫存器(Register),之後 0x40(64) 存放 64 I/O Register,之後的 512K 是位址是從偏移(Offset) 0x60 開始,結束位址為 0x200-1+0x60=0x25F,而可複寫唯讀記憶體(EEPROM)是從 0~512 KB。
規格書中可以看到中斷向量 IV(Interrupt Vectors),共有 15 個中斷編號,被放在 Program memory(Flash) 偏移值 0x00~0x0F 的地方,偏移值 0 是 RESET 的程式碼,開機或 RESET 時 MCU 會從這裡開始執行,也就是 PC 初始化值為 0x0000,而該中斷位址的內容是一行 rjmp (2 byte) 的指令,所以不像 x86 是放 IP:CS 的中斷向量表(IVT)。
將 ATtiny85 的 Flash dump 出來,可以看到偏移值 0 都是 2 byte 為一組的陣列,內容大多為 XX CC、XX C0 這也就是中斷向量的程式碼,可以看到如果使用 Micronucleus 作 Boot loader 會修改 RESET 的程式碼,會使 RESET 的程式碼跳到 PC=0x0D00 (Offset=0x1A00),0x0D00 的程式碼就是 Micronucleus 的程式碼 main.c,主要的功能就是在啟動時,等待 60 秒的時間進行燒錄,如果過了 60 秒後,就執行 leaveBootloader 會跳入使用者的應用程序(User App),跳入的位址是 PC:0xD00-2/Offset:0x1A00-2*2=0x19FC 的地方,也就是 rjmp loc_17 的那行指令,而在編譯 Micronucleus 時會使用到一份 usbdrv 的函數庫,而這個就是 V-USB 的程式碼。(因為 ATtiny85 為 8KB 的 Flash 所以 IDA Pro 裡面的 AVR 晶片要選擇 >= 8KB ex: ATmega8_L、ATmega8515_L、ATmega8535_L 等)
接腳 PB3(USB+)、PB4(USB-) 與 USB 相關,而 ATmel 並沒有專門處理 USB 的硬體功能,而是將腳接電壓設定成 USB 所需的 3.6V,從電路圖中可以看到為 BZV55-C3V6 的穩壓二極體,而實際上在電路中可以找到二個 W4 (BZT52C3V6) 的 SMD,之後再使用軟體的方式進行模擬傳訊號,這項技術被叫做 V-USB (V-USB is a software-only implementation of a low-speed USB device for Atmel’s AVR® microcontrollers),OBjective DEVelopment 網站中有使用 VUSB 做出的各種專案,有興趣可以參考。
燒錄 Digispark ATtiny85 可以使用 Arduino IDE,因為 Flash (8/16/32KB) 空間小,所以速度很快,Arduino IDE 就很夠用了,如果需要燒錄像是 ESP8266/ESP32 大一點的 Flash (4/8/16MB) 可使用 VSCode+PlatformIO (編譯過一次,之後沒修改就不會重新編譯,加速編譯速度);可以看到 Digispark 的範例中有 Joystick、Keyboard、Mouse 的範例程式。
使用 bad-usb rickroll.ino 中的程式範列,進行燒錄,之後插入 USB 後就會按 Win+R 輸入 Youtube 網址後再按下 Enter。
學以致用,學習的目的就是為了能應用,想了幾個關於鍵盤/滑鼠的應用。
  • 自製鍵盤或滑鼠 (遇過客戶因為套用 GCB 的關係,5 分鐘後自動鎖畫面,登入後如果不在電腦前就會被鎖,當時客戶的解決方法是使用電腦軟體的方式讓滑鼠固定滑動,現在有 USB 硬體的方式,也可以燒錄滑鼠程式進行滑動)。
  • 鍵盤密碼輸入,可以自動輸入密碼,但如果有被植入 Keylogger 會被記錄(可以制作簡易 Yubikey 需撰寫電腦軟體與之配合)。
  • 連接人體感測器/IR Sensor,可以偵測有人走過來時自動切畫面,也可以拿來偵測沒在位子上時,自動鎖螢光幕畫面。
  • 連接 紅外線接收器,可以拿來切換 PowerPoint 畫面。
  • 連接 RTC 模組,限制小孩上網時間,定時關機。

參考資料

2026.01.11IR Team
Share:
為提供您最佳的服務體驗,本網站使用 Cookies。當您使用本網站,即表示您同意 Cookies 技術支援。更多資訊請參閱隱私權與Cookies使用政策。