เอ็กซ์เลร่า8

อุปกรณ์เชื่อมต่อระหว่างมนุษย์: บรรจุหีบห่อสำหรับการปล้น Descriptor

เราเริ่มต้นด้วย ค้นหาตัวอธิบาย HID เมื่อสัปดาห์ที่แล้วและฉันได้แสดงวิธีส่งแพ็กเก็ต HID แบบดิบโดยใช้ทางแยก MicroPython เรายังมีงานรออยู่ข้างหน้า นั่นคือการสร้างอุปกรณ์หน้าจอสัมผัส ในกรณีนี้ เราจะมอบเครื่องมือในการจับภาพคำอธิบายที่มีอยู่จากหน้าจอสัมผัส จากนั้นแสดงวิธีปรับแต่งและผลลัพธ์ที่ได้ในที่สุด

การบรรจุสำหรับการปล้น

เมื่อพูดถึงการผจญภัยประเภทนี้ เราไม่สามารถไปได้หากไม่มีเครื่องมือและอาวุธ - มันอาจจะอันตรายได้! หากไม่มีพวกเขา คุณก็สามารถละทิ้งโครงการของคุณได้ครึ่งทาง! นี่คือเครื่องมือและกระสุนที่มีความแม่นยำสูงเพียงพอที่จะพาคุณผ่านอุปสรรคใดก็ตามที่คุณอาจเผชิญ ยกเว้นเครื่องมือบนเว็บ เครื่องมือเหล่านี้มีไว้สำหรับ Linux แต่โปรดจำไว้ว่าคุณสามารถใช้เครื่องเสมือนหรือ Raspberry Pi ได้ตลอดเวลา ไม่มีใครจะใช้ Windows เพื่อปล้นอยู่แล้ว อะไรจะเกิดขึ้นกับการวัดและส่งข้อมูลทางไกลและอื่นๆ

เครื่องมือแรกมีไว้สำหรับการอ่านคำอธิบาย เราจำเป็นต้องเรียนรู้จากมัน มันเหมือนกับคีย์การ์ดที่คุณสามารถแฟลชให้เจ้าหน้าที่รักษาความปลอดภัยและสแกนที่ทางเข้าห้องนิรภัย แน่นอนว่าด้วย RFID คุณต้องมีตัวอย่างที่เพียงพอ เปรียบเทียบบิตระหว่างการ์ดสองสามใบกับการ์ดทั้งหมด ในตอนนี้ ตัวอธิบาย HID ยังไม่มีการตรวจสอบความถูกต้อง แต่ดูเหมือนว่า ที่อาจเปลี่ยนแปลงได้ในอนาคต ปล่อยให้ Apple และ Microsoft เพิ่มตามปกติ บน Linux การดู descriptor นั้นง่ายมาก โดยเข้าไปที่ root /sys/bus/usb/devices/ค้นหาอุปกรณ์ของคุณด้วย lsusb เส้นทางแผนผังอุปกรณ์ จากนั้นติดตามไดเร็กทอรีที่มี VID/PID อยู่ในนั้น ไดเร็กทอรีนั้นจะมีไฟล์ report_descriptor ไฟล์ - hexdump มัน. คำสั่งทั้งหมดอาจมีลักษณะดังนี้:

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

ขอย้ำอีกครั้งว่าคุณอาจต้องรูทเพื่อค้นหาเส้นทางนี้ ดังนั้นให้ใช้ sudo -i ถ้าคุณต้อง สตริงรูปแบบใน hexdump คำสั่งให้ผลลัพธ์ที่เป็นมิตรกับ parser โดยเฉพาะสำหรับการแยกวิเคราะห์ฉันใช้ หน้าเว็บนี้ – ยอดเยี่ยมมาก แม้จะเพิ่มแท็บที่อธิบายส่วนต่างๆ ของ descriptor ทำให้อ่านเอาท์พุตได้ง่ายขึ้น! คุณยังสามารถบันทึกหน้าเว็บนี้ไว้ในเครื่องได้ ซึ่งเป็นเครื่องมือที่เรียบร้อยมาก นอกจากนั้น คุณสามารถลองใช้เครื่องมือท้องถิ่นอื่น ๆ เช่น นี้อย่างใดอย่างหนึ่ง!

