Xamarin Apps
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Informations de base
Xamarin est une plateforme open-source conçue pour permettre aux développeurs de créer des apps pour iOS, Android et Windows en utilisant les frameworks .NET et C#. Cette plateforme donne accès à de nombreux outils et extensions pour créer des applications modernes de manière efficace.
Architecture de Xamarin
- Pour Android, Xamarin s’intègre aux namespaces Android et Java via des bindings .NET, fonctionnant dans l’environnement d’exécution Mono aux côtés de l’Android Runtime (ART). Les Managed Callable Wrappers (MCW) et Android Callable Wrappers (ACW) facilitent la communication entre Mono et ART, tous deux basés sur le kernel Linux.
- Pour iOS, les applications s’exécutent sous le runtime Mono, utilisant une compilation Ahead of Time (AOT) complète pour convertir le code C# .NET en langage assembleur ARM. Ce processus s’exécute aux côtés de l’Objective-C Runtime sur un kernel de type UNIX.
.NET Runtime et Mono Framework
Le framework .NET inclut des assemblies, des classes et des namespaces pour le développement d’applications, le .NET Runtime gérant l’exécution du code. Il offre indépendance de plateforme et compatibilité ascendante. Le Mono Framework est une version open-source du framework .NET, lancée en 2005 pour porter .NET sur Linux, aujourd’hui supportée par Microsoft et dirigée par Xamarin.
Reverse Engineering Xamarin Apps
Decompilation of Xamarin Assemblies
La décompilation transforme le code compilé en code source. Sous Windows, la fenêtre Modules de Visual Studio peut identifier les modules à décompiler, permettant un accès direct au code tiers et l’extraction du code source pour analyse.
JIT vs AOT Compilation
- Android prend en charge la compilation Just-In-Time (JIT) et Ahead-Of-Time (AOT), avec un mode Hybrid AOT pour une vitesse d’exécution optimale. Le AOT complet est réservé aux licences Enterprise.
- iOS n’utilise que la compilation AOT en raison des restrictions d’Apple sur l’exécution dynamique de code.
Extraction des fichiers dll depuis APK/IPA
Pour accéder aux assemblies dans un APK/IPA, dézippez le fichier et explorez le répertoire assemblies. Pour Android, des outils comme XamAsmUnZ et xamarin-decompress peuvent décompresser les fichiers dll.
python3 xamarin-decompress.py -o /path/to/decompressed/apk
Dans les cas où, après avoir décompilé l’APK, il est possible de voir le dossier unknown/assemblies/ contenant les fichiers .dll, il est possible d’utiliser dnSpy directement sur les .dll pour les analyser. Cependant, parfois les fichiers assemblies.blob et assemblies.manifest se trouvent dans le dossier unknown/assemblies/. L’outil pyxamstore peut décompresser le fichier assemblies.blob dans les applications Xamarin, permettant l’accès aux .NET assemblies pour une analyse plus approfondie :
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack
.NET MAUI 9 / .NET for Android : stockage des assemblies à l’intérieur d’un ELF .so
Les builds Android MAUI 9 récents n’exposent plus directement assemblies.blob. À la place, chaque ABI fournit un conteneur ELF tel que lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Il s’agit d’une bibliothèque partagée valide avec une section payload personnalisée qui contient le magasin d’assemblies gérées.
Flux de travail rapide :
unzip app.apk -d app_unpacked
llvm-readelf --section-headers app_unpacked/lib/arm64-v8a/libassemblies.arm64-v8a.blob.so
llvm-objcopy --dump-section=payload=payload.bin \
app_unpacked/lib/arm64-v8a/libassemblies.arm64-v8a.blob.so
hexdump -c -n 4 payload.bin # XABA
Si llvm-readelf shows a payload section, dump it and verify the extracted blob starts with XABA (0x41424158). That payload is the assembly store documented by .NET for Android, not a single DLL.
La structure du store est utile lorsque vous devez extraire manuellement des assemblies ou valider un extracteur :
- En-tête :
struct.unpack('<5I', ...)pourmagic,version,entry_count,index_entry_count,index_size - Descripteurs :
entry_countenregistrements destruct.unpack('<7I', ...)avecdata_offset/data_sizeet offsets debug/config optionnels - Index : sauter
index_sizeoctets - Noms :
uint32 length+ octets UTF-8 - Données : se placer à chaque
data_offsetet écriredata_sizeoctets en tant que<name>.dll
Certaines entrées extraites ne s’ouvriront toujours pas directement dans dnSpy/ILSpy/dotPeek car elles sont en plus encapsulées avec XALZ. Dans ce cas :
- Vérifier les 4 premiers octets de chaque fichier extrait pour
XALZ - Lire la taille décompressée depuis les octets
8:12en tant queuint32little-endian - Décompresser les octets
12:aveclz4.block.decompress(...)
Logique minimale de décompression :
import struct
import lz4.block
def decompress_xalz(data):
size = struct.unpack('<I', data[8:12])[0]
return lz4.block.decompress(data[12:], uncompressed_size=size)
Si vous ne voulez pas analyser le store manuellement, pymauistore automatise ELF payload extraction, XABA store parsing, et XALZ decompression pour les MAUI 9 APKs.
Certaines anciennes builds Xamarin/MAUI stockent des assemblies compressés en utilisant le format XALZ à l’intérieur de /assemblies.blob ou /resources/assemblies. Vous pouvez rapidement les décompresser avec la bibliothèque xamarout :
from xamarout import xalz
import os
for root, _, files in os.walk("."):
for f in files:
if open(os.path.join(root, f), 'rb').read(4) == b"XALZ":
xa = xalz.XamarinCompressedAssembly(os.path.join(root, f))
xa.write("decompressed/" + f)
Les fichiers .dll iOS sont facilement accessibles pour la décompilation, révélant des parties importantes du code de l’application, qui partagent souvent une base commune entre différentes plateformes.
AOT on iOS: managed IL is compiled into native
*.aotdata.*files. Patching the DLL alone will not change logic; you need to hook native stubs (e.g., with Frida) because the IL bodies are empty placeholders.
Static Analysis
Une fois les .dlls obtenues, il est possible d’analyser le code .Net de manière statique en utilisant des outils tels que dnSpy ou ILSpy qui permettront de modifier le code de l’app. Cela peut être très utile pour altérer l’application et contourner des protections, par exemple.
Notez qu’après modification de l’app vous devrez la reconditionner et la signer à nouveau.
dnSpy is archived; maintained forks like dnSpyEx keep working with .NET 8/MAUI assemblies and preserve debug symbols when re-saving.
Dynamic Analysis
L’analyse dynamique consiste à vérifier le SSL pinning et à utiliser des outils comme Fridax pour des modifications à l’exécution du binaire .NET dans les applications Xamarin. Des scripts Frida sont disponibles pour contourner la détection root ou le SSL pinning, améliorant les capacités d’analyse.
Other interesting Frida scripts:
Updated Frida-xamarin-unpin (Mono >=6) hooks System.Net.Http.HttpClient.SendAsync and swaps the handler to a permissive one, so it still works even when pinning is implemented in custom handlers. Run it after the app starts:
frida -U -l dist/xamarin-unpin.js com.target.app --no-pause
Modèle rapide pour hooker les méthodes managées avec le frida-mono-api inclus :
const mono = require('frida-mono-api');
Mono.ensureInitialized();
Mono.enumerateLoadedImages().forEach(i => console.log(i.name));
const klass = Mono.classFromName("Namespace", "Class");
const m = Mono.methodFromName(klass, "Method", 2);
Mono.intercept(m, { onEnter(args){ console.log(args[1].toInt32()); } });
Ré-signer
L’outil Uber APK Signer simplifie la signature de plusieurs APK avec la même clé, et peut être utilisé pour ré-signer une application après y avoir apporté des modifications.
Références
- https://www.appknox.com/security/xamarin-reverse-engineering-a-guide-for-penetration-testers
- https://thecobraden.com/posts/unpacking_xamarin_assembly_stores/
- https://medium.com/@justmobilesec/introduction-to-the-exploitation-of-xamarin-apps-fde4619a51bf
- https://github.com/jakev/pyxamstore
- https://pypi.org/project/xamarout/
- https://github.com/GoSecure/frida-xamarin-unpin
- https://gist.github.com/Diefunction/e26fce039efcab57aac342a4b2d48ff6
- https://reverseengineering.stackexchange.com/questions/31716/deobfuscating-ios-dll-file-i-think-arm64
- https://mwalkowski.com/post/decompiling-an-android-application-written-in-net-maui-9-xamarin/
- https://github.com/dotnet/android/blob/main/Documentation/project-docs/AssemblyStores.md
- https://github.com/dotnet/android/blob/main/Documentation/project-docs/ApkSharedLibraries.md
- https://github.com/mwalkowski/pymauistore/tree/main
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.


