PokéMesh – Inizio e fine di un’avventura

In questo primo articolo del mio sito/curriculum voglio raccontare la mia bellissima esperienza ed avventura con PokéMesh andando a toccare punti ed idee personali e punti tecnici che potrebbero richiedere un livello base di logica di programmazione ed informatica.

Partiamo dal principio, come nasce PokéMesh.

PokéMesh nasce poche settimane dopo la pubblicazione della popolare app Pokémon GO (meta luglio 2016), sviluppata da Niantic con diversi partener, tra i quali Google, che forniva i server, ed ovviamente Nintendo.

Vista la grande popolarità del gioco decisi di proporre l’idea di sviluppare un’applicazione Android a 3 ragazzi, Alvise – Vincenzo – Domenico, con cui ho avuto il piacere di poter lavorare e con cui spero di poter portare a termine altri grandi progetti. Volevo inizialmente realizzare qualcosa di utile e semplice, e fu cosi che iniziammo a realizzare una mappa che era in grado di mostrare i Pokémon nelle vicinanze.

Non ricordo esattamente a chi venne il nome “PokéMesh”, probabilmente a Domenico ma fu chiaramente azzeccato – Poké (Pokémon) Mesh (Rete). Ma iniziamo a scendere un po più nello specifico su come e cosa era necessario fare per poterla realizzare.

Come tutte le applicazioni e i giochi online, anche Pokémon GO ha un client, l’app, e i server, con il quale avviene un costante scambio di dati. Il passaggio dei dati avviene attraverso le api che comunicano usando dei messaggi in Protobuf (molto simile al JSON). Questi messaggi, contengono poi una serie di dati che vengono riprodotti sul gioco. Per scendere ancora di più nel semplice, il gioco richiede dei dati ai server con dei messaggi, il server li verifica e risponde con i dati richiesti.

Nel nostro caso dovevamo ottenere i Pokémon da mostrare sulla mappa ai loro server, in modo da fornire un servizio “reale” e funzionante. Per fare ciò, si è reso necessario sfruttare alcune tecniche di hacking, ad iniziare dal MITM (man in the middle), una tecnica che consente di poter intercettare lo scambio di dati, che come ormai tutte le app è protetto da SSL, tra il client e i server, riuscendo a leggerne e modificarne il contenuto.

Inizialmente rilasciammo l’app sul PlayStore e sul sito web http://www.pokemesh.com. Il successo dell’app fu quasi immediato, anche grazie alla cura che abbiamo dato all’aspetto grafico dell’app e alle sue funzionalità, seppur ancora molto povere. Con grande stupore, dopo alcuni giorni, l’app scalò la classifica globale del Google Play Store, superando inizialmente Amazon, Spotify, Instagram e altre app di rilievo approdando seconda in classifica (il primo posto era ovviamente di Pokémon GO). La gioia durò poche ore, poichè fummo rimossi dallo store per violazione delle policies di Google. Il danno fu minimo. L’app era già cosi popolare che bastò inserire un sistema di aggiornamenti in-app e continuare la distribuzione sul sito. Penso che nessuno all’interno del nostro gruppo abbia mai visto numeri cosi alti in termini di utenza cosi come penso che sarà veramente difficile trovare un’altro progetto che dia tali soddisfazioni (sempre in termine di numeri).

Ma andiamo avanti… Giunti a settembre, Niantic, inizia ad adottare serie contromisure per impedire ad applicazioni (erano veramente tante) non ufficiali, tra cui la nostra, di poter ricevere dati dai propri server.

N.B: Ogni singola app ed ogni singolo utente che richiedeva dati ai loro server, per loro, era un costo, e non indifferente.