ตอนนี้ คุณมีคำอธิบายสำหรับอุปกรณ์ที่มีพฤติกรรมที่คุณต้องการเลียนแบบ และคุณสามารถแยกวิเคราะห์เพื่อดูว่าอะไรทำให้มันติ๊กได้ มหัศจรรย์! แต่ยังไม่ใช่สิ่งที่คุณจะเข้าใจได้ในทันที ไม่ใช่แค่ตอนนี้? คำอธิบายเพียงอย่างเดียวไม่ได้ช่วยในการสร้างแผนที่จิต แต่อาจมีรหัสรายงานหลายรายการ และคำอธิบายบางส่วนอาจกว้างเกินไปจนทำให้เกิดความสับสน ตัวอย่างเช่น อุปกรณ์จำนวนมากมีตัวอธิบายที่เป็นจุดสิ้นสุดสำหรับการอัพเดตเฟิร์มแวร์แทน ดังนั้นคุณอาจใช้เวลาในการพิจารณาว่าเมื่อใดที่ตัวอธิบายนั้นไม่เคยถูกใช้จริง ๆ มาดูกันว่าจริง ๆ แล้วอุปกรณ์ของเราส่งอะไรเมื่อเราโต้ตอบกับอุปกรณ์นั้น รหัสรายงานใดที่เราควรเรียนรู้ และที่สำคัญที่สุดคือ Linux OS ตีความมันอย่างไร

เพื่อสิ่งนั้น เราต้องการเพียง VID และ PID เท่านั้น เมื่อรูทอีกครั้งให้ไปที่ /sys/kernel/debug/hid/จากนั้นค้นหาไดเร็กทอรีที่มี VID และ PID ของคุณ cat ของมัน events ไฟล์. ในนั้นคุณจะพบคำอธิบายที่พิมพ์ออกมาอย่างสวยงามซึ่งมนุษย์สามารถอ่านได้ของทุกเหตุการณ์ที่คุณได้รับจากอุปกรณ์ของคุณทันทีที่ปรากฏ บางครั้งกระบวนการพิมพ์อาจผิดพลาดและหยุดลงกลางงาน ซึ่งอาจเป็นไปตามที่เป็นอยู่ cat'ed แต่โดยปกติแล้วจะไม่สูญเสียครั้งใหญ่ นี่เป็นวิธีที่ยอดเยี่ยมในการดูว่าเกิดอะไรขึ้นเมื่ออุปกรณ์ HID ของคุณมีกิจกรรม ไบต์แรกคือรหัสรายงาน จากนั้นแพ็กเก็ตจะถูกพิมพ์ในลักษณะที่ได้รับ และหลังจากนั้น เราจะเห็นผลการแยกวิเคราะห์จากระบบปฏิบัติการ มันเป็นเพียงเครื่องมือที่น่าทึ่ง! นี่คือตัวอย่างบรรทัดคำสั่ง:

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

สุดท้ายแต่ไม่ท้ายสุด คุณจะต้องการวิธีการดูเหตุการณ์ต่างๆ เนื่องจากเลเยอร์อินพุตของระบบปฏิบัติการของคุณตีความเหตุการณ์เหล่านั้นจริงๆ ใช่ สิ่งนี้แตกต่างออกไป หากแพ็กเก็ตมาถึง ไม่จำเป็นต้องแปลงเป็นเหตุการณ์อินพุตระดับ OS บางครั้งอาจถูกละทิ้งเนื่องจากไม่ตรงตามเงื่อนไขบางประการ ตัวอย่างเช่น ในบางจุด แพ็กเก็ตหน้าจอสัมผัสของฉันถูกทิ้งเพราะฉันส่งเพียงพิกัดเท่านั้น และละเว้นส่วนสำคัญในการบอก OS ว่าหน้าจอสัมผัสกำลังถ่ายทอดเหตุการณ์การสัมผัสที่ถูกต้องซึ่งตรงข้ามกับการสัมผัสปลอม บิตนั้นอยู่ด้านหน้าและตรงกลางใน 'appnotes' ของ Microsoft ในการสร้าง digitizerและการเห็นว่าระบบปฏิบัติการของฉันไม่ 'รับ' กิจกรรมที่สร้างขึ้นของฉันนั้นเป็นแรงผลักดันที่ฉันต้องดูใน appnote และตรวจสอบว่าแพ็กเก็ตของฉันอาจหายไป

