
USB 활동을 실시간으로 노출

[!NOTE] USBvalve 버전 1.0.0
애플리케이션이 완전히 재작성되었습니다:
- Arduino IDE 환경에서 벗어나 이제 코드는 Pi Pico SDK용으로 작성되었습니다
- 외부 라이브러리에 대한 의존성이 크게 줄었습니다
- Low Speed 장치(ATTiny85, EvilCrow 등)에 대한 USB 호스트 지원이 더욱 견고해졌습니다
- 하드웨어와 기능은 거의 변경되지 않았습니다. 자세한 내용은 아래 참고 사항을 확인하세요
저처럼, 여러분도 알 수 없는 장치에 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에서 제거되었고, 다음과 같은 두 가지 옵션으로 대체되었습니다:
GP0와 GND 사이에 버튼을 납땜하여(패드 1과 3, 예시는 아래 사진 참조) 동일한 기능을 사용r(리셋) 및 h(HID 이벤트) 명령 사용
PCB에는 패드 1과 3에 버튼 장착을 용이하게 하기 위한 구멍이 있는 보드 버전 1.3도 있습니다. 하지만 보시다시피 이전 버전을 사용해도 됩니다.
BADUSB 기능을 사용하지 않거나, 탐지 범위가 줄어들더라도 BOOTSEL 사용을 유지하고 싶다면, bootsel이 활성화된 펌웨어도 제공하고 있습니다(폴더 및 릴리스 참조).
Tz1rf 덕분에 두 개의 훌륭한 영상도 있습니다: 하나는 빌드 과정을 단계별로 설명하고, 다른 하나는 펌웨어 업로드 및 도구 사용 방법을 보여줍니다.
거의 모든 작업은 소프트웨어에 의해 보드에서 직접 수행되므로, 출력을 위한 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 뒷면의 이 두 패드에 납땜 덩어리를 올려야 합니다:
그렇지 않으면 반대로 다른 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/
//
#define USB_VENDORID 0xCAFE
#define USB_PRODUCTID 0x1337
#define USB_DESCRIPTOR "DataStore"
#define USB_MANUF "USB Acme"
#define USB_SERIAL "123456789A"
#define USB_VENDORID_STR "Acme" // Up to 8 chars
#define USB_PRODUCTID_STR "DataStore" // 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를 열거나 Twitter/X @red5heep로 연락해 주세요.
커뮤니티에서 다른 보드 지원이나 기타 수정 사항을 구현한 몇 가지 포크를 만들었습니다. USBvalve 개발에 기여해 주신 모든 분들께 감사드립니다. 아래는 비공식/불완전/지원되지 않는 목록입니다:
[!WARNING] USBvalve와 USB 킬러 장치에 관한 많은 질문을 받았습니다. USBvalve는 이러한 장치를 테스트하기 위해 만들어진 것이 아니며, 어떤 종류의 절연이나 보호 기능도 없습니다. 따라서 이러한 장치를 다루고 있다고 의심된다면 다른 것으로 테스트하세요. USBvalve로 테스트하지 마세요. 그렇지 않으면 장치, 자신 또는 주변 물체가 손상될 수 있습니다.