Naprave za povezovanje s človekom: pakiranje za rop deskriptorja

Naprave za povezovanje s človekom: pakiranje za rop deskriptorja

Izvorno vozlišče: 2470930

Začeli smo z ugotavljanje deskriptorjev HID pred enim tednomin pokazal sem vam, kako pošiljati neobdelane pakete HID z uporabo razcepa MicroPython. Še vedno pa je pred nami naloga – izdelava naprave z zaslonom na dotik. Za to vam ponudimo orodja za zajemanje obstoječega deskriptorja z zaslona na dotik, nato pa vam pokažemo, kako ga prilagoditi in kako se na koncu izkaže.

Pakiranje za rop

Ko gre za tovrstno pustolovščino, ne gre brez orodja in orožja – lahko je nevarno! Brez njih bi lahko celo opustili svoj projekt na pol poti! Tukaj je dovolj visokonatančnih orodij in streliva, da boste zdržali skozi vse ovire, na katere lahko naletite. Razen spletnih orodij so ta orodja za Linux, vendar ne pozabite, da lahko vedno uporabite virtualni stroj ali Raspberry Pi. Itak nihče ne bi uporabil Windows za ropanje, kaj je z vso telemetrijo in podobnim.

Prvo orodje je za branje deskriptorjev – potrebujemo ga, iz katerega se lahko učimo, je tako kot ključna kartica, ki jo lahko pošljete varnostniku in skenirate pri vhodu v trezor. Seveda, z RFID želite imeti dovolj primerov, primerjati bite med nekaj karticami in vse. Zaenkrat deskriptorji HID nimajo preverjanja pristnosti, vendar izgleda to se lahko v prihodnosti le spremeni. Prepustite Appleu in Microsoftu, da jih dodata, kot običajno. V Linuxu je ogled deskriptorjev preprost – kot root pojdite v /sys/bus/usb/devices/, poiščite svojo napravo po lsusb pot drevesa naprave, nato sledite imeniku z VID/PID v njem. Ta imenik bo vseboval a report_descriptor mapa - hexdump to. Celoten ukaz bi lahko izgledal takole:

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

Še enkrat, morda potrebujete root, da sploh najdete to pot, zato uporabite sudo -i če moraš. Oblikovni niz v hexdump vam daje razčlenjevalniku prijazen izhod. Natančneje, za razčlenjevanje uporabljam Ta spletna stran – čudovito je, tudi z dodajanjem zavihkov, ki označujejo različne dele deskriptorja, zaradi česar je njegov izpis bolj berljiv! To spletno stran lahko shranite tudi lokalno, saj je zelo priročno orodje. Razen tega lahko preizkusite druga lokalna orodja, kot je tale!

Zdaj imate deskriptor za napravo, katere vedenje želite posnemati, in jo lahko razčlenite, da vidite, zakaj deluje. Čudovito! Ampak to ni nekaj, kar bi lahko razumeli na prvi pogled, še ne? Sam deskriptor ni primeren za izdelavo miselnega zemljevida, lahko vsebuje več ID-jev poročil, nekateri deskriptorji pa bodo dovolj splošni, da povzročajo zmedo. Številne naprave imajo na primer deskriptorje, ki so pravzaprav končne točke za posodobitve vdelane programske opreme, zato boste morda porabili čas za ugotavljanje, kdaj se deskriptor dejansko nikoli ne uporablja. Oglejmo si, kaj naša naprava dejansko pošilja, ko z njo komuniciramo, iz katerega ID-ja poročila bi se morali učiti – in kar je najpomembneje, kako ga OS Linux interpretira.

Za to potrebujemo samo VID in PID. Še enkrat kot root pojdite na /sys/kernel/debug/hid/, nato poiščite imenik s svojim VID in PID cat svoje events mapa. Tam boste našli lepo natisnjen človeku berljiv opis vsakega dogodka, ki ga prejmete iz svoje naprave, takoj ko se pojavi. Včasih pride do motenj v postopku tiskanja in se ustavi sredi dogodka – to je lahko zaradi tega, kako poteka catvendar običajno ni velika izguba. To je čudovit način, da vidite, kaj se dejansko zgodi, ko je vaša naprava HID dejavna. Prvi bajt je ID poročila, nato se paket natisne na način, kot je bil prejet, nato pa vidimo rezultate razčlenjevanja iz OS. To je preprosto čudovito orodje! Tukaj je primer ukazne vrstice:

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

