Làm cách nào để ghi dữ liệu thô vào thiết bị USB


9

Tôi đang cố ghi dữ liệu thô vào thiết bị USB được kết nối với máy tính của mình. Tôi đang sử dụng Kali Linux và tôi đã tìm thấy filepath chính xác: "/ dev / usb / 003/013". Tuy nhiên, khi tôi cố gắng ghi dữ liệu vào nó, tôi gặp lỗi.

root@kali:~/usb# printf "test" > /dev/bus/usb/003/013
bash: printf: write error: Invalid argument

Tôi cũng đã thử sử dụng mèo:

root@kali:~/usb# cat test > /dev/bus/usb/003/013 
cat: write error: Invalid argument

Trong trường hợp trước, tệp 'test' không tồn tại và có dữ liệu trong đó. Dường như hệ thống không thể ghi vào bộ mô tả tập tin mặc dù nó ở đó.

Sau khi nghiên cứu tôi đã đi đến kết luận rằng bạn cũng vậy:

A. Cần trình điều khiển USB sẽ giao tiếp với thiết bị.

B. Sử dụng SCSI Pass Through để ghi dữ liệu trực tiếp vào Điểm cuối trên thiết bị.

Tôi chưa quen với lập trình USB và mặc dù tôi đang thử trò chơi, tôi chưa bao giờ viết trình điều khiển trước đây. Bất kỳ lời khuyên hoặc giúp đỡ sẽ được đánh giá cao.

Có thể ghi dữ liệu thô vào Thiết bị như tôi đã thử ban đầu không? Nếu không, bạn có thể giải thích một số tùy chọn có sẵn cho tôi?


1
Tôi không siêu giỏi với kịch bản shell, nhưng echo "test" > /dev/bus/usb/003/013thay vì thử printfthì sao? Ngoài ra, đây có thể là một câu hỏi liên quan có thể giúp đỡ.
Nghịch lý

2
Các thiết bị USB phức tạp hơn nhiều so với các ống đơn giản bạn đọc và viết. Bạn sẽ phải viết mã để thao tác chúng. Bạn không cần phải viết trình điều khiển kernel. Xem libusb.org libusb.sourceforge.net/api-1.0 . Điều này có thể là dành riêng cho Linux.
Edward Falk

@EdwardFalk nếu bạn sẽ đưa ra câu trả lời kèm theo thì tôi sẽ chấp nhận nó là giải pháp. Cảm ơn vì tiền hỗ trợ!
Brian Sizemore

Chắc chắn rồi; Tôi cũng sẽ gửi thêm một chút thông tin.
Edward Falk

Câu trả lời:


16

Các thiết bị USB phức tạp hơn nhiều so với các ống đơn giản bạn đọc và viết. Bạn sẽ phải viết mã để thao tác chúng. Bạn không cần phải viết trình điều khiển kernel. Xem http://libusb.info (nhũ danh libusb.org) và http://libusb.sourceforge.net/api-1.0 . Điều này khẳng định sẽ hoạt động với Linux, OSX, Windows, Android, OpenBSD, v.v. Trong Mac OS X, có các chức năng cấp người dùng trong I / O Kit sẽ cho phép bạn truy cập USB. Trong Windows, bạn có thể sử dụng WinUSB, nhưng nó phức tạp.

Đây là một sơ đồ nhỏ mà tôi đã vẽ một lần để giúp tôi hiểu kiến ​​trúc của USB:

                 ╭──────────────────────────────────────╮
    ┌──────┐     │   device     ┌─────┐  ┌───────────┐  │
    │ Port ├──┐  │            ┌─┤ EP0 ├──┤ control   │  │
    └──────┘  │  │ ┌────────┐ │ └─────┘  │┌─────────┐│  │
              ├────┤addr = 2├─┤ ┌─────┐  ││         ││  │
              │  │ └────────┘ ├─┤ EP1 ├──┼┤interface││  │
              │  │            │ └─────┘  ││   #0    ││  │
              │  │            │ ┌─────┐  │├─────────┤│  │
              │  │            ├─┤ EP2 ├──┼┤         ││  │
              │  │            │ └─────┘  ││interface││  │
              │  │            │ ┌─────┐  ││   #1    ││  │
              │  │            └─┤ EP3 ├──┼┤         ││  │
              │  │              └─────┘  │└─────────┘│  │
              │  │                       └───────────┘  │
              │  ╰──────────────────────────────────────╯
              │
              │
              :

