USB hacka genom Reverse Engineering (12 / 12 steg)
Steg 12: Bonus accelerometer!
Vi var ganska nära med våra kommandon, det ser ut som vi ska läsa endast 10 byte. Det ser också ut som data inte ändras verkligen mycket förutom lite längre ner...
7' th byte ändras en hel rätt när vi skickar det som bRequest 0x31 (motorisk rörelse). Det innebär att dessa data läsa på något sätt berörs av motorn, möjligen en motor feedback byte?
Kolla in en riva ner av enheten (från iFixit) ser vi att det finns en "vinkelgivare' / accelerometer (Kionix KXSD9). Databladet anger det används för bildstabilisering, och den har 3-axel (X Y och Z) med 10 databitar per axel.
Kan kontinuerligt läsa informationen
importera usb.core
importera usb.util
importera sys
Importera tid
# hitta vår enhet
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
# var det hittade?
om dev ingen är:
höja ValueError ("enhet hittades inte")
dev.set_configuration()
samtidigt sant:
# Få data från brequest 0x32
ret = dev.ctrl_transfer (0xC0, 0x32, 0x0, 0x0, 10)
Skriv ut karta (hex, ret)
Skakar Kinect medan du kör skriptet ser du tydligt att uppgifterna förändringar med rörelse.
För att identifiera accelerometer axlarna, rotera det bara ett sätt i taget och notera vilka förändringar. Du kan också se hur informationen är i byte men accelerometer data ska vara ett signerat ord eftersom det finns vänder från 0xfff7 till 0x0007 vilket tyder på en negativ till positiv konvertering.
Vi kan kasta två byte till ett signerat värde för "hand" (i C detta är lite lättare, vi vet)
importera usb.core
importera usb.util
importera sys
Importera tid
# hitta vår enhet
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
# var det hittade?
om dev ingen är:
höja ValueError ("enhet hittades inte")
dev.set_configuration()
samtidigt sant:
# Få data från brequest 0x32
ret = dev.ctrl_transfer (0xC0, 0x32, 0x0, 0x0, 10)
#print karta (hex, ret)
x = (ret [2] << 8) | ret [3]
x = (x + 2 ** 15) % 2 ** 16 - 2 ** 15 # konvertera till signerade 16b
y = (ret [4] << 8) | ret [5]
y = (y + 2 ** 15) % 2 ** 16 - 2 ** 15 # konvertera till signerade 16b
z = (ret [6] << 8) | ret [7]
z = (z + 2 ** 15) % 2 ** 16 - 2 ** 15 # konvertera till signerade 16b
Skriv ut x, "\t", y, "\t", z
Nu när du kör skriptet ser du signerade data visas korrekt