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

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', ...) pour magic, version, entry_count, index_entry_count, index_size
  • Descripteurs : entry_count enregistrements de struct.unpack('<7I', ...) avec data_offset / data_size et offsets debug/config optionnels
  • Index : sauter index_size octets
  • Noms : uint32 length + octets UTF-8
  • Données : se placer à chaque data_offset et écrire data_size octets 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:12 en tant que uint32 little-endian
  • Décompresser les octets 12: avec lz4.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

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