La prima seria contromisura fu l’introduzione della Signature, meglio conosciuta come la Unknown6, una “firma” lasciata nel messaggio per richiedere i dati, che veniva verificata dal server e qualora qualcosa non combaciasse, non veniva ritornato alcun dato. Da questo momento in poi si è passati al livello successivo. Servivano tecniche di hacking molto più avanzate ed un livello teorico abbastanza solido per poter riuscire a “crakkare” la loro sicurezza. Fu cosi che nacque una solida community di sviluppatori provenienti da tutto il mondo, Russia, India, Cina, Romania, Brasile, Canada, Belgio ecc ecc ecc. La prima battaglia durò 4 giorni, dove più di 40 sviluppatori all’interno di una chat, condividevano idee e metodi, lavorando insieme per riuscire a riprodurre la signature che era cryptata ed inserita nella richiesta. Si è quindi ricorso al Reverse Engineering per ricostruire l’algoritmo con cui la signature veniva cryptata.

Inutile dire che nel corso dei mesi, gli aggiornamenti alla loro sicurezza sono stati molto accaniti e frequenti. Possiamo dire che non esiste al mondo nessun sistema che non possa essere crakkato, lo puoi rendere difficile ai limiti dell’impossibile tanto da renderlo estenuante poi per chi lo deve crakkare. Se dovessi parlare dei sistemi di sicurezza adottati negli ultimi aggiornamenti a cui ho lavorato, con un linguaggio terra terra, mi troverei un pò in difficoltà.

All’interno della signature erano stati inseriti diversi hash che venivano anch’essi validati dai server. L’algoritmo per generare gli hash era scritto all’interno della libreria nativa, successivamente offuscata con strong.code. Il primo hash ed il secondo hash erano dei long di 128 byte generati utilizzando un salt di 4 byte ottenuto dalla timestamp, inclusa anch’essa nella richiesta, e i byte della posizione dell’utente (latitudine, longitudine ed altitudine). Gli altri 5 hash erano ottenuti dai byte di ogni singola richiesta inclusa nel pacchetto richieste.

Ho smesso di lavorare al progetto da quando è diventato un gioco da ragazzi, per loro, mandarci KO, ed un impresa che richiedeva altre 2/3 settimane di lavoro per riuscire a ritornare operativi. Successivamente ci è stato anche recapitato un C&D che ha definitivamente chiuso ogni ipotesi di aggiornamento futuro.

Ancora più importante del lato economico, questo progetto penso abbia aperto delle porte a tutto il team. Personalmente, oltre ad aver decuplicato le mie competenze, che sperò di poter centuplicare con altri mille progetti nuovi, mi ha insegnato che lavorare in gruppo e unire più cervelli è la chiave per realizzare qualsiasi tipo di lavoro. In 3 sviluppatori ed 1 grafico abbiamo realizzato un’app che teneva una media di 80.000 persone connesse durante le 24/h, 4 milioni o più di richieste al minuto, oltre 8 server in batteria per gestire il traffico che proveniva sia dall’app che dal sito web. Sono emersi molto anche i nostri limiti durante dei tentativi di realizzare delle espansioni del progetto ma sono sicuro che da esse abbiamo imparato moltissimo. Abbiamo utilizzato oltre 4 linguaggi di programmazione per l’intero progetto, che ci ha portato ad imparare le basi del GOlang e ad espandere PHP java e bash scripting per l’automazione.

Vorrei infine concludere questo articolo sottolineando che tutto ciò che abbiamo fatto era nel pieno della legalità, sebbene può sembrare strano che ottenere dati da un server di proprietà altrui sia legale. Diventa illegale quando per ottenere i dati viene utilizzato del codice di proprietà altrui. Il codice da noi utilizzato era pienamente reversato e pubblicato sulla mia repository.

24 Comments

Denis January 28, 2017 Reply

Complimenti per cio che avete fatto!

Pietro January 28, 2017 Reply

Grazie davvero di tutto quanto!!

Davide January 28, 2017 Reply

Grazie per l’impegno e buona fortuna!

Marco January 28, 2017 Reply

Avete tutta la nostra stima

Mettiu Ziobel Cornia January 28, 2017 Reply

Davvero complimenti per il lavoro svolto, ti auguro il meglio per il futuro!

Lukas January 28, 2017 Reply

Grazie mille per tutto! Buona fortuna con i progetti futuri!

Justine January 28, 2017 Reply