Nenazadnje boste želeli videti dogodke, kot jih dejansko interpretirajo vhodne plasti vašega OS. Da, to je drugače – če paket prispe, ni nujno pretvorjen v vhodni dogodek na ravni OS, včasih je zavržen, ker ne izpolnjuje določenega pogoja. Na primer, na neki točki so bili moji paketi zaslona na dotik zavrženi, ker sem pošiljal le koordinate in izpustil ključni bit, ki OS-u sporoča, da zaslon na dotik trenutno posreduje veljaven dogodek dotika v nasprotju z lažnim dotikom. Ta košček je spredaj in na sredini Microsoftove 'opombe' o izdelavi digitalizatorja, in ko sem videl, da moj operacijski sistem ni 'sprejel' mojih konstruiranih dogodkov, sem potreboval spodbudo, da sem pokukal v appnote in preveril, kaj mojemu paketu morda manjka.

Za to imam moj mali skript Python ki natisne dogodke, ko jih prejmejo plasti vhodne knjižnice, in ta skript mi ​​služi že desetletje. Preprosto ga prenesite in zaženite – morali boste namestiti knjižnico Python `evdev`, vendar je na voljo v repozitorijih Debian/Ubuntu in `pip`. Tudi tega morate zagnati kot root, vendar se to zgodi, ko ga samodejno zaženete kot `./listen_keys.py`.

Raje izvajam vse te različne ukaze tmux, različna majhna podokna za različna tekoča opravila – tukaj je moj delovni prostor, ko sem razvijal in odpravljal napake kode zaslona na dotik, kjer a) prikazuje neobdelano tiskanje dogodkov HID, b) prikazuje tiskanje deskriptorja HID in c) prikazuje kodo prikaza vhodnega dogodka.

Popolna preobleka

S temi orodji je bilo sestavljanje zaslona na dotik celovečerno delo. Imel sem koordinate iz knjižnice XPT2046, ki sem jo uporabljal, tako da sem moral samo zgraditi deskriptor. Sprva sem mislil ponovno uporabiti deskriptor »absolutne pozicije miške«, ki ga je koristno ponudil [] s kodo, vendar mi je skript za tiskanje vhodnega dogodka pokazal, da uporabniški vmesnik ni zaznal niti pritiskov gumba miške iz tega skripta – in medtem Dogodki MOUSE_ABS so se pojavili in na noben način niso vplivali na moje namizje.

Odpravljanje napak v delu deskriptorja miške se ni zdelo zabavno, še posebej glede na to, da sploh nimam delujoče absolutne miške, od katere bi se lahko učil! Namesto tega sem se odločil obnoviti absolutni deskriptor miške v deskriptor digitalizatorja, saj imam deskriptor digitalizatorja in pakete! Absolutni deskriptor miške je bil koristno izpostavljen v virih MicroPython ločeno in tudi zrel za spreminjanje! Spreminjanje USAGE in USAGE_PAGE samih kategorij do tistih iz deskriptorja zaslona na dotik USB je moj operacijski sistem prepoznal mojo ploščo RP2040 kot digitalizator.

Dejanske spremembe niso bile zapletene – knjižnica XPT2046 je zagotovila dve celoštevilski koordinati, zato sem kopiral strukturo iz deskriptorja, ki je opisoval eno vrednost X in eno vrednost Y, vsaka je bila dolga 16 bitov in je bila zato vsaka razdeljena na dva bajta, tako kot moj zaslon na dotik USB. S pomočjo mehanizma za tiskanje paketov HID debug sem lahko hitro opazil, kdaj sta bila moj zgornji in spodnji bajt zamenjana, ker moj OS ni pravilno razlagal koordinat. Ko bi to popravil, bi bili moji paketi pravilno razčlenjeni, vendar se ne bi pojavljali med vhodnimi dogodki, in če bi primerjal tovarniško izdelane pakete USB zaslona na dotik z ročno izdelanimi paketi mojega zaslona na dotik DIY, sem opazil, da je bit »veljaven dotik« je manjkal. Če dodam, da se je naprava obnašala kot zaslon na dotik za vse namene!

