Rieccoci a noi dopo un bel pò di tempo passato tra peripezie varie, l'altro giorno avevo un pò di tempo e un annoso problema da risolvere che mi affligge da un pò.
Per scopi che non sto qui a descrivere devo utilizzare un'app per controllare alcune informazioni scolastiche (non farò il nome per non creare scompiglio nel caso fortuito o sfortuito che qualcuno inciampasse in questo post) che ha dei comportamenti strani quando lo installo sul mio telefono, mentre su altri telefoni (anche dello stesso modello) tutto sembra filare correttamente.
In questi casi cosa si fà? come si capisce cosa sta facendo un'app senza avere il codice sorgente?
**** DISCLAIMER ****
Allora, premessa, questo non è un post di cybersecurity o penetration testing, ma solo due righe molto veloci su come si possano fare verifiche e controlli di come un'app comunica con l'esterno senza avere accesso al codice sorgente, quindi non vuole essere ne esaustivo e tanto meno completo.
**** FINE DISCLAIMER ****
Allora dicevo, come si fa?
Prima cosa proviamo ad applicare la tecnica "man in the middle" per capire a grandi linee come l'app comunica con l'esterno e se ci sono informazioni utili a risolvere la magagna.
Quindi provo subito con il mio fedele fiddler (classic ovviamente :-) ) e l'emulatore Android per windows, dove con qualche giro riesco a recuperare e installare l'apk della suddetta app e farla partire.
Ad un primo momento svariati errori di certificati, ma questo me lo aspettavo e nessun dato utile perchè l'app senza dare errori non effettuava chiamate, bloccate da Android per problemi di certificati self signed.
Quindi armato di santa pazienza cambio proxy e mi sposto su mitmproxy che non avevo mai usato, ma che sembra molto usato in questo genere di attività.
Armeggio un po' con questo proxy per prenderci confidenza e alla fine mi trovo sempre ad avere problemi di certificati, fino a che non trovo questo documento che mi spiega come installare nei Trusted Certified di Android il certificato di mimproxy.
Nel frattempo avevo fatto mille altre prove, cambiando sistema operativo e modalità di installazione di mimtproxy, ma nulla sempre problemi di certificati, fino a quando mi si accende la lampadina "vuoi vedere che ho installato i certificati sbagliati e quindi poi mitmproxy non si trova?", controllo ed effettivamente era così, avendo fatto dirverse prove, avevo installato in Android dei certificati (le chiavi pubbliche) di una installazione di mitmproxy che non stavo usando e dopo aver sistemato, boom!!! vedo le chiamate e mi si apre un mondo.
Superato l'entusiasmo iniziale ancora non capisco come mai, a parità di chiamate e risposte, l'app si comportava in modo diverso con telefoni diversi.
A questo punto provo ad andare un po' più a fondo decompilando l'app usando apk-mitm che fa anche altre cosine interessanti, ma che mi da modo di vedere i files che compongono l'app.
Apro la cartella dove ho scompattato l'apk e "oh bella, vedo dei files familiari"
ma vuoi vedere che l'hanno scritta con Xamarin?
Analizzo un po' ed effettivamente è scritta in Xamarin e allora mi dico "bene siamo a cavallo, da qua gioco in casa".
Apro il mio fedele IlSpy e inizio un po' a girovagare per il codice cercando di capire come mai ci fossero queste differenze.
Non vi tedio con tutte le prove e i giri che ho fatto, ma spoilero e arriviamo direttamente alla conclusione, guardando un po' le funzioni mi cade l'occhio su questo codice:
dove c'è un bel parse di una data da un formato stringa e mi chiedo "Vuoi vedere che dipende dalle impostazioni della lingua del telefono visto che lì non specificano il formato?"
Cambio la lingua di Android e la metto in Italiano e BINGO!! tutto funziona regolarmente!! e quindi metto fine a questo cruccio durato anni :-)
Poi visto che la fame viene mangiando, mi sono implementato nel mio bot il recupero di alcune informazioni che mi servivano, ma questa è storia per un'altro post.