Tóm tắt điều hành: mọi thiết bị đều có một địa chỉ (được chỉ định bởi O / S và có thể thay đổi) và tối đa (tôi nghĩ) 32 điểm cuối.

Trong thiết bị có một hoặc nhiều "giao diện". Ví dụ: một web cam có thể cung cấp giao diện "camera" và giao diện "micrô". Một máy in đa chức năng sẽ cung cấp một số giao diện.

Điểm cuối 0 được sử dụng để điều khiển và cấu hình thiết bị và các điểm khác là để truy cập các giao diện khác nhau. Mỗi giao diện có 0 hoặc nhiều hơn (thường là nhiều hơn) điểm cuối.

Điểm cuối có thể là một trong một số loại chuyển:

  • Kiểm soát chuyển được sử dụng để truy vấn và cấu hình thiết bị. Mỗi thiết bị được yêu cầu để hỗ trợ một tập hợp các câu lệnh điều khiển tối thiểu. Tôi tin rằng chuyển điều khiển chỉ được sử dụng với điểm cuối 0.
  • Chuyển số lượng lớn gửi hoặc nhận dữ liệu ở băng thông đầy đủ
  • Chuyển khoản bị gián đoạn (Tôi không thực sự chắc chắn điều này khác với chuyển khoản số lượng lớn như thế nào; USB không bị gián đoạn). Ví dụ bao gồm bàn phím và chuột
  • Chuyển đồng bộ gửi hoặc nhận dữ liệu ở băng thông đầy đủ với các yêu cầu thời gian thực nhưng không có độ tin cậy. Được sử dụng cho các ứng dụng âm thanh / video.

Cũng đáng chú ý: một thiết bị USB có thể có nhiều cấu hình, điều khiển các giao diện có sẵn và vv. Thay đổi cấu hình thiết bị gần giống như rút phích cắm của thiết bị và cắm một thiết bị khác vào vị trí của nó.

Tất cả các thông tin này được trình bày trong các mô tả thiết bị, mô tả cấu hình, mô tả giao diện, mô tả điểm cuối, v.v., có thể được truy vấn thông qua điểm cuối không.

(Bên trong, dữ liệu không phải là một luồng byte, nó được đóng gói thành các gói có định dạng chính xác là một phần của đặc tả USB. Đối với hầu hết các phần, bạn không cần phải lo lắng về điều này vì bộ điều khiển và trình điều khiển sẽ quản lý phần này cho bạn.)

Trong thực tế, tùy thuộc vào thư viện API và hệ điều hành của bạn, bạn sẽ cần phát hiện thiết bị, đọc các mô tả khác nhau để tìm hiểu những gì bạn đang xử lý, tùy ý đặt cấu hình của nó (nếu HĐH cho phép), mở giao diện, và mở các điểm cuối.

Đối với các điểm cuối số lượng lớn, bạn có thể đọc và ghi dữ liệu thô cho chúng. Để chuyển điều khiển, thư viện API sẽ cung cấp các lệnh gọi hàm. Tôi chưa bao giờ sử dụng chuyển khoản gián đoạn hoặc đẳng thời; Tôi chắc rằng thư viện API của bạn sẽ có tài liệu liên quan.


Thông tin thêm: "Chức năng" là tập hợp các giao diện hoạt động cùng nhau. Ban đầu, đây không phải là một phần của thông số kỹ thuật USB và tùy thuộc vào trình điều khiển thiết bị để biết các giao diện nào sẽ được nhóm lại với nhau. Nhóm làm việc USB đã xác định các lớp thiết bị hỗ trợ các chức năng. Điều này được thực hiện thông qua Bộ mô tả Hiệp hội Giao diện (IAD).


1
URL libusb được cập nhật là libusb.info
JellicleCat

Tại sao nó di chuyển?
Edward Falk

Điều gì xảy ra nếu tôi là một kẻ nổi loạn và muốn gửi các gói không tuân thủ, như trong một cuộc tấn công lạm dụng giao thức?
AJMansfield

1
Tôi ủng hộ điều này bởi vì đây là một bản tóm tắt thực sự hay về USB.
Amr Bekhit

1
Ý của bạn là sử dụng EP2 hai lần trong sơ đồ của bạn?
DeepDeadpool
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.