Zdaj imam DIY zaslon na dotik, povezan z USB, in vse, kar je bilo potrebno, je bila ukrasti deskriptor HID z drugega zaslona na dotik in ga nato dovolj natančno posnemati. Poleg tega lahko kadar koli želim svoj zaslon na dotik preklopim v način sledilne ploščice tako, da pošlje pakete z drugačnim ID-jem poročila, ki ustreza deskriptorju miške vdelane programske opreme – manjkata ji le dva gumba miške, da bi bila popolna sledilna ploščica prenosnika! Glede na to, da to uporabljam za prototip nosljivega zaslona, ​​bo to izjemno koristno.

Zavarovali smo blago notri in zunaj

Kot je, na novo imenovani zaslon na dotik USB potrebuje nekaj filtriranja in kalibracije, vendar so to majhni popravki – verjetno bi lahko ukradel nekaj algoritmov za filtriranje tudi iz gonilnikov za Linux XPT2046! Je plug&play, je enostaven za uporabo in ga je mogoče vdreti – ni več zaslon na dotik SPI, kot naj bi bil. Predvsem pa je odličen primer, da če želite zgraditi nekoliko čudaško napravo HID, tega niti približno ni težko narediti, Linux pa vam ponuja zmogljivo orodje, ki vam pomaga opaziti kakršne koli težave s HID, ne glede na to, kako daleč želite pojdi.

Če razumete HID, lahko naredite ogromno stvari. Na primer, lahko zgradite Braillov zaslon, ki je navzkrižno združljiv, brez težav s serijskimi številkami USB-UART. konec na Hackaday Discord, [mupf] je vdrl v napravo, združljivo s prilagodljivim krmilnikom XBox, ki uporablja magnetometer in žiroskop za pošiljanje operacijskega sistema, pri čemer je deskriptor HID močno informiran z odloženim deskriptorjem originalnega prilagodljivega krmilnika Xbox. Specifikacija HID opisuje veliko stvari, celo zaslone znakov, povezane z USB, in stvari, kot so – lahko pošiljate kvaternione s pomočjo HID, od vseh stvari!

Podpora za HID naredi vašo vhodno napravo prijaznejšo in ji pomaga pri boljši interakciji v svetu programske opreme. HID je v svojem bistvu jezik, ki ga razumejo vsi glavni operacijski sistemi, in dajanje vmesnika HID vaši napravi omogoča, da se izognete dodajanju plasti lastniškega jezika med vašo napravo in katero koli vrsto programske opreme, s katero želite komunicirati. In seveda je HID odlično hekersko orodje – samo to orodje za avtomatizacijo pametnega telefona bo pričalo!

Naslednjič bi vam rad pokazal več o I2C HID – pošiljanje HID paketov in deskriptorjev prek I2C, brez potrebe po USB vratih in samo z uporabo povezave I2C, ki je do zdaj že skoraj vseprisotna! V tem kontekstu vam bom pokazal, kako ponovno uporabiti sledilno ploščico prenosnika Framework, ki za svoje komunikacije uporablja I2C-HID. Upam, da bom spremenil QMK, tako da bomo lahko vadili dodajanje sledilnih ploščic I2C vsem tipkovnicam, ki jih nadzoruje QMK, vendar se bomo morda odločili samo za spreminjanje KMK, ki je enakovreden QMK, vendar v CircuitPythonu. Pokazal vam bom tudi, kako lahko hitro povežete napravo I2C-HID z vašim Linux SBC – to je lažje, kot si lahko predstavljate! In če se zvezde poravnajo in se podpora za periferni način I2C v RP2040 MicroPython izkaže za dovolj stabilno, bi lahko kot posladek celo zgradili lastno periferno napravo I2040C HID, ki jo poganja RP2.

Časovni žig:

Več od Hack A Day