
Expose USB activity on the fly

[!NOTE] USBvalve バージョン 1.0.0
アプリケーションの完全な書き換えが行われました:
- Arduino IDE 環境から移行し、コードは Pi Pico SDK 向けに記述されました
- 外部ライブラリへの依存が大幅に削減されました
- Low Speed デバイス向け USB ホストサポートがより堅牢になりました (ATTiny85、EvilCrow など)
- ハードウェアと機能はほぼ変更ありません。詳細は下記の notes を参照してください
きっと、私と同じように、あなたも 未知の デバイスに USB ドライブを挿入するよう求められたことがあるでしょう。そして、そんな疑問が浮かびます:
舞台裏で、私の愛しいドングルに何が起きたのか? ファイルを盗まれているのか? 暗号化されているのか? それとも 単に マルウェアを仕込まれているのか? USBvalve を使えば、これを数秒で見抜けます。超安価な既製品ハードウェアをベースに、あらゆる USB ファイルシステムアクティビティをすばやくテストし、手遅れになる前に何が起きているかを理解できます。
USBvalve を使えば、ドライブに何が起きているかを即座にフィードバックできます。画面上で、デバイス上に構築された 偽の ファイルシステムがアクセス、読み取り、または書き込みされたかどうかを確認できます:
また、バージョン 0.8.0 以降では、USB ホストとして使用して BADUSB デバイスを検出することもできます:
これはシリアルポートで利用できる BADUSB デバッガの例です:
動画の方がお好みなら、私の Insomni'hack プレゼンテーション もご覧いただけます。
バージョン 0.15.0 から、新しい Pi Pico Watch バージョンがサポートされています。新しいバージョンをコンパイルするには、コードの先頭にある #define PIWATCH 行をコメントアウト解除する必要があります。ハードウェアは RP2040 ベースの 1.28 インチ TFT ディスプレイとウォッチボードです。詳細はこちらをご覧ください。
また、Waveshare RP2040-LCD-1.28 とも完全に互換性があります。
docs: プロジェクトのドキュメント。全機能を確認できるプレゼンテーションを含みます
firmware: Raspberry Pi Pico 用のビルド済みファームウェア。これらをそのままボードに書き込んで使えます。32 行または 64 行 OLED、Pico 1 または Pico2、Pi Pico Watch など、複数のバージョンがあります
PCB: カスタム PCB を発注したい場合の Gerber ファイル。必須ではありません。独自のものを使うか、ブレッドボードで組み立てることもできます
src と data: 自分でファームウェアを変更・ビルドしたい場合のソースコード
utils: カスタム FS を構築するために使えるユーティリティ
pictures: このドキュメントで使われている画像とリソース
STL: エンクロージャ用の STL ファイル。1.1 と 1.2 フォルダには完全なエンクロージャがあります (WhistleMaster に感謝)。1.2_64 と 1.2_64_simple フォルダには 128x64 スクリーン用のエンクロージャがあります (rtmq0227 に感謝)。LCD を保護するための軽量なものが欲しい場合は、USBvalve_sliding_cover.stl をお使いください。
自分で作る場合は、次のものが必要です:
0.x.x バージョンでは、BOOTSEL を使用してデバイスのリセットや HID イベント数の表示 (2 秒以上押下) を行っていました。
BOOTSEL のポーリングは BADUSB 検出にいくつかの問題を引き起こしていたため、この機能はバージョン 1.0.0 で削除され、次の 2 つのオプションに置き換えられました:
GP0 と GND (パッド 1 と 3、例は下の写真を参照) の間にボタンをはんだ付けするr (リセット) と h (HID イベント) を使用する
PCB には、パッド 1 と 3 にボタン取り付けを容易にする穴が開いたバージョン 1.3 のボードも用意されています。ただし、ご覧のとおり、古いバージョンも使用できます。
BADUSB 機能を使用しない場合や、検出範囲を減らしても BOOTSEL の使用を維持したい場合は、bootsel を有効にして作成したファームウェアも提供しています (フォルダとリリースを参照してください)。
Tz1rf のおかげで、素晴らしい動画が 2 本あります: ビルド プロセスをステップバイステップで解説した動画と、ファームウェアのアップロード とツールの使用方法を示した動画です。
ほとんどすべての処理はソフトウェアによってボード上で直接行われるため、出力用の OLED との接続を用意するだけです。
ファームウェアのバージョン 0.8.0 以降、USBvalve は HID デバイスを検出できます (BADUSB の検出に使用)。これには、ホストとして動作する追加の USB ポートが必要です。この機能が不要な場合は、docs フォルダ 内の古い手順を使用し、PCB バージョン 1.1 を使用できます。それ以外の場合は、PCB バージョン 1.2 に進んでください (USB-A または USB-B 用のバージョンがあります。フォルダを参照してください)。
USBH エリアに USB メスコネクタをはんだ付けします。これはバージョン A 用ですが、お好みで USB Micro-B 用のバージョンもあります一部の OLED では GND と VCC の PIN が入れ替わっているため、両方のバージョンに対応できるように PCB を設計しました:
たとえば、お使いの OLED が次のように PIN1 に GND、PIN2 に VCC の場合:
PCB の裏面にある次の 2 つのパッドにはんだの玉を置く必要があります:
それ以外の場合は逆で、もう一方の PAD にはんだを置く必要があります:
ブレッドボードや配線のみを使用する場合、OLED スクリーンとホスト USB ポートに正しい PIN が接続されていることを確認するだけです。
対応は次のとおりです:
DEBUG 機能を使用したい場合は、ボード下部の 3 つの SWD PIN にヘッダを取り付けることもできます。
[!CAUTION] この PCB は経験豊富な電子工作製作者向けです 扱う自信がない場合は使用しないでください!
[!NOTE] R7 と R8 は実際には何にも接続されていません。これらは回路デバッグ用に追加されています。 そのため BOM には記載されていません
USBpipe はこのプロジェクト専用の PCB です。
必要なものはすべて ./PCB/USBpipe/ フォルダにあります。
ファームウェアを書き込むには、次の手順に従ってください:
RPI-RP2 という名前の新しいドライブが表示されます (Linux 環境では手動でマウントする必要がある場合があります)uf2) をフォルダにコピーします完了です!
そういうことが実際にあるかどうかはわかりませんが、USBvalve を認識する マルウェアによる検出を避けるために、ファームウェアをカスタマイズしたいと思うかもしれません :-)
変更したいと思うであろう変数のほとんどを usb_config.h のこのセクションにまとめました (再ビルドについては下の Dockerfile を参照)
// USB anti-detection settings
//
// Set USB IDs strings and numbers, to avoid possible detections.
// Remember that you can cusotmize FAKE_DISK_BLOCK_NUM as well
// for the same reason. Also DISK_LABEL in ramdisk.h can be changed.
//
// You can see here for inspiration: https://the-sz.com/products/usbid/
//
// Example:
// 0x0951 0x16D5 VENDORID_STR: Kingston PRODUCTID_STR: DataTraveler
//
#define USB_VENDORID 0x0951
#define USB_PRODUCTID 0x16D5
#define USB_DESCRIPTOR "DataTraveler"
#define USB_MANUF "Kingston"
#define USB_SERIAL "123456789A"
#define USB_VENDORID_STR "Kingston" // Up to 8 chars
#define USB_PRODUCTID_STR "DataTraveler" // Up to 16 chars
#define USB_VERSION_STR "1.0" // Up to 4 chars
もちろん、独自のファームウェアをビルドすることもできます。ビルドには Raspberry Pi Pico SDK とこのリポジトリが必要です。
基本的な再コンパイル手順:
export PICO_SDK_PATH=</path/to/pico-sdk>
git clone --recursive https://github.com/cecio/USBvalve.git
cd USBvalve
mkdir build && cd build
cmake -DPICO_BOARD=pico .. # or pico2 for standard build
make -j$(nproc)
# Output: build/src/USBvalve.uf2
新しい偽のファイルシステムを作成したい場合は、utils フォルダを見てください。新しいファイルシステムを構築するためのユーティリティをいくつか置いています。
独自のファームウェアをビルドしたい場合、カスタマイズ後、完全なビルド環境を構築してファームウェアをコンパイルする Dockerfile を提供しています。
ビルドするには、メインの USBvalve フォルダで次のコマンドを実行します:
# To Build:
# docker build -t usbvalve-sdk -f Dockerfile.sdk .
#
# To Run (default: pico, SSD1306 OLED 128x32):
# docker run --rm -v $PWD:/mnt usbvalve-sdk
#
# Options (via environment variables):
# BOARD=pico|pico2 Board target (default: pico)
# OLED_HEIGHT=32|64 OLED display height (default: 32)
# PIWATCH=1 Use GC9A01 round TFT instead of SSD1306
# USE_BOOTSEL=1 Enable BOOTSEL button (disrupts Low Speed USB)
#
# Examples:
# docker run --rm -e BOARD=pico2 -v $PWD:/mnt usbvalve-sdk
# docker run --rm -e PIWATCH=1 -v $PWD:/mnt usbvalve-sdk
# docker run --rm -e BOARD=pico2 -e OLED_HEIGHT=64 -v $PWD:/mnt usbvalve-sdk
ファームウェアは USBvalve_out フォルダに拡張子 uf2 で配置されます。
アイデアや改善案があれば、ぜひ Issue を開いて一緒にプロジェクトを改善しましょう! ありがとうございます!
質問やサポートが必要な場合は、ここで Issue を開くか、Twitter/X の @red5heep までご連絡ください。
コミュニティは、他のボードのサポートやその他の変更を実装したフォークをいくつか作成しました。USBvalve の開発に貢献してくれたすべての人に感謝します。 以下は非公式・不完全・サポート対象外のリストです:
[!WARNING] USBvalve と USB キラーデバイス について多くの質問を受け取ってきました。USBvalve はこれらのデバイスをテストするためのものではなく、いかなる絶縁や保護も備えていません。これらのデバイスの 1 つを扱っている疑いがある場合は、USBvalve ではなく他のものでテストしてください。デバイス、自分自身、または周囲の物を損傷する可能性があります。