What is the file struture at runtime
It exists 2 types of storages:
Internal Stockage
location: /data/data/
permissions: Not needed but only APK itself (unique uid) can access.
External Stockage
location: /storage/emulated/0/Android/data/<package_name>/
permissions:
- READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
Some other storages and permission need to access/read/write, picture, audio, video.
Bienvenu à cette présentation sur l'outil Apkpatcher
</div>
<div style="text-align:left;margin-top:15%;">
**Contributions**
- A 4 years tool experience on APK patching with documentation;
- A pythonic tool to manipulate APK;
- A benchmark of patching tool.
</div>
Je suis en chercheur en cybersécurité plutot sur des sujets bas niveau embarqué et vous allez commencez à me connaitre j'aime bien aussi joué avec Android et je présente ses side project au SSTIC.
Le but de cette contribution est d'aporté:
- Un outil ayant 4 ans d'experience permettant de récupérer une application Android, la modifier et la réinstaller.
- Cet outil permet aussi d'être intégrer dans n'importe quel autre outil développé en python.
- Et enfin un benchmark sur les solutions de patching.
Why we need to patch an Android Application

Une APK est une boite noir q'on aimerait comprendre.
Sans se plonger dans les détails, d'un application, regardons d'une vue macro comment cela fonctionne.
Chaque APK a son propre utilisateur avec des droit configuré présenté sous forme de permissions permettant de communiqué avec d'autres application, accéder au stockage interne ou des composants externes comme le WiFi ou BLE et d'autres en étandant au système android appliqué au Automobile ou au IOT.
Si on souhaite comprendre ce qui se passe dans chacune de ces applications pour auditer leur sécurité, ou permettre de l'interopérabilité ou encore mieux controler ce que les applications font sur nos systèmes.
Il existe 3 solutions:
---
Android est un système ou les accès peuvent etre limité et plutot bien segmenté
"image d'une apk en black box avec ces imput output (Wifi, stockage, BLE, IOT pinout) via un environment Android"
L'environement peut etre controlé soit via émulation, téléphone rooté mais quid des environements que l'on ne peut pas rooté et pourquoi s'embeter à rooté un téléphone quand on peut utilisé n'importe quel téléphone et faire tout ce qu'il est possible avec un téléphone rooté
D'un autre coté on voudra aussi supprimer des portions de code comme du tracking et idéalement automatisé au mieux la tache et l'intégré dans un déploiement continu par exemple.
Bien entendu, et il reste important de le préciser, ce type d'outil peuvent rendre le développement plus abordable de certains malwares permettant d'ajouter des fonctionalités ou redirigé d'une application légitime.
Router l'Android afin de controler l'ensemble du support mais cela demande d'avoir une exploit pour l'appareil cible. En plus c'est la solution la plus commune et les applications s'en protège de mieux en mieux. Et pour finir on ne peut appliqué nos modification que sur le système rooté permettant pas de délivré des applications modifié avec par exemples des trackers de supprimé.
On aura de meme avec un système émulé sans avoir la nécessité d'avoir un exploit par contre on perdra l'accès au composants externe.
Pour la solution présenté aujourd'hui
split apk
APK
XAPK
graphique poupée russe XAPK contient APK et split APK
on ne prend pas en compte les XAPK
TODO ajouter resources.arsc
TODO ajouter resources.arsc
---
# Application structure

<img src="img/manifest-resources-1-1.png" style="position=absolute;width:1100px;display:block;" />
<img src="img/manifest-resources-1.png" style="position=absolute;width:1100px;display:block;margin-top:-450px" />
Les resources externe dans le Manifest sont identifié par un id renseigné dans le fichier de resources

Pour changer la configuration réseau pour par exemple y ajouter un certificat TLS autosigné, ce qui pourrait etre utilisé pour intercepter les requetes HTTPS et mieux comprendre les communications réseaux.
Pour cela comment on peut faire dans le cas d'un téléphone rooté en général il est possible d'ajouter un certificat à la liste des certificats de confiance d'android.
Mais sans rooté une application il est possible d'y ajouter dans le Manifest une resources externe networkSecurityConfig que l'on retrouve dans le fichier resources.arsc qui renvoie vers un fichier 8G.xml qui contient une configuration qu'il est possible de modifier pour ajouter un certificat spécifique qui sera lui même renseigné dans le fichier resources.arsc.


Dans les donées interessantes pour le patching d'application, on aura le AndroidManifest qui décrira l'ensemble de la structure des fichiers contenu dans l'APK:
- si l'application peut être débugguer avec l'option: android:debuggable="true" permettant l'utilisation d'un gdbserver pour les applications native et jdb pour le code Java
- la présence ou non d'une configuration réseaux notament utilisé quand des certificats TLS particuliers sont utilisé, on spécifiera dans ce cas la un lien vers le fichier contenant la configuration et le lien vers le certificat TLS.
Les fichiers classes.dex contiendra le code JAVA au format Smali
Le dossier Lib contenant les binaire natif au format ELF
Lors de la compilation, on va compiler le code avec les fichiers de code source Java et la bibliothèque standard android.jar puis on utilisera aapt pour y ajouter toutes nos resources XML pour construire notre application et enfin la signer.
Cependant lors de l'extraction la plus naive, en dézippant ou avec le programme apktool avec l'option without-resource, on recupère notre code source compilé au format dex et nos resources cette fois-ci non pas au format XML mais au format AXML.
On obtient aussi un fichier non présent initialement le fichier "resource.arsc". Ce fichier est aussi un fichier AXML mais au format légèrement différent qu'on abordera pas durant la présentation bien que l'outil présenté aujourd'hui peut également manipuler ce type de fichier.
Ce fichier bien particulier permet entre autres d'associer des fichiers comme le fichier MY_XML_FILE à un id, permettant d'optimiser la place dans le fichier zip.
See for share uid if share uid can acess
TODO: Tuto explication sur ce que contient une APK quand elle est installé
Lister les APKs sur le telephone
adb shell pm list packages --user 10 -f -3
adb shell run-as com.example.mychallengeapp ls /data/data/com.example.mychallengeapp/
debu allow us to run-as
https://developer.android.com/training/data-storage
Internal stockage
/data/data/com.example.app/
├── cache/
├── files/
├── databases/
├── shared_prefs/
├── code_cache/
└── no_backup/
files:
- configuration (some file found from resources)
- content persistent
cache:
- temporary content (image, HTTP response)
database:
- sqlite database (provider for instance)
shared_prefs:
- UI display preferent
- user secret
code_cache:
- Art and DEX file
no_backup:
- File exclude from backup (token, temp key)
External Stockage
/storage/emulated/0/Android/data/<package_name>/
file share with others app and user
---
TODO
Ajouter slide jadx et montrer le reverse du level1 jusqu'au onCreate