Android reverse-engineering
find a trojan information in a closed source apps
Chi sono
Fabio Zito (@ZiteLOG)
Che cos’è il reverse-engineering?
Reverse engineering (in italiano "ingegneria inversa", "ingegnerizzazione inversa") è un anglicismo che indica
quell'insieme di analisi delle funzioni, degli impieghi, della collocazione, dell'aspetto progettuale, geometrico
e materiale di un manufatto o di un oggetto che è stato rinvenuto (ad esempio un reperto, un dispositivo,
componente elettrico, un meccanismo, software). (Wikipedia)
Sviluppo
1 2 3
● Spaghetti 12 OZ
● Guanciale 4 OZ
● Very fresh egg yolks 4
● Aged Pecorino Romano cheese
● Grated e TBSP Grana Padano cheese
● Grated salt black pepper
● Secret Sauce
Reverse-Engineering
3 2 1
● Spaghetti 12 OZ
● Guanciale 4 OZ
● Very fresh egg yolks 4
● Aged Pecorino Romano cheese
● Grated e TBSP Grana Padano cheese
● Gratedsalt black pepper
● Secret Sauce
Ma a cosa serve?
audit/modify/malware analysis…
Che cos’è la Malware Analysis?
La Malware Analysis è un ramo della Cyber Security che si occupa di scovare e neutralizzare
minacce informatiche quali virus, worm, bot, rootkit, spyware, backdoor, Trojan Horse, etc.
Ma a cosa serve esattamente quando si parla di Trojan?
A rispondere a domande come: Attraverso l’identificazione:
● Sono Spiato? ● Del malware.
● Chi mi sta spiando e come ha fatto ad ● Delle modalità di inoculazione.
infettarmi?
● Delle informazioni acquisite e della
● Dove vanno a “finire” i miei dati? loro destinazione finale
Che cos’è un Trojan?
Il Trojan è un programma maligno mascherato da qualcosa di benigno (il nome infatti deriva da
Cavallo di Troia, in esplicito riferimento alla leggenda Greca). Sono scritti principalmente per
sottrarre informazioni e esercitare controllo sul dispositivo infettato attraverso
due componenti:
● Un client installato sul dispositivo dell’utente che si occupa di inviare dati e/o
ricevere comandi.
● Uno o più server che si occupano di ricevere e memorizzare i dati inviati dal client
e inviare comandi verso quest’ultimo.
Cose da conoscere prima di iniziare
APK
L'estensione APK indica un file Android Package. Questo formato di file, una variante del formato .JAR, è
utilizzato per la distribuzione e l'installazione di componenti in dotazione sulla piattaforma per dispositivi
mobili Android. (Wikipedia)
Cartelle: Componenti:
META-INF Activity
res Receiver
File: Service
Provider
AndroidManifest.xml
classes.dex
resources.arsc
Compilare: Source Code → DEX
Disassemblare: DEX → Smali
Offuscamento
Spyme.getConnectionParams() == b.b()
Smali?
The names "smali" and "baksmali" are the Icelandic equivalents of "assembler" and "disassembler" respectively. Why Icelandic you
ask? Because dalvik was named for an Icelandic fishing village. (https://github.com/JesusFreke/smali/wiki)
Registri
v0, v1, v2… vN registri locali
p0, p1, p2… pN argomenti (p0 == this)
https://github.com/JesusFreke/smali/wiki/Registers
AndroidManifest.xml
Ogni applicazione Android dev'essere accompagnata da un file chiamato AndroidManifest.xml nella
sua cartella principale. Il Manifest raccoglie informazioni basilari sull'app, informazioni necessarie al
sistema per far girare qualsiasi porzione di codice della stessa.
● il nome del package dell'applicazione, che è anche un identificatore univoco della stessa;
● il codice della versione
● la versione del SDK minima per l'utilizzo dell'applicazione
● Descrive le componenti dell'applicazione (attività, servizi, receiver, provider, ecc.), nomina le classi e
pubblica le loro "competenze".
● i permessi dell'app, e i permessi necessari alle altre app per interagire con la stessa
● le librerie necessarie all'app
Gli strumenti
APK Studio, IntelliJ IDEA,
Android Studio (LLDB), ADB Tools,
Wireshark e tcpdump
grep è il nostro migliore amico
Iniziamo!
#1 Disassemblare
#2 Analisi del Manifest
Info base e Permessi Application e Activity Receiver, Service e Provider
#3 Analisi statica
È la «lettura» delle istruzioni contenute nel codice disassemblato per capire come il malware o
parte di esso si comporta all’interno del dispositivo infetto. Generalmente per fare questo si
individuano porzioni di codice di interesse attraverso una serie di ricerche di tipo testuale
utilizzando determinate parole chiave. Di seguito alcuni esempi ricordandoci sempre che grep è il
nostro migliore amico.
Network I/O
il Trojan deve inviare e ricevere dati da un
server remoto. Sappiamo che
generalmente tali informazioni vengono
trasmesse/ricevute tramite protocolli
criptati come ad esempio HTTPS, nel quale
possono «viaggiare» sia i dati da trasferire
dal dispositivo al server
(messaggi/registrazione audio e video,
etc.), sia le informazioni di «servizio» che
il server invia al dispositivo (comandi,
programmazioni, etc) quest’ultime
generalmente sono in formato JSON.
#4 Analisi dinamica
Consiste nell’installare l’app in un dispositivo diverso (emulatore/muletto) da quello su cui è stato estratto il
malware . Lanciarla eseguendola passo, passo utilizzando un software di debugging, in particolare *LLDB
del progetto **LLVM (Low Level Virtual Machine) analizzandone man mano i valori contenuti nei registri.
NB: In qualche caso, tale analisi è possibile solo dopo modifica al codice dissasemblato.
NB1: È utile anche lo sniffing e l’analisi del traffico di rete.
*https://en.wikipedia.org/wiki/LLDB_(debugger)
**https://it.wikipedia.org/wiki/LLVM
1
Per prima cosa è necessario installare il file
“.apk” su un dispositivo con caratteristiche
simili (emulatore/muletto) a quello da
dove è stato individuato e successivamente
estratto il Trojan. Questo al duplice
obbiettivo di:
1. non operare alcuna alterazione sul
dispositivo originale;
2. consentire la ripetibilità di tutte le
operazioni fatte.
2
Una volta installata, è necessario
«collegare» il dispositivo al codice
dissasemblato (i file .smali) attraverso
l’IDE utilizzata (Android studio/Intellij
IDEA) e qui impostare , nei punti
individuati in fase di analisi statica, i
breakpoint che consentiranno di
«bloccare» l’applicazione una volta
lanciata.
3
Eseguire l’applicazione “bloccata”
un’istruzione alla volta (passo-passo)
leggendo il contenuto memorizzato
all’interno dei registri, ogni qualvolta
viene eseguita un’istruzione fino ad
individuare quella di interesse.
Esempio su caso reale
Cambio di IMEI
Grazie per l’attenzione