{"id":220,"date":"2016-07-25T15:24:54","date_gmt":"2016-07-25T15:24:54","guid":{"rendered":"http:\/\/www.erroussafi.com\/blog\/?p=220"},"modified":"2018-08-07T12:43:47","modified_gmt":"2018-08-07T11:43:47","slug":"analyse-de-pokemon-go-part-1-analyse-de-lapk","status":"publish","type":"post","link":"https:\/\/www.erroussafi.com\/index.php\/2016\/07\/25\/analyse-de-pokemon-go-part-1-analyse-de-lapk\/","title":{"rendered":"Analyse de Pokemon GO ! (Part 1 : Analyse de l&#8217;APK)"},"content":{"rendered":"<p>A part si vous habitez dans une grotte, o\u00f9 que vous sortez d&#8217;une longue sieste de un mois, vous devez connaitre &#8220;POKEMON GO&#8221;, le jeu incroyablement populaire de Niantic Labs. Cette vague a deferl\u00e9, &#8220;out of nowhere&#8221;, sur la plan\u00e8te gaming des initi\u00e9s et non initi\u00e9s. M\u00e9lant R\u00e9alit\u00e9 augment\u00e9e, et le monde d\u00e9j\u00e0 riche des &#8220;Pokemon&#8221;, franchise \u00e0 succ\u00e8s de Nintendo, ce jeu a, en quelques jours d\u00e9pass\u00e9 Twitter pour le nombre d&#8217;utilisateurs actifs, et d\u00e9pass\u00e9 Facebook en terme de temps journalier pass\u00e9 sur l&#8217;application.<br \/>\nCe succ\u00e8s fulgurant a laiss\u00e9 place a beaucoup de rumeur, sur l&#8217;insecurit\u00e9 de l&#8217;application, l&#8217;usage d&#8217;informations personnelles, ou pire, l&#8217;envoi vers les serveurs du m\u00e9chant &#8220;Nintendo&#8221; des images de votre webcam, de votre quotidien, de vos trajets. Cet article est un petit exercice pour comprendre le fonctionnement de l&#8217;application, et en m\u00eame temps une introduction aux outils utilis\u00e9 pour le &#8220;reverse engineering&#8221; de l&#8217;application android.<br \/>\n<!--more--><\/p>\n<h3>Analyse du APK<\/h3>\n<p>La premi\u00e8re \u00e9tape de notre analyse consiste \u00e0 v\u00e9rifier ce qui se cache \u00e0 l&#8217;interieur de cette application. Pour cel\u00e0, et comme l&#8217;application est encore indisponible au Maroc sur le Play Store Google, je me suis procur\u00e9 le fichier APK disponible\u00a0<a href=\"http:\/\/www.apkmirror.com\/apk\/niantic-inc\/pokemon-go\/pokemon-go-0-29-3-release\/pokemon-go-0-29-3-android-apk-download\/\">sur ce lien<\/a>.<br \/>\nJ&#8217;ai pris sciemment le risque d&#8217;utiliser cet APK tr\u00e8s populaire, tout en sachant que tout fichier APK disponible sur une source autre que le Play Store est un risque potentiel en terme de cyber s\u00e9curit\u00e9. Je voulais v\u00e9rifier le fichier le plus populaire, le plus t\u00e9l\u00e9charg\u00e9 depuis notre pays.<br \/>\nLe fichier APK est une archive simple. Vous pouvez l&#8217;ouvrir avec Winzip ou Winrar et constater l&#8217;arborescence suivante \u00e0 l&#8217;interieur du APK :<br \/>\n[icon name=&#8221;folder-open-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] META-INF : Il s&#8217;agit d&#8217;un dossier contenant les donn\u00e9es META de l&#8217;application<br \/>\n[icon name=&#8221;folder-open-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] RES : Il s&#8217;agit du dossier contenant les ressources du projet.<br \/>\n[icon name=&#8221;folder-open-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] ASSETS : Il s&#8217;agit du dossier contenant les ASSETS de l&#8217;application.<br \/>\n[icon name=&#8221;folder-open-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] LIB : Il s&#8217;agit du dossier contenant les librairies natives du projet.<br \/>\n[icon name=&#8221;file-text-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] RESOURCES.ARSC : C&#8217;est la version compil\u00e9e du fichier R.JAVA qui permet aux applications android de manipuler les ressources.<br \/>\n[icon name=&#8221;file-text-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] MANIFEST : Le fichier manifest de l&#8217;application qui comprend plusieurs informations comme : le nom de l&#8217;application, l&#8217;icone, la version, les permissions..<br \/>\n[icon name=&#8221;file-text-o&#8221; class=&#8221;&#8221; unprefixed_class=&#8221;&#8221;] CLASSES.DEX : C&#8217;est la version compil\u00e9e du code Java de l&#8217;application, et c&#8217;est sur ce fichier qu&#8217;on va s&#8217;atteler sur le prochain chapitre pour comprendre le fonctionnement.<\/p>\n<h3>D\u00e9compiler le DEX<\/h3>\n<p>DEX est le format &#8220;Dalvik Executable&#8221;. Il s&#8217;agit donc de l&#8217;executable qui d\u00e9marre dans la machine virtuelle de Android.<br \/>\nIl existe plusieurs techniques pour d\u00e9compiler un DEX, nous allons utiliser la plus simple \u00e0 travers DEX2JAR, un outil qui va nous permettre de convertir l&#8217;executable en un JAR, autrement, en une archive comprenant les classes en bytecode Java. Ensuite nous allons utiliser un decompiler pour avoir le code JAVA depuis le .CLASS. Cet outil s&#8217;appelle JADX.<br \/>\nT\u00e9l\u00e9charger DEX2JAR :\u00a0<a href=\"https:\/\/sourceforge.net\/projects\/dex2jar\/\">https:\/\/sourceforge.net\/projects\/dex2jar\/<\/a><br \/>\nT\u00e9l\u00e9charger JADX :\u00a0<a href=\"https:\/\/github.com\/skylot\/jadx\">https:\/\/github.com\/skylot\/jadx<\/a><br \/>\n<a href=\"http:\/\/www.erroussafi.com\/blog\/index.php\/2016\/07\/25\/analyse-de-pokemon-go-part-1-analyse-de-lapk\/capture_code\/\" rel=\"attachment wp-att-225\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-225\" src=\"https:\/\/www.erroussafi.com\/wp-content\/uploads\/2016\/07\/capture_code.png\" alt=\"capture_code\" width=\"415\" height=\"374\" \/><\/a><br \/>\nTr\u00e8s important : Ce process ne nous permet pas d&#8217;avoir le code source tel qu&#8217;il a \u00e9t\u00e9 \u00e9crit par le d\u00e9veloppeur ! Il s&#8217;agit plus ou moins d&#8217;une interpr\u00e9tation du moteur de d\u00e9compilation de l&#8217;execution, et une d\u00e9cision sur le meilleur code qui execute la fonction en question. ce process donc cause beaucoup de pertes depuis le code original, notemment sur le nom des m\u00e9thodes, des variables et le commentaire des d\u00e9veloppeurs &#8230;etc. Ceci ne nous posera pas de probl\u00e8me, on a pas besoin de savoir avec exactitude ce que fait l&#8217;application, et mes limitations en Java commencent \u00e0 me poser de s\u00e9rieux probl\u00e8mes. Je vais essayer de comprendre les interactions de l&#8217;application \u00e0 travers les librairies utilis\u00e9es, comme je cherche \u00e0 r\u00e9pondre \u00e0 la question : Que fait l&#8217;application sur internet et sur le t\u00e9l\u00e9phone ?<\/p>\n<h3>Liste des librairies identifi\u00e9es :<\/h3>\n<p>On remarque sur le code d\u00e9compil\u00e9e, que le nom des librairies n&#8217;est pas masqu\u00e9 ou crypt\u00e9, on peut les voir clairement sur le code :<br \/>\nJACKSON (Parser JSON)<br \/>\nOTTO ( event bus, plus d&#8217;explications ici\u00a0<a href=\"http:\/\/square.github.io\/otto\/\">http:\/\/square.github.io\/otto\/<\/a>)<br \/>\nDAGGER (optimisation de dependances, plus d&#8217;infos ici :\u00a0<a href=\"http:\/\/square.github.io\/dagger\/\">http:\/\/square.github.io\/dagger\/<\/a>)<br \/>\nGSON (un autre Parser JSON !)<br \/>\nAPACHE COMMONS IO (pour les I\/O)<br \/>\nFIREBASE-ADS (AdMob)<br \/>\nUPSIGHT (Analytics)<br \/>\nRXJAVA \/ RXANDROID (librairies de reactive programming)<br \/>\nCRITTERISM (log et monitoring de crash de l&#8217;appli)<br \/>\nUNITY (librairie et frameword de jeux video)<br \/>\nLUNAR MOBILE CONSOLE (log et monitoring des usages unity)<br \/>\nVOXELBUSTER CPNP (pour partager depuis unity)<br \/>\nGOOGLE VR SDK (fameuse librairie pour la r\u00e9alit\u00e9 virtuelle de google !)<br \/>\nCel\u00e0 fait beaucoup de librairies ! Pour une application qui a mis 10 ans \u00e0 \u00eatre con\u00e7ue, il est anormal d&#8217;utiliser deux librairies de parsing JSON par exemple sur le m\u00eame code. Il s&#8217;agit donc de l&#8217;ensemble des librairies et des d\u00e9pendances des librairies utilis\u00e9es. Une lecture du code permet de conclure que les seules librairies utilis\u00e9es directement par le code de Pokemon GO sont :<br \/>\nGSON<br \/>\nCRITTERISM<br \/>\nUPSIGHT<br \/>\nFIREBASE-ADS<br \/>\nGOOGLE VR SDK<br \/>\nUNITY<br \/>\nEn effet, UPSIGHT est la librairie qui necessite le reste des librairies d\u00e9pendantes. A elle seule UPSIGHT rassemble 3000 methodes propres, et les m\u00e9thodes des d\u00e9pendances : 4000 RxAndroid, 200 Dagger, 1000 Commons I\/O, 10000 JACKSON, 50 OTTO, 12000 Play Service ! Et tout ca pour les analytics ! Big DATA quand tu nous tiens. Ca nous donner une id\u00e9e sur le business mod\u00e8le de Pokemon GO, il est \u00e0 pr\u00e9sent certains que les donn\u00e9es d&#8217;usage de l&#8217;application sont pr\u00e9cieuses.<br \/>\nMaintenant que la liste de d\u00e9pendance est claire, on voit que la premi\u00e8re d\u00e9pendance est UNITY.<br \/>\nCeci explique pourquoi le logo de niantic et autre \u00e9cran &#8220;loading&#8221; sont affich\u00e9s au d\u00e9marrage de l&#8217;application. Le Moteur UNITY a besoin de temps et de ressources pour d\u00e9marrer en background. L&#8217;ensemble de l&#8217;application est donc \u00e0 l&#8217;int\u00e9rieur de Unity, il n&#8217;y pas d&#8217;element natif android de l&#8217;interface du jeu.<br \/>\nEn terme de s\u00e9curit\u00e9 donc, Pokemon GO souffrirait des m\u00eames vuln\u00e9rabilit\u00e9s que le moteur de jeu UNITY. Il y a lieu donc de se renseigner sur les limitations, les bugs et les travers de s\u00e9curit\u00e9 de ce moteur.<br \/>\nUne autre d\u00e9pendance m&#8217;interesse, il s&#8217;agit du VR Google. Ceci laisserait pr\u00e9sager que l&#8217;application serait dans le futur peut etre compatible avec les lunettes de r\u00e9alit\u00e9 virtuelle VR Google. Malheureusement, sur le code, je vois que la librairie est utilis\u00e9e seulement pour faire communiquer Unity avec la framework Android. Il n&#8217;y a aucun appel des m\u00e9thodes ou des classes servant \u00e0 adapter l&#8217;application \u00e0 l&#8217;affichage du VR Cardboard Google. Donc \u00e0 date, pas de code VR fonctionnel encore sur l&#8217;application. On devra encore utiliser nos t\u00e9l\u00e9phones !<br \/>\nUn troisi\u00e8me constat est que Google VR qui est la biblioth\u00e8que qui requiert le niveau d&#8217;android le plus \u00e9lev\u00e9, requiert API Level 16 pour Android Jellybeans 4.1. Or sur le playstore, l&#8217;application a un requierement minimum de Android KitKat 4.4 Api LEVEL 19 ! Je ne sais pas pourquoi c&#8217;est le cas. D&#8217;apr\u00e8s les chiffres de Google (<a href=\"https:\/\/developer.android.com\/about\/dashboards\/index.html\">https:\/\/developer.android.com\/about\/dashboards\/index.html<\/a>), 20% des utilisateurs donc ne peuvent utiliser l&#8217;application. Peut \u00eatre une feature \u00e0 venir qui requiert ce niveau minimum de Android.<\/p>\n<h3>Conclusion<\/h3>\n<p>A travers cette premi\u00e8re analyse, nous connaissons maintenant la structure de l&#8217;application et ses d\u00e9pendances. Le prochain article traitera d&#8217;une analyse du code, et notamment des communications r\u00e9seaux, nous allons lister l&#8217;ensemble des serveurs avec qui l&#8217;application communique et nous allons ensuite faire une petite installation MITM (Man in the middle) pour pouvoir voir les interactions en clair de l&#8217;application avec les serveurs en question et confirmer si oui ou non, les informations communiqu\u00e9es sont relatives \u00e0 votre vie priv\u00e9e ! A bientot !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A part si vous habitez dans une grotte, o\u00f9 que vous sortez d&#8217;une longue sieste de un mois, vous devez connaitre &#8220;POKEMON GO&#8221;, le jeu incroyablement populaire de Niantic Labs. Cette vague a deferl\u00e9, &#8220;out of nowhere&#8221;, sur la plan\u00e8te gaming des initi\u00e9s et non initi\u00e9s. M\u00e9lant R\u00e9alit\u00e9 augment\u00e9e, et le monde d\u00e9j\u00e0 riche des [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":545,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[9],"tags":[],"class_list":["post-220","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technique"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.erroussafi.com\/wp-content\/uploads\/2016\/07\/pokemongo2.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/posts\/220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/comments?post=220"}],"version-history":[{"count":0,"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/posts\/220\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/media\/545"}],"wp:attachment":[{"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/media?parent=220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/categories?post=220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.erroussafi.com\/index.php\/wp-json\/wp\/v2\/tags?post=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}