Xlera8

Thiết bị tương tác với con người: Đóng gói cho vụ cướp mô tả

Chúng tôi bắt đầu với tìm ra mô tả HID một tuần trướcvà tôi đã chỉ cho bạn cách gửi các gói HID thô bằng cách sử dụng nhánh MicroPython. Chúng tôi vẫn còn nhiệm vụ trước mắt – chế tạo một thiết bị màn hình cảm ứng. Để làm được điều đó, hãy cung cấp cho bạn các công cụ để ghi lại bộ mô tả hiện có từ màn hình cảm ứng, sau đó chỉ cho bạn cách điều chỉnh nó và cuối cùng nó sẽ thành ra như thế nào.

Đóng gói cho vụ cướp

Khi tham gia vào cuộc phiêu lưu kiểu này, chúng ta không thể thiếu công cụ và vũ khí - nó có thể nguy hiểm! Nếu không có chúng, bạn thậm chí có thể bỏ dở dự án của mình giữa chừng! Ở đây có đủ các công cụ và đạn dược có độ chính xác cao để giúp bạn vượt qua mọi trở ngại mà bạn có thể gặp phải. Ngoại trừ các công cụ dựa trên web, các công cụ này đều dành cho Linux, nhưng hãy nhớ rằng bạn luôn có thể sử dụng máy ảo hoặc Raspberry Pi. Dù sao đi nữa, không ai sẽ sử dụng Windows để thực hiện một vụ trộm, với tất cả các phép đo từ xa và những thứ tương tự.

Công cụ đầu tiên là để đọc phần mô tả – chúng ta cần một công cụ để học hỏi, nó giống như thẻ khóa mà bạn có thể đưa cho nhân viên bảo vệ và quét tại lối vào kho tiền. Tất nhiên, với RFID, bạn muốn có đủ ví dụ, so sánh các bit giữa một vài thẻ và tất cả. Hiện tại, bộ mô tả HID không có tính năng kiểm tra tính xác thực, nhưng có vẻ như điều đó có thể thay đổi trong tương lai. Hãy để Apple và Microsoft thêm chúng vào như thường lệ. Trên Linux, việc xem các bộ mô tả rất đơn giản – với quyền root, hãy truy cập /sys/bus/usb/devices/, tìm thiết bị của bạn bằng lsusb đường dẫn cây thiết bị, sau đó đi theo thư mục có VID/PID trong đó. Thư mục đó sẽ chứa một report_descriptor tập tin - hexdump Nó. Toàn bộ lệnh có thể trông như thế này:

sudo hexdump -v -e '/1 "%02X "' /sys/bus/usb/devices/3-6.2/3-6.2:1.1/0003:0C40:8000.0022/report_descriptor`

Một lần nữa, bạn có thể cần root để tìm đường dẫn này, vì vậy hãy sử dụng sudo -i nếu bạn phải. Chuỗi định dạng trong hexdump lệnh cung cấp cho bạn đầu ra thân thiện với trình phân tích cú pháp. Cụ thể, để phân tích cú pháp, tôi sử dụng trang web này – thật tuyệt vời, thậm chí còn thêm các tab mô tả các phần khác nhau của bộ mô tả, làm cho đầu ra của nó trở nên dễ đọc hơn! Bạn cũng có thể lưu trang web này cục bộ, đây là một công cụ rất gọn gàng. Ngoài ra, bạn có thể thử các công cụ cục bộ khác như này!

Bây giờ, bạn đã có một bộ mô tả cho một thiết bị có hành vi mà bạn muốn bắt chước và bạn có thể phân tích cú pháp nó để xem điều gì khiến nó đánh dấu. Tuyệt vời! Nhưng không phải cái gì bạn có thể hiểu ngay lập tức, chưa phải ngay bây giờ? Chỉ riêng bộ mô tả không đủ để xây dựng một bản đồ tư duy, nó có thể chứa nhiều ID báo cáo và một số bộ mô tả sẽ đủ chung chung để gây nhầm lẫn. Ví dụ: thay vào đó, nhiều thiết bị có bộ mô tả thực sự là điểm cuối cho các bản cập nhật chương trình cơ sở, vì vậy, bạn có thể mất thời gian để tìm hiểu xem khi nào bộ mô tả thực sự không bao giờ được sử dụng. Chúng ta hãy xem thiết bị của chúng ta thực sự gửi những gì khi chúng ta tương tác với nó, ID báo cáo nào chúng ta nên tìm hiểu – và quan trọng nhất là cách hệ điều hành Linux diễn giải nó.

Để làm được điều đó, chúng ta chỉ cần VID và PID. Với quyền root một lần nữa, hãy truy cập /sys/kernel/debug/hid/, tìm thư mục có VID và PID của bạn, sau đó cat của nó events tài liệu. Trong đó, bạn sẽ tìm thấy mô tả được in đẹp mắt mà con người có thể đọc được về mọi sự kiện bạn nhận được từ thiết bị của mình ngay khi nó xuất hiện. Đôi khi quá trình in bị trục trặc và dừng giữa chừng – có thể có vấn đề gì đó xảy ra cat'ed, nhưng nó thường không mất mát lớn. Đây là một cách tuyệt vời để xem điều gì thực sự xảy ra khi thiết bị HID của bạn hoạt động. Byte đầu tiên là ID báo cáo, sau đó gói được in theo cách nhận được và sau đó, chúng tôi thấy kết quả phân tích cú pháp từ HĐH. Nó chỉ đơn giản là một công cụ tuyệt vời để có! Đây là một dòng lệnh ví dụ:

sudo cat /sys/kernel/debug/hid/0003:2E8A:0005.0029/events

Cuối cùng nhưng không kém phần quan trọng, bạn sẽ muốn có một cách để xem các sự kiện khi các lớp đầu vào của hệ điều hành của bạn thực sự diễn giải chúng. Có, điều đó khác – nếu một gói đến, nó không nhất thiết phải được chuyển đổi thành sự kiện đầu vào ở cấp hệ điều hành, đôi khi nó bị loại bỏ vì không đáp ứng một điều kiện nhất định. Ví dụ: tại một thời điểm nào đó, các gói màn hình cảm ứng của tôi đã bị loại bỏ vì tôi chỉ gửi tọa độ và bỏ sót một thông tin quan trọng cho hệ điều hành biết rằng màn hình cảm ứng hiện đang truyền tải một sự kiện chạm hợp lệ chứ không phải một cú chạm giả. Bit đó ở phía trước và trung tâm trong 'Appnotes' của Microsoft về xây dựng số hóavà nhận thấy rằng hệ điều hành của tôi không 'tiếp nhận' các sự kiện do tôi xây dựng là động lực khiến tôi cần xem qua chú thích và kiểm tra xem gói của tôi có thể bị thiếu gì.

Đối với điều này, tôi có tập lệnh Python nhỏ của riêng tôi in ra các sự kiện khi chúng được các lớp thư viện đầu vào nhận được và tập lệnh này đã phục vụ tôi được khoảng một thập kỷ nay. Chỉ cần tải xuống và chạy nó – bạn sẽ cần cài đặt thư viện `evdev` của Python, nhưng nó có sẵn từ cả kho Debian/Ubuntu và cả `pip`. Bạn cũng cần chạy cái này với quyền root, nhưng điều đó xảy ra khi bạn chạy nó dưới dạng `./listen_keys.py` một cách tự động.

Tôi thích chạy tất cả các lệnh khác nhau trong tmux, các ngăn nhỏ khác nhau dành cho các tác vụ đang diễn ra khác nhau – đây là không gian làm việc của tôi khi tôi đang phát triển và gỡ lỗi mã màn hình cảm ứng, trong đó a) hiển thị bản in sự kiện HID thô, b) hiển thị bản in mô tả HID và c) hiển thị mã hiển thị sự kiện đầu vào.

Sự cải trang hoàn hảo

Với những công cụ này, việc tạo ra một màn hình cảm ứng chỉ là công việc trong một buổi tối. Tôi đã có tọa độ từ thư viện XPT2046 mà tôi đang sử dụng, vì vậy tất cả những gì tôi phải làm là xây dựng một bộ mô tả. Ban đầu, tôi nghĩ sẽ sử dụng lại bộ mô tả “chuột vị trí tuyệt đối” được [] cung cấp một cách hữu ích cùng với mã, nhưng tập lệnh in sự kiện đầu vào đã cho tôi thấy rằng ngay cả thao tác nhấn nút chuột từ tập lệnh đó cũng không được giao diện người dùng chọn – và trong khi Các sự kiện MOUSE_ABS đã xuất hiện, chúng không ảnh hưởng đến máy tính để bàn của tôi dưới bất kỳ hình thức nào.

Việc gỡ lỗi bộ mô tả chuột nghe có vẻ không thú vị, đặc biệt là khi tôi thậm chí còn không có một con chuột nào có thể hoạt động được để học hỏi! Thay vào đó, tôi quyết định xây dựng lại bộ mô tả chuột tuyệt đối thành bộ mô tả số hóa, vì tôi có cả bộ mô tả số hóa và các gói! Bộ mô tả chuột tuyệt đối đã được hiển thị một cách hữu ích trong các nguồn MicroPython riêng biệt và cũng đã sẵn sàng để điều chỉnh! Thay đổi USAGEUSAGE_PAGE Riêng các danh mục với bộ mô tả của màn hình cảm ứng USB đã khiến hệ điều hành của tôi nhận ra bo mạch RP2040 của tôi là bộ số hóa.

Những thay đổi thực tế không phức tạp – thư viện XPT2046 cung cấp hai tọa độ số nguyên, vì vậy tôi đã sao chép cấu trúc từ một bộ mô tả mô tả một giá trị X và một giá trị Y, mỗi giá trị dài 16 bit và do đó chia thành hai byte mỗi giá trị, giống như màn hình cảm ứng USB của tôi. Với sự trợ giúp của cơ chế in gỡ lỗi gói HID, tôi có thể nhanh chóng nhận thấy khi nào byte trên và byte dưới của tôi bị hoán đổi vì hệ điều hành của tôi không diễn giải chính xác tọa độ. Sau khi khắc phục điều đó, các gói của tôi sẽ được phân tích cú pháp chính xác nhưng không xuất hiện trong số các sự kiện đầu vào và so sánh các gói màn hình cảm ứng USB do nhà máy sản xuất với các gói được tạo thủ công trên màn hình cảm ứng DIY của tôi, tôi có thể nhận thấy rằng một bit "chạm hợp lệ" đã mất tích. Việc thêm vào đó khiến thiết bị hoạt động giống như một màn hình cảm ứng cho mọi ý định và mục đích!

Bây giờ, tôi có một màn hình cảm ứng kết nối USB DIY và tất cả những gì tôi cần là đánh cắp bộ mô tả HID từ một màn hình cảm ứng khác, sau đó bắt chước nó đủ chặt chẽ. Ngoài ra, bất cứ khi nào tôi muốn, tôi có thể chuyển màn hình cảm ứng của mình sang chế độ bàn di chuột bằng cách yêu cầu nó gửi các gói có ID báo cáo khác tương ứng với bộ mô tả chuột của chương trình cơ sở – nó chỉ thiếu hai nút chuột để trở thành một bàn di chuột hoàn chỉnh cho máy tính xách tay! Vì tôi đang sử dụng tính năng này để tạo nguyên mẫu cho một màn hình có thể đeo được nên nó sẽ vô cùng hữu ích.

Trong và ngoài, chúng tôi đảm bảo hàng hóa

Hiện tại, màn hình cảm ứng USB mới được đặt tên cần một số tính năng lọc và hiệu chỉnh, nhưng đó chỉ là những bản sửa lỗi nhỏ – có thể cũng có thể ăn cắp một số thuật toán lọc từ trình điều khiển Linux XPT2046! Nó có tính năng cắm và chạy, dễ sử dụng và có thể hack được – không còn là màn hình cảm ứng SPI như mong đợi nữa. Trên hết, đây là một ví dụ tuyệt vời rằng, nếu bạn muốn xây dựng một thiết bị HID hơi lập dị thì không khó để thực hiện điều đó và Linux cung cấp cho bạn một bộ công cụ mạnh mẽ giúp bạn nhận thấy bất kỳ vấn đề HID nào cho dù bạn muốn đến mức nào. đi.

Có rất nhiều điều bạn có thể làm nếu hiểu được HID. Ví dụ: bạn có thể tạo một màn hình chữ nổi có khả năng tương thích chéo mà không gặp khó khăn với số sê-ri USB-UART. Qua trên Hackaday Discord, [mupf] đã tấn công vào một thiết bị tương thích với Bộ điều khiển Thích ứng XBox sử dụng từ kế và con quay hồi chuyển để gửi HĐH, với bộ mô tả HID được cung cấp thông tin chính xác bởi bộ mô tả bị loại bỏ của Bộ điều khiển Thích ứng Xbox gốc. Đặc tả HID mô tả rất nhiều thứ, thậm chí cả màn hình ký tự được kết nối USB và những thứ như – bạn có thể gửi quaternion với sự trợ giúp của HID, trong mọi thứ!

Hỗ trợ HID giúp thiết bị đầu vào của bạn trở nên thân thiện và giúp thiết bị tương tác tốt hơn trong thế giới phần mềm. Về cốt lõi, HID là ngôn ngữ được tất cả các hệ điều hành chính hiểu và việc cung cấp cho thiết bị của bạn giao diện HID cho phép bạn tránh thêm một lớp ngôn ngữ độc quyền giữa thiết bị của mình và bất kỳ loại phần mềm nào bạn muốn tương tác. Và tất nhiên, HID là một công cụ hacker tuyệt vời – chỉ riêng công cụ tự động hóa điện thoại thông minh này sẽ chứng minh điều đó!

Lần tới, tôi muốn cho bạn biết thêm về I2C HID – gửi các gói và bộ mô tả HID qua I2C mà không cần cổng USB và chỉ sử dụng kết nối I2C, hiện nay khá phổ biến! Trong bối cảnh đó, tôi sẽ chỉ cho bạn cách sử dụng lại bàn di chuột của máy tính xách tay Framework, sử dụng I2C-HID để liên lạc. Tôi hy vọng sửa đổi QMK để chúng tôi có thể thực hành thêm bàn di chuột I2C vào bất kỳ bàn phím nào do QMK điều khiển, nhưng chúng tôi có thể chỉ giải quyết việc sửa đổi KMK, tương đương với QMK nhưng trong CircuitPython. Tôi cũng sẽ chỉ cho bạn cách bạn có thể nhanh chóng kết nối thiết bị I2C-HID với Linux SBC của bạn – điều đó dễ dàng hơn bạn tưởng! Và, nếu các ngôi sao căn chỉnh và hỗ trợ chế độ ngoại vi I2C trong RP2040 MicroPython đủ ổn định, chúng tôi thậm chí có thể xây dựng thiết bị ngoại vi I2040C HID hỗ trợ RP2 của riêng mình như một món tráng miệng.

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?