lunedì 18 maggio 2015

Road to LCS: Breaking DN

Avevo già accennato nello scorso Road to LCS (se non lo avete ancora letto, fatelo ora, scoprirete un sacco di cose fighe sul prossimo torneo) la mia intenzione di creare un applicazione che, fornita di nome utente e password, permettesse ai giocatori di stampare la propria decklist presa da Dueling Network in formato testuale. Tra un mesetto dovrò sostenere l'esame di Informatica, e avevo bisogno di allenarmi. Nel prossimo paragrafo spiegherò il percorso tecnico che ho seguito: se siete curiosi, proseguite pure; se viceversa non ve sbatte assolutamente nulla e volete solo sapere come fare a usare questa applicazione, saltate pure e passate al paragrafo successivo Foglietto illustrativo.



Gli ingegneri sono brutte persone
Volendo rilasciare al pubblico l'applicazione, avevo intenzione di creare una piccola pagina web: fornito nome utente e password, attraverso una richiesta HTTP ai server di DN, avrebbe dovuto recuperare le informazioni sui Deck per elaborarle. Ho quindi chiesto sul forum ufficiale di DN se fosse possibile avere accesso alle API del sistema, possibilmente attraverso una richiesta HTTP, ma qualsiasi altro genere di protocollo mi sarebbe stato utile. Quei grandi simpaticoni mi hanno risposto dicendomi che non avevano intenzione di rendere possibile una cosa nel genere, nè progettavano di farlo in futuro, impedendomi di replicare in alcuna maniera. Uscito dal bagno, le idee per una soluzione alternativa che mi erano venute in mente erano tre:
  • Tentare un attacco frontale al sistema. Analizzando il sorgente del programma, avrei potuto trovare qualche exploit per connettermi al sistema e prendere i dati di cui avevo bisogno. Questa maniera sarebbe stata la più efficace, ma molto rischiosa legalmente parlando;
  • Ricorrere a un software OCR. Gli OCR sono applicativi capaci di riconoscere e associare delle immagini a un certo significato: ad esempio analizzando l'immagine di un testo scritto si può ottenere la sua versione in formato Word. Gli OCR (specie quelli gratuiti) sono purtroppo imprecisi, avrei necessitato di un database completo immagine=>carta;
  • Intercettare le informazioni fornite da DN al mio PC. Nessun sistema è totalmente impermeabile: qualsiasi informazione, perchè sia mostrata a me, deve essere da qualche parte, leggibile dal computer. Il problema grosso di questo metodo, è dovuto alla tendenza dei sistemi moderni a impedire a processi diversi di impicciarsi di parti di memoria non assegnate loro. Ogni tentativo sarebbe potuto terminare con un triste errore SEGDEV (Segmentation Fault) a schermo.
Ho deciso di adottare la terza strada. Usando il tool tcpdump ho analizzato il traffico dati che passava attraverso la mia interfaccia di rete. Eliminata un po' di schifezza inutile, mi sono reso conto che tutte le informazioni inviate da DN (utenti online, messaggi globali, messaggi privati, etc.etc.) venivano trasmesse in pacchetti TCP attraverso un'unica connessione creata all'avvio. Ho quindi filtrato quella sola connessione e iniziato a armeggiare con DN mandando messaggi, aprendo deck, partite, etc.etc. Dopo un'oretta sono riuscito a mettere su un vocabolario dei comandi, compreso quello per richiedere una decklist. Ora, all'interno dei sistemi UNIX-like (io stavo operando su una distribuzione GNU/Linux), ogni tipo di flusso in entrata o in uscita (es.: casse, mouse, tastiera, schermo, etc.etc.) è rappresentato da un file.I socket, ossia i flussi di rete, non fanno eccezione. Da qualche parte doveva esserci un file aperto da Flash Player rappresentante il socket di comunicazione con il database di DN. Scovato il file, sono riuscito (dopo non poche bestemmie e magheggi) a ottenere l'accesso in scrittura e lettura e a mandare un comando. I Deck apparivano come una sfilza di valori separati da virgole. Ho redirezionato il flusso, eliminando i pacchetti contenenti i messaggi globali e altre schifezze, in un file di testo. Ho quindi creato un piccolo script PHP che convertisse in un array i dati, e ho studiato la struttura di ogni carta, formata da una trentina di campi contententi nome, URI del file immagine associato, statistiche, effetti, etc. etc. Ho estratto il tipo di carta (Trappola, Mostro, Magia) e il suo nome, ottenendo questo risultato: https://www.facebook.com/LudusChampionshipSeries/photos/a.352123394912723.1073741828.352093698249026/430443380414057/?type=1&theater
Mi sono però reso conto che a intervalli completamente casuali, il file in cui redirezionavo le informazioni filtrate risultava mancante dell'ultimo pacchetto. La decklist, in quel caso, mancava dell'ultima parte dell'Extra Deck. Ho perso una buona mezz'ora a armeggiare con l'espressione regolare del filtro, per poi scoprire che a volte, se il payload dell'ultimo pacchetto non era pieno, veniva concatenato a esso un comando non correlato con le Decklist (ad esempio il controllo dei messaggi). Il buon vecchio PCRE provvedeva quindi a sterminare senza pietà tutto il pacchetto, lasciando la decklist monca. Sistemato il filtro e ottenuta tutta lista, l'ho formattata seguendo il modello della Decklist ufficiale Konami, ottenendo:


Ossia la lista formattata e pronta per essere stampata e consegnata al Judge!

Foglietto illustrativo
Potrete trovare una postazione adibita alla stampa delle vostre Decklist durante i prossimi eventi LCS sotto l'insegna che vedete qua accanto. Arrivati là, io o un nostro addetto vi chiederemo di connettervi a DN e attendere nella schermata con il menù (quella che appare cliccando Duel), se il Deck che volete stampare è quello di default, altrimenti nella schermata di modifica del vostro Deck di default. Al nostro via libera, entrerete nella schermata di modifica del Deck che volete stampare. In pochi secondi la vostra Decklist sarà pronta. Vi consigliamo comunque di ricontrollarla prima di consegnarla all'Head Judge.
Il programma sarà utilizzabile solo e solamente durante i tornei LCS presso la postazione apposita, in quanto il PC della postazione deve essere correttamente configurato per poter sfondare il socket. Per quanto volessi rendere di pubblico utilizzo il tool, lo farò se e solo se avrò il tempo e la voglia di trovare una maniera meno macchinosa e più portabile di eseguire il lavoro.


Posteremo tra qualche tempo una cartina dell'area del prossimo torneo e una legenda della nuova cartellonistica. Non vorrete mica mancare con tutta 'sta carne sul fuoco

Vi aspettiamo!

Francesco Petronella
Ludus Championship Series Organization Team

p.s. vado a rubare il mio 30 a Informatica dopo questo.
p.p.s. se qualcuno vuole provare in anteprima l'accrocchio mi può contattare via pm. Ma vi avviso che dovrete darmi vostro nome utente e password. Saluti ^^

Nessun commento:

Posta un commento