完成したもの
パソコンに接続すると勝手にぼくのサイトを開く悪いUSBデバイスできた! pic.twitter.com/GR2Ma9fjg0
— odanny🐶 (@dannyso16) April 17, 2021
PCに接続すると勝手にブラウザが立ち上がり、ぼくのWebサイトに誘導する。なんか悪いことをしている気分になるが、接続時以外の動作は実装していないので安心。
はじまり
Pocketのあとで読むを消化していたら少し古い次の記事が出てきた。
上の記事では市販の東芝製USBメモリのファームウェアを書き換えて、キーボード化している。こうした市販のデバイスのファームウェアを書き換えて悪いことをすることを BadUSB と呼ぶようだ。「見知らぬUSBデバイスをパソコンに接続してはいけない」という注意喚起はよく見るものの、こうした悪意あるUSBデバイスがどれくらい簡単につくれるのか試してみたくなった。
本記事では以下のことをやる/やらない。
- ファームウェアの書き換えは大変そうなのでやらない
- ATmega 32U4を積んだデバイスでカンタンにやる
- 接続すると特定のコマンドを実行させる
- 今回は、ぼくのwebサイトを開かせる
使用したもの
Amazonでオタクが好きそうなデザインのものを購入した。ATmega 32U4を積んだデバイスであれば何でもよく、Arduino Leonardo やArduino micro などでもいい。
Aideepen Beetle BadUSBキーボードプロマイクロATMEGA32U4モジュール Mini開発拡張ボードArduinoレオナルドR3用
また今回使用したPCは、Windows 10 Education である。Mac や Linux での動作は確認していない。
そして最後にぼくのノートパソコンはJIS配列キーボードである。この影響が本記事の後半に現れる。
実装
Arduino 編
がんばって書いた。
|
|
(書きこむときチョットカッコイイ。)
JIS配列キーボードを使用している場合は、このままでは動かないので、次の修正が必要になる。
Keyboardライブラリの書き換え
上のコードを普通に実行するとコロンを正しく打つことができず、https+//odanny.com
のようになってしまう。そこでめんどくさいが、Keyboard.cpp
をいじる必要がある。85行目あたりから抜き出す。
|
|
コロンは0x33|SHIFT
と定義されていて、これは「0x33
に対応するキーとSHIFTを同時押しする」ことを意味する。キー配置とIDの対応を次の図に示す。( DigiKeyboardが日本語キーボード搭載PCで記号を正しく出力しない問題を解決する - Qiita より)
0x33
は10進数で51なので、今のコードでは確かに+
が入力されてしまうことが確認できる。日本語配列でコロンは52を押せば入力できるので次のように修正する。
|
|
ここまで来ればKeyboard.cpp
を保存し、再度先ほどのArduinoスケッチを書きこめばよい。なおKeyboard.cpp
はWindows環境では、C:\Program Files (x86)\Arduino\libraries\Keyboard\src
配下にあった。
トラブルシューティング
デバイスが認識されない
ATmega 32u4がUSB認識しなくなった場合の対処を参考にする。
「Keyboard」が存在しません。のエラー
コンパイル時「「Keyboard」が存在しません。スケッチに「#include <Keyboard.h>」という行を含めていますか?」と出る場合、「ツール→ボード」をみて、Arduino UNOなどHID向けのものになっていないか確認する。
最後に
意外にカンタンにパソコンのターミナルを操作するデバイスをつくれた。このデバイスを作ったせいで、ぼくがUSBメモリを人に貸そうとすると拒否される未来が見える。知らないUSBデバイスと過去の自分は信用してはいけないことを理解できた。