Dude, you guys were a lifesaver when I was playing PoGo! Hope you make new apps on Playstore. Just email me and I’ll check it out and rate 🙂

Btw, I’m a second yr studying IT . I would like to know other websites like w3schools.com that could help me further understand web programming. I’m currently trying to make a web-based collab system.(like skype, asana, slack, and rabb.it) where users can chat, call, and share content,.

Anything that could help me grasp the concepts would be greatly appreciated.
Love you devs!

-A 16 yr old I.T student

GiovanniRocca January 28, 2017 Reply

The best way to train and improve your skills is to try hard and develop a concept. For example, a beginner should focus to basis things without going into difficult things. Let’s say you want to start develop an android application, or a custom website. You should start from the idea, so let’s create a simple screen with some buttons and assign them different actions, like changing interface color and other kind of interactions. You can find everything you need into stackoverflow. Goodluck!!!!

Dorie April 13, 2017 Reply

Hey, that’s a clever way of thknniig about it.

Augusto D'Adda January 28, 2017 Reply

Grazie mille e tantissimi auguri per il lavoro futuro.

Liza April 13, 2017 Reply

I’m imserpsed you should think of something like that

ODINO87 January 28, 2017 Reply

Ho fatto parte del primo gruppo di utenti ad usare pokemesh e ho quasi finito il mio pokedex grazie ad esso. Ero e sono fiero che questo progetto parte da un idea italiana poi espanso in tutto il mondo. In bocca al lupo per i progetti futuri e spero di leggerti in qualche nuova/o app/progetto

Lois April 13, 2017 Reply

Ecioemnos are in dire straits, but I can count on this!

Terry January 28, 2017 Reply

Is there any english tranlsation for this article? Pokemesh is my first use of poke radar app, thank you very much.

Alessia January 29, 2017 Reply

Complimenti e grazie per il vostro lavoro, avete aiutato tantissimi giocatori!! Siete davvero brillanti, in bocca al lupo per i progetti futuri

Sebastian Otto February 11, 2017 Reply

Danke für alles die App war sehr gut und hat mir ein Relaxo, Lapras, Dragoran und viele andere Pokemon gegeben.

DaDDa February 13, 2017 Reply

Speriamo che questa fantastica community non muoia mai

Rocker February 20, 2017 Reply

Muchas gracias, podemos decir que ustedes hicieron el juego mucho mejor y mas logico, al grado que Pokemesh se volvia igual de importante que Pokemon Go para jugar, recuerdo cuando la use por primera vez que note que nos toman el pelo diciendo que solo hay que buscar a los pokemon cuando la verdad es que la mayoria son repetidos y poco interesantes, es por eso que creo que no querian un radar como el suyo, pues mostraba que el juego era en su mayoria una farsa de acuerdo a lo de (buscar y encontrar) pues siempre estaban los mismos pokemones UNA Y OTRA VEZ, lo mejor era que cuando un pokemon valia la pena era gracias a ustedes que lo encontrabamos, volvieron el juego mejor e hicieron un gran trabajo, espero volver a saber de este equipo en el futuro, de nuevo gracias por el esfuerzo.

Giuseppe February 22, 2017 Reply

Grazie!
e in bocca al lupo x il futuro

Joseph February 22, 2017 Reply

Thanks for all the fun Giovanni. We know it was not easy.

marina February 24, 2017 Reply

è stata un estate meravigliosa in compagnia di pokemesh… ho sempre seguito il vostro duro lavoro…e ad ogni vostro successo era per me una gioia … rincominciare con voi l’avventura di catturare i pokemon… grazie di vero cuore

wyrdwyrd April 9, 2017 Reply

It was a good app.

Back when I was using it last year, I could tell the app was something extra special.
I’m glad you learned a lot.

Your app helped me catch enough dratini to evolve Dragonite. 🙂


Furry cows moo and decompress.

ryan April 19, 2017 Reply

eu gostei muito dece app

Mario Bross August 22, 2017 Reply

Grazie di tutto l’impegno e il tempo che ci avete messo in questo progetto! Buona fortuna per il vs futuro.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.