สำหรับสิ่งนี้ฉันมี สคริปต์ Python ตัวน้อยของฉันเอง ที่พิมพ์เหตุการณ์ตามที่ได้รับจากเลเยอร์ไลบรารีอินพุต และสคริปต์นี้ให้บริการฉันมานานกว่าทศวรรษแล้ว เพียงดาวน์โหลดและเปิดใช้งาน คุณจะต้องติดตั้งไลบรารี่ `evdev` ของ Python แต่สามารถใช้งานได้จากทั้งที่เก็บ Debian/Ubuntu และ `pip` เหมือนกัน คุณต้องเรียกใช้สิ่งนี้ในฐานะรูท แต่จะเกิดขึ้นเมื่อคุณเรียกใช้เป็น `./listen_keys.py` โดยอัตโนมัติ

ฉันชอบรันคำสั่งต่าง ๆ เหล่านั้นทั้งหมด tmuxบานหน้าต่างเล็กๆ ที่แตกต่างกันสำหรับงานต่อเนื่องต่างๆ นี่คือพื้นที่ทำงานของฉันตอนที่ฉันกำลังพัฒนาและแก้ไขโค้ดหน้าจอสัมผัส โดยที่ a) แสดงการพิมพ์เหตุการณ์ HID แบบดิบ b) แสดงการพิมพ์ตัวอธิบาย HID และ c) แสดงโค้ดการแสดงเหตุการณ์อินพุต

การปลอมตัวที่สมบูรณ์แบบ

ด้วยเครื่องมือเหล่านี้ การสร้างหน้าจอสัมผัสจึงเป็นงานในตอนเย็น ฉันมีพิกัดจากไลบรารี XPT2046 ที่ฉันใช้ ดังนั้นสิ่งที่ฉันต้องทำคือสร้างคำอธิบาย ในตอนแรก ฉันคิดว่าจะนำคำอธิบาย "absolute position mouse" ที่ให้มาโดย [] มาใช้ใหม่พร้อมกับโค้ด แต่สคริปต์การพิมพ์เหตุการณ์อินพุตแสดงให้ฉันเห็นว่าแม้แต่การกดปุ่มเมาส์จากสคริปต์นั้นก็ไม่ได้รับการเลือกโดย UI - และในขณะที่ เหตุการณ์ MOUSE_ABS ปรากฏขึ้น โดยไม่ได้ส่งผลกระทบต่อเดสก์ท็อปของฉันแต่อย่างใด

การดีบักการทำงานของตัวอธิบายเมาส์นั้นฟังดูไม่สนุกเลย โดยเฉพาะอย่างยิ่งเมื่อฉันไม่มีเมาส์ที่ใช้งานได้จริงให้เรียนรู้ด้วยซ้ำ! แต่ฉันตัดสินใจสร้างตัวอธิบายเมาส์แบบสัมบูรณ์ขึ้นมาใหม่เป็นตัวอธิบาย digitizer เนื่องจากฉันมีทั้งตัวอธิบาย digitizer และแพ็กเก็ต! ตัวอธิบายเมาส์แบบสัมบูรณ์ได้รับการเปิดเผยอย่างเป็นประโยชน์ในแหล่ง MicroPython แยกจากกัน และพร้อมสำหรับการปรับแต่งด้วยเช่นกัน! การเปลี่ยน USAGE และ USAGE_PAGE หมวดหมู่เพียงอย่างเดียวกับคำอธิบายของหน้าจอสัมผัส USB ทำให้ระบบปฏิบัติการของฉันรู้จักบอร์ด RP2040 ของฉันว่าเป็นดิจิไทเซอร์

การเปลี่ยนแปลงจริงไม่ใช่เรื่องยุ่งยาก – ไลบรารี XPT2046 มีพิกัดจำนวนเต็มสองตัว ดังนั้นฉันจึงคัดลอกโครงสร้างจากตัวอธิบายที่อธิบายค่า X หนึ่งค่าและค่า Y หนึ่งค่า โดยแต่ละค่ามีความยาว 16 บิต ดังนั้น จึงแบ่งออกเป็นสองไบต์ต่อค่า เช่นเดียวกับหน้าจอสัมผัส USB ของฉัน ด้วยความช่วยเหลือของกลไกการพิมพ์ดีบักแพ็กเก็ต HID ฉันสามารถสังเกตได้อย่างรวดเร็วเมื่อไบต์บนและล่างของฉันถูกสลับ เนื่องจากระบบปฏิบัติการของฉันแปลพิกัดไม่ถูกต้อง เมื่อแก้ไขแล้ว แพ็กเก็ตของฉันจะถูกแยกวิเคราะห์อย่างถูกต้องแต่ไม่ปรากฏขึ้นในเหตุการณ์อินพุต และเมื่อเปรียบเทียบแพ็กเก็ตหน้าจอสัมผัส USB ที่ผลิตจากโรงงานกับแพ็กเก็ตที่สร้างขึ้นด้วยมือของหน้าจอสัมผัส DIY ของฉัน ฉันสังเกตเห็นว่าบิต "สัมผัสที่ถูกต้อง" หายไป การเพิ่มที่ทำให้อุปกรณ์ทำงานเหมือนหน้าจอสัมผัสสำหรับทุกจุดประสงค์และวัตถุประสงค์!

ตอนนี้ ฉันมีหน้าจอสัมผัสที่เชื่อมต่อ USB แบบ DIY และสิ่งที่ต้องทำก็แค่ขโมยตัวอธิบาย HID จากหน้าจอสัมผัสอื่น จากนั้นเลียนแบบมันอย่างใกล้ชิดพอ นอกจากนี้ เมื่อใดก็ตามที่ฉันต้องการ ฉันสามารถเปลี่ยนหน้าจอสัมผัสของฉันเป็นโหมดทัชแพดโดยให้ส่งแพ็กเก็ตที่มีรหัสรายงานอื่นที่ตรงกับตัวอธิบายเมาส์ของเฟิร์มแวร์ - ขาดเพียงสองปุ่มเมาส์เท่านั้นที่จะเป็นทัชแพดแล็ปท็อปที่สมบูรณ์! เนื่องจากฉันใช้สิ่งนี้เพื่อสร้างต้นแบบจอแสดงผลที่สวมใส่ได้ มันจะมีประโยชน์อย่างมาก

เรารับประกันสินค้าทั้งในและนอกสถานที่

ตามที่เป็นอยู่ หน้าจอสัมผัส USB ที่เพิ่งตั้งชื่อใหม่จำเป็นต้องมีการกรองและการสอบเทียบ แต่นั่นเป็นเพียงการแก้ไขเล็กๆ น้อยๆ – อาจขโมยอัลกอริธึมการกรองบางส่วนจากไดรเวอร์ Linux XPT2046 ได้เช่นกัน มันเป็น Plug&Play ใช้งานง่าย และสามารถแฮ็กได้ ไม่ได้เป็นหน้าจอสัมผัส SPI อย่างที่ควรจะเป็นอีกต่อไป ที่สำคัญที่สุด นี่เป็นตัวอย่างที่ดีว่า หากคุณต้องการสร้างอุปกรณ์ HID ที่แปลกประหลาดเล็กน้อย การทำเช่นนี้ก็ทำได้ไม่ยาก และ Linux ก็มีชุดเครื่องมืออันทรงพลังที่จะช่วยให้คุณสังเกตเห็นปัญหา HID ไม่ว่าคุณจะต้องการไกลแค่ไหนก็ตาม ไป.

มีหลายสิ่งที่คุณสามารถทำได้หากคุณเข้าใจ HID ตัวอย่างเช่น คุณสามารถสร้างจอแสดงผลอักษรเบรลล์ที่สามารถใช้งานร่วมกันได้ โดยไม่ต้องยุ่งยากกับหมายเลขซีเรียล USB-UART เกิน บน Hackaday Discord[mupf] ได้แฮ็กอุปกรณ์ที่เข้ากันได้กับ XBox Adaptive Controller ซึ่งใช้แมกนีโตมิเตอร์และไจโรเพื่อส่งระบบปฏิบัติการ โดยที่ HID descriptor ได้รับแจ้งอย่างหนักจาก descriptor ที่ถูกทิ้งของ Xbox Adaptive Controller ดั้งเดิม ข้อมูลจำเพาะ HID อธิบายสิ่งต่าง ๆ มากมาย แม้แต่การแสดงตัวอักษรที่เชื่อมต่อ USB และสิ่งต่าง ๆ เช่น คุณสามารถส่งควอเทอร์เนียนด้วยความช่วยเหลือของ HID ได้ทุกสิ่ง!

การรองรับ HID ทำให้อุปกรณ์อินพุตของคุณเป็นมิตรและช่วยให้โต้ตอบภายในโลกซอฟต์แวร์ได้ดีขึ้น โดยแก่นแท้แล้ว HID คือภาษาที่ระบบปฏิบัติการหลักทั้งหมดเข้าใจ และการให้อินเทอร์เฟซ HID แก่อุปกรณ์ของคุณจะช่วยให้คุณหลีกเลี่ยงการเพิ่มชั้นภาษาที่เป็นกรรมสิทธิ์ระหว่างอุปกรณ์ของคุณกับซอฟต์แวร์ประเภทใดก็ตามที่คุณต้องการโต้ตอบด้วย และแน่นอนว่า HID เป็นเครื่องมือแฮ็กเกอร์ที่ยอดเยี่ยม เครื่องมืออัตโนมัติของสมาร์ทโฟนเครื่องเดียวเท่านั้นที่จะเป็นพยานได้!

ครั้งต่อไป ฉันอยากจะแสดงให้คุณเห็นเพิ่มเติมเกี่ยวกับ I2C HID – การส่งแพ็กเก็ต HID และตัวอธิบายผ่าน I2C โดยไม่ต้องใช้พอร์ต USB เลย และใช้เฉพาะการเชื่อมต่อ I2C เท่านั้น ซึ่งตอนนี้ค่อนข้างแพร่หลายแล้ว! ในบริบทนั้น ฉันจะแสดงให้คุณเห็นถึงวิธีการนำทัชแพดของแล็ปท็อป Framework มาใช้ซ้ำ ซึ่งใช้ I2C-HID สำหรับการสื่อสาร ฉันหวังว่าจะแก้ไข QMK เพื่อให้เราสามารถฝึกเพิ่มทัชแพด I2C ให้กับคีย์บอร์ดที่ควบคุมโดย QMK ได้ แต่เราอาจตกลงกับการม็อด KMK ซึ่งเทียบเท่ากับ QMK แต่ใน CircuitPython ฉันจะแสดงให้คุณเห็นว่าคุณสามารถเชื่อมต่ออุปกรณ์ I2C-HID กับ Linux SBC ของคุณได้อย่างรวดเร็วได้อย่างไร – ง่ายกว่าที่คุณคิด! และหากการจัดเรียงดาวและการรองรับโหมดอุปกรณ์ต่อพ่วง I2C ใน RP2040 MicroPython มีความเสถียรเพียงพอ เราก็สามารถสร้างอุปกรณ์ต่อพ่วง I2040C HID ที่ขับเคลื่อนด้วย RP2 ของเราเองเป็นของหวานได้

แชทกับเรา

สวัสดี! ฉันจะช่วยคุณได้อย่างไร?