Un adattatore non ufficiale permette il funzionamento della tastiera e del mouse su Playstation 4

Sono passati molti anni dall’ultima partitella che ho fatto ad uno sparatutto, all’epoca giocavo ad Half Life 2 e Quake arena, ma non perché su console non mi piacevano, è perché questo tipo di giochi erano studiati apposta per essere sfruttati attraverso mouse e tastiera.

fardown

Sul portale eleccellerator.com, l’ingegnere elettronico Frank Zhao ha reso disponibile il proprio lavoro riguardante il supporto non ufficiale del mouse e della tastiera su PS4 con una dimostrazione su video del suo operato dove è possibile vederlo giocare a Battlefield 4.

closeup

Sony non ha ancora reso possibile fruire di una tale possibilità, è per questo che l’ingegnere elettronico ha realizzato l’adattatore che si avvale di un microcontrollore e un hub USB, la tastiera e il mouse si inserisce nella hub USB, il microcontrollore prende i dati dalla tastiera e dal mouse e li traduce per il formato dei dati utilizzato dalla PlayStation 4.

pcb

Sviluppo della Storia

Ho voluto condividere la storia dello sviluppo, sono molto felice di esser finalmente riuscito ad arrivare a questo punto! Qualcuno molto probabilmente era alla ricerca di qualcosa del genere, sembrava quasi impossibile, ora possiamo tirare un sospiro di sollievo, perché sicuramente può essere fatto.

Ho già avuto modo di realizzare un progetto simile che ha lavorato con una PS3 (UsbXlater), qualcosa che collegato alla PS3 tramite USB traduceva il formato dei dati da tastiera e mouse nel formato dati gamepad.

Dapprima ho pensato di utilizzare lo stesso procedimento attraverso il reverse enginnering utilizzato dal protocollo USB del controller Dualshock 4, ma purtroppo non ha funzionato, nemmeno dopo aver provato smanettando con svariati trucchi.

Ho iniziato a parlare con alcune persone che stanno lavorando su progetti simili, come Matlo dai GIMX.fr e creatori di XIM, purtroppo sembra che nessuno di noi sia in grado di ottenere una risposta dei dati provenienti da una porta USB su PS4.

Ho pensato allora di utilizzare il mio circuito come un “proxy“, cercando di passare i dati via USB in modo trasparente proprio per come avviene con il traffico USB tra la PlayStation e il DualShock, se non con solo piccole modifiche dei byte che rappresentano la pressione dei pulsanti, ma purtroppo non ha funzionato, sembrava che solo il traffico wireless venga utilizzato dalla PlayStation, non il traffico USB.

Attraverso il mio reverse engineering, ho scoperto (colpendo tutto il circuito con un oscilloscopio) che il circuito del DualShock espone due segnali che sono in realtà i segnali UART tra un modulo Bluetooth ed il microcontroller del DualShock. Ho saldato alcuni fili a questi segnali determinando che si sta utilizzando H4 HCI su UART a 3 Mbit/s.

Ho collegato questi segnali attraverso il mio analizzatore logico per catturare il traffico UART, andando a scrivere uno script per riformattare il log in formato pcap in modo che il traffico possa essere analizzato utilizzando WireShark (che in realtà hanno analisi specifiche per H4 HCI).

Grazie a questo, ho imparato a conoscere come funziona la procedura di accoppiamento Bluetooth. La chiave di collegamento Bluetooth (un codice di accoppiamento lungo 16 byte) è la prossima sfida, la chiave di collegamento vengono effettivamente scambiate durante l’enumerazione USB.

Questo perché ho notato un pezzo di byte che sembrava casuale nel traffico enumerazione USB, che mi ha dato la sensazione di controllare se era lo stesso byte come la chiave di collegamento. Quindi, per ottenere una chiave di collegamento, il mio circuito doveva essee collegato alla PS4 via USB. Ecco come il problema della sicurezza di accoppiamento Bluetooth è stato risolto.

A questo punto, ho scritto un po ‘di codice del firmware che mi ha permesso di memorizzare dati nella memoria flash. Ho anche implementato wear leveling. Le chiavi di collegamento Bluetooth e gli indirizzi possono essere memorizzati nella memoria flash.

Ho anche notato 4 byte di dati casuali allegati a ogni pacchetto, dopo alcuni controlli, si scopre che questi sono solo un CRC a 32 bit che non fa parte delle specifiche ufficiali Bluetooth, quindi Sony deve aver aggiunto loro solo per la sicurezza. Se questo fosse realmente un hash crittografico o se il CRC utilizzato un seme diverso o ha utilizzato un polinomio diverso, quindi spoofing i pacchetti sarebbe molto più difficile (impossibile a qualcuno senza competenze di crittografia).

A questo punto, ho dovuto fare una modifica al mio circuito in modo che comprendeva un modulo Bluetooth. Ho avuto diverse scelte ma alla fine ho  optato per l’utilizzo di un comune dongle Bluetooth USB

(Vantaggi: Veloce, certificato, economico Svantaggi: occupa una porta USB).

Poi ho provato a programmare il mio stack firmware Bluetooth (ho dovuto imparare letteralmente l’intero spec Bluetooth). Ho quasi finito di scriverne uno, ma non ero contento di come era venuto, troppo complicato ed al fine di gestire tutte le situazioni possibili, ho deciso di utilizzare uno stack Bluetooth open source denominato BTstack .

Ho dovuto implementare nuovamente il mio livello di trasporto USB per esso e fare alcune modifiche, ma svolge abbastanza bene il lavoro in questo momento.

1

Mentre stavo facendo questo, Matlo si trovava più avanti rispetto a me e aveva già tentato di inviare i dati al PS4 via Bluetooth.

Tuttavia, la PS4 sta ignorando completamente i suoi dati, ci siamo trovati entrambi allo stesso punto, chiedendoci il perchè. Matlo ha notato che una parte del traffico avviene in modo molto infrequentemente. Questo risulta essere le sfide e le risposte della procedura di autenticazione.

Non sapevamo come generare le risposte (le sfide sono 256 byte di dati casuali, non abbiamo avuto l’esperienza di crittografia per iniziare anche a tentare di superarlo). Matlo ha creato uno strumento chiamato l2cap_proxy che riproduce esattamente tutto il traffico che avviene tra i due dispositivi.

Attraverso tale procedura siamo infine riusciti a farlo funzionare, che per quanto abbiamo scoperto si tratta di una vulnerabilità che può essere sfruttata dai circuiti. (gli ingegneri Sony si sono dimenticati di includere una firma digitale, se la cifratura dipendesse dall’indirizzo Bluetooth, in qualche modo, quindi l’attacco non avrebbe funzionato).

Ciò significa che un vero DualShock è necessario per essere collegato tramite Bluetooth in ogni momento, perché la PlayStation non si ferma mai chiedendone  in realtà l’autenticazione, il ché risulta un po scomodo. Il traffico tramite Bluetooth è così alto che Matlo notò che il suo computer a volte perde i pacchetti.

2

Questo è un problema se Matlo vuole il suo codice di lavoro su una piccola piattaforma come il Raspberry Pi. Il traffico Bluetooth L2CAP utilizza ancora il PSM HID così che tutto il traffico abbia un aspetto simile al traffico USB, e gli ID di report in uso sono gli stessi.

Così ho condotto un esperimento (utilizzando PyUSB) per alimentare le sfide per il DualShock via USB al posto del Bluetooth, quindi tentare di leggere la risposta da USB. Non ha funzionato, le risposte sono tornate tutte a zero.

3

Il traffico è così alto che il mio circuito non ne può tenere il passo, ho dovuto dare priorità ai FIFO cosi i pacchetti importanti di autenticazione sono garantite, le altre cose hanno l’80% di possibilità di essere ri-sistemate correttamente.Quando è più  basso il FIFO la priorità si riempie all’inverosimile e i pacchetti vengono persi.

Così Il tratto finale è stato quello di codificare il mio firmware per farlo funzionare come il proxy di Matlo, tranne che per i pacchetti che dovevano essere modificati con i nuovi byte sia per i pulsanti che per la levetta. Dal momento che alcuni pacchetti vengono modificate, il CRC deve essere ricalcolato, che viene svolto facilmente perché il microcontrollore STM32 che sto usando ha già un motore CRC (che è più veloce del software implementato dal CRC).

A un certo punto di questa storia, il circuito UsbXlater doveva essere riprogettato per includere l’hub USB. Lo stack USB originale (fornito da ST) ha dovuto essere riscritto per fornire il supporto peri  mozzi.

4

Il progetto è open source, è possibile visionarne la repo UsbXlater sul github per ora ma ancora non è perfetta, c’è ancora molto da fare.

Ho bisogno di ridisegnare il circuito, ha bisogno di un hub a 4 porte invece di 3, e ho bisogno di scambiare le due interfacce USB (l’interfaccia HS dispone di 12 canali host e l’interfaccia FS ha solo 8, ho bisogno di utilizzare l’interfaccia HS per il mozzo). Ho anche bisogno di fare una utility di configurazione per la combinazione dei tasti in modo da rimappare i tasti di controllo adattandoli per altri giochi.

5

FAQ per le persone non tecniche

Questo non suona impressionante per tutti, ci sono un sacco di prodotti là fuori già che fa questo per Xbox 360, Xbox One e PlayStation 3. Ciò che rende questo progetto così speciale?

La prima cosa che ho fatto è stato farlo funzionare con la PlayStation 3 da spoofing di un DualShock 3 collegati utilizzando la connessione USB. Questo è stato facile. Ma la stessa tecnica non poteva essere utilizzato per la PlayStation 4. La PlayStation 4 sembra ignorare i dati attraverso il canale USB. Per ovviare a questo, un dongle Bluetooth USB è collegato alla porta USB del mio circuito. Il mio firmware falsifica un DualShock 4 su Bluetooth invece di USB.

Sembra troppo facile ancora, non è vero? Sony ha implementato una procedura di autenticazione challenge-response. La PlayStation invierà una questione cifrata a un DualShock, e solo un vero e proprio DualShock sarà in grado di generare la risposta corretta alla domanda. Se un altro dispositivo tenta di fornire una risposta sbagliata, la PlayStation ignorerà quel dispositivo. Per ovviare a questo, un DualShock è collegato al mio circuito, e le domande della PlayStation sono re-indirizzato al DualShock in modo che il DualShock dice mio circuito la “risposta”, e il mio circuito poi reindirizza la risposta alla PlayStation, vanificando così l’autenticazione.

Questo è in realtà una vulnerabilità, un errore fatto da Sony. Si sono dimenticati di includere una firma digitale, se la cifratura dipendesse dall’indirizzo Bluetooth, in qualche modo, quindi l’attacco proxy non avrebbe funzionato.

Ho visto un tizio saldare un DAC/digitale potenziometro all’interno di un DualShock per raggiungere questo obiettivo, sembra molto più semplice il metodo, come è il vostro circuito diverso?

Il mio circuito è tutto digitale, nessun rumore analogico, senza latenza di input da conversione analogico-digitale, non c’è bisogno di smontare il DualShock.

Come hai fatto a ingannare il DualShock e la PlayStation per connettersi al proprio circuito?

L’indirizzo del dispositivo Bluetooth (in pratica l’indirizzo MAC) è dato al DualShock prima tramite USB. Si connette il DualShock al mio circuito per fare questo passo. La chiave di collegamento è data anche al DualShock questo modo (una chiave di collegamento è simile a un codice di accoppiamento, ma non esattamente).

L’indirizzo del dispositivo Bluetooth e la chiave di collegamento della PlayStation è anche ottenute collegando il mio circuito per la PlayStation tramite un cavo USB. Il mio circuito va in modalità dispositivo USB che finge di essere un DualShock per realizzare questo.

Tutte queste informazioni sono memorizzate nella memoria flash in modo che solo bisogno di essere fatto una volta.

Che dire del touchpad e sensori di movimento?

Dal momento che il traffico è in fase di “proxy”, il DualShock funziona ancora come dispositivo di input, l’input della tastiera e il mouse è mescolato, questo significa che il tocco di dati pad e i dati di movimento non vengono modificati, in modo che il DualShock funziona ancora. A causa della mia tecnica proxy, i colori dei LED e dei dati sulle vibrazioni non vengono modificate in modo che ancora lavorano nei giochi.

Ma nulla mi impedisce di modificare il touchpad e dati di movimento. Io non ho avuto il tempo.

Che dire dell’audio?

Il DualShock utilizza HID per l’audio, il che è strano. Mi aspettavo A2DP da utilizzare per l’audio ma a quanto pare i dati audio è miscelato con i dati HID. Io non so perché. Come ho detto prima, ci sono pacchetti persi, il che significa che i dati audio verranno persi.Quindi, l’audio non funziona con il mio circuito, mi spiace. E ‘semplicemente troppi dati per elaborare su un microcontrollore (e Matlo ha avuto problemi con la velocità dei dati anche su un PC completo).

Come hai fatto a rimuovere l’accelerazione da controlli stick?

Ho preso un video della minimappa per la filatura di BF4 a velocità diverse, trama che accelerare  curva bastone, capovolge la curva per generare un look-up-table.

Come circa il Hori Pad? Funziona tramite USB, come mai il circuito non può?

Non ne ho idea di come facciano, ma dato che Hori Pad è un prodotto ufficiale Sony, possono fare una sorta di eccezione per esso nel sistema operativo della PS4.

Si è cercato di guardare dentro il firmware del DualShock?

No, non l’ho fatto. Ho visto due punti di prova sul PCB del DualShock che possono essere stati i perni SWDIO e SWCLK per l’interfaccia SWD, ma se Sony blocca il firmware se si tenta di leggerlo, questo causerebbe la formattazione del microcontrollore, (autodistruggerà il firmware).

Quali strumenti hai usato per analizzare il traffico USB e il traffico Bluetooth?

Per il traffico USB, ho usato un totale di Fase Beagle USB 12. Per il Bluetooth, ho cercato di usare un Ubertooth One, ma non ebbe successo perché non potrebbe svolgere la frequenza necessaria. Tuttavia, dopo la scoperta dei segnali H4 HCI UART, non ho bisogno della Ubertooth perché il traffico HCI contiene tutte le informazioni di cui avevo bisogno (in forma non crittografata, il che è un bene).

Perché il circuito sembra così strano?

E ‘stato progettato per andare in un box specifico (uno che è al largo della piattaforma).

Dov’è l’amore per Xbox?

Non ne ho uno … ma può assolutamente essere fatto, Xbox usa il WiFi Direct, non Bluetooth.

(Visited 949 times, 1 visits today)

2 commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *