#include <IRremote.h> #include "Keyboard.h" int recvPin = 7; IRrecv irrecv(recvPin); void setup ( ) { irrecv.enableIRIn(); pinMode(8,OUTPUT); pinMode(9,OUTPUT); digitalWrite(9,HIGH); Keyboard.begin(); }
リスト1は、IR-BadUSBのセットアップを行うためのソースコードになります。ArduinoのIRremoteとKeyboardのライブラリを使用します。IRremoteは赤外線信号を符号化するライブラリ、KeyboardはこのマイコンをPCのキーボードとして動作させるためのライブラリです。セットアップ機能は起動時に1回だけ実行されます。GPIOは、IRレシーバーの信号端子とIRレシーバーのVCC端子に正電圧、GND端子に0V電圧を供給するように設定します。この設定により、ブレッドボード上に余計な配線をすることなくIRレシーバーをブレッドボードに挿して使うことができます。
void loop ( ) { decode_results results; if (irrecv.decode(&results)) { if (results.value==0xFF48B7) Keyboard.println("Hello IRBadUSB! #0"); if (results.value==0xFF906F) Keyboard.println("Hello IRBadUSB! #1"); irrecv.resume(); } }
Setup関数が実行された後、loop()関数が一定時間ごとに何度もエンドレスに呼び出されます(リスト2)。IRレシーバーが0xFF48B7を受信するとキーシーケンス"Hello IRBadUSB! #0"を、#0xFF906Fを受信した場合は、"Hello IRBadUSB! #1"というキーシーケンスをPCのキーボードとして送出します。これらの#0と#1は、IRリモコンの0と1のキーが押されたことを示しています。
図5のように、Arduino Pro Microよりさらに小さなマイコンボード「Digispark Attiny 85」を使えば、USBドングルの中に組み込むことも可能です。まさに、USBメモリ形状のIR-BadUSBを実現できるわけです。この他にも、開発ボードの「Leonardo USB ATMEGA32U4 mini」もDigispark Attiny 85と同様に小型でPCのUSBポートに直接差し込めるので、ドングルに組み込むことが可能です。
図6はWi-FiとIR通信の橋渡しをするデバイスの内部構造です。プロセッサには「ESP32」を使用しています。このデバイスをアクセスポイントモードにしてターゲットのオフィスに置くと、モバイル端末などを使ってオフィス外からIR-BadUSBを遠隔操作される危険性があります。
赤外線の届く範囲を広げるために、暗視カメラ用の赤外線LEDライトを使う方法もあります。図7の赤外線LEDライトは以下のような仕様になっています。
赤外線LEDライトの多くは、夜間だけ動作するように光センサーが内蔵されています。今回のIR-BadUSBへの適用では、光センサーの機能は不要なので、遮光のために何か被せたり、黒いマジックや塗料で塗りつぶしたりする必要があります。もし電子工作が得意であればこの光センサーを基板から除去してもいいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.