Xamarin Apps
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Informazioni di base
Xamarin è una piattaforma open-source progettata per sviluppatori per build app per iOS, Android e Windows utilizzando i framework .NET e C#. Questa piattaforma offre accesso a numerosi strumenti ed estensioni per creare applicazioni moderne in modo efficiente.
Architettura di Xamarin
- Per Android, Xamarin si integra con gli namespace Android e Java tramite binding .NET, operando all’interno dell’ambiente di esecuzione Mono insieme all’Android Runtime (ART). Managed Callable Wrappers (MCW) e Android Callable Wrappers (ACW) facilitano la comunicazione tra Mono e ART, entrambi basati sul kernel Linux.
- Per iOS, le applicazioni girano sotto il runtime Mono, utilizzando la compilazione completa Ahead of Time (AOT) per convertire il codice C# .NET in assembly ARM. Questo processo opera insieme all’Objective-C Runtime su un kernel di tipo UNIX.
.NET Runtime e Mono Framework
Il framework .NET include assemblies, classi e namespace per lo sviluppo di applicazioni, con il .NET Runtime che gestisce l’esecuzione del codice. Offre indipendenza dalla piattaforma e compatibilità retroattiva. Il Mono Framework è una versione open-source del framework .NET, iniziata nel 2005 per estendere .NET a Linux, ora supportata da Microsoft e guidata da Xamarin.
Reverse Engineering Xamarin Apps
Decompilation of Xamarin Assemblies
La decompilation trasforma il codice compilato nuovamente in codice sorgente. In Windows, la Modules window in Visual Studio può identificare i moduli per la decompilation, permettendo l’accesso diretto al codice di terze parti e l’estrazione del codice sorgente per l’analisi.
JIT vs AOT Compilation
- Android supporta Just-In-Time (JIT) e Ahead-Of-Time (AOT) compilation, con una modalità Hybrid AOT per una velocità di esecuzione ottimale. Full AOT è esclusiva delle licenze Enterprise.
- iOS impiega esclusivamente AOT compilation a causa delle restrizioni di Apple sull’esecuzione dinamica di codice.
Estrazione di file dll da APK/IPA
Per accedere alle assemblies in un APK/IPA, decomprimi l’archivio e esplora la directory assemblies. Per Android, strumenti come XamAsmUnZ e xamarin-decompress possono decomprimere i file dll.
python3 xamarin-decompress.py -o /path/to/decompressed/apk
In caso in cui, dopo aver decompilato l’APK, sia possibile vedere la cartella unknown/assemblies/ con i file .dll al suo interno, è possibile usare dnSpy direttamente sui .dll per analizzarli. Tuttavia, a volte i file assemblies.blob e assemblies.manifest si trovano nella cartella unknown/assemblies/. Lo strumento pyxamstore può estrarre il file assemblies.blob nelle app Xamarin, permettendo l’accesso alle .NET assemblies per ulteriori analisi:
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack
.NET MAUI 9 / .NET for Android: store di assembly all’interno di ELF .so
Le recenti build Android MAUI 9 non espongono più assemblies.blob direttamente. Invece, ogni ABI include un contenitore ELF come lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Si tratta di una libreria condivisa valida con una sezione custom payload che contiene l’archivio degli assembly gestiti.
Flusso di lavoro rapido:
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
Se llvm-readelf mostra una sezione payload, estraila e verifica che il blob estratto inizi con XABA (0x41424158). Quel payload è lo storage di assembly documentato da .NET per Android, non una singola DLL.
La struttura dello store è utile quando devi carveare assembly manualmente o convalidare un extractor:
- Intestazione:
struct.unpack('<5I', ...)permagic,version,entry_count,index_entry_count,index_size - Descrittori:
entry_countrecord distruct.unpack('<7I', ...)condata_offset/data_sizee offset opzionali per debug/config - Indice: salta
index_sizebyte - Nomi:
uint32 length+ byte UTF-8 - Dati: posizionati su ogni
data_offsete scrividata_sizebyte come<name>.dll
Alcune voci estratte potrebbero comunque non aprirsi direttamente in dnSpy/ILSpy/dotPeek perché sono inoltre incapsulate con XALZ. In tal caso:
- Controlla i primi 4 byte di ogni file estratto per
XALZ - Leggi la dimensione non compressa dai byte
8:12come little-endianuint32 - Decomprimi i byte
12:conlz4.block.decompress(...)
Logica minima di decompressione:
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)
Se non vuoi analizzare manualmente lo store, pymauistore automatizza ELF payload extraction, XABA store parsing e XALZ decompression per MAUI 9 APKs.
Alcune build più vecchie di Xamarin/MAUI memorizzano assembly compressi usando il formato XALZ all’interno di /assemblies.blob o /resources/assemblies. Puoi decomprimerli rapidamente con la libreria 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)
I file .dll di iOS sono facilmente accessibili per la decompilazione, rivelando porzioni significative del codice dell’applicazione, che spesso condivide una base comune tra piattaforme diverse.
AOT on iOS: managed IL viene compilato in file nativi
*.aotdata.*. Patchare la DLL da sola non cambierà la logica; è necessario hookare gli stub nativi (e.g., con Frida) perché i corpi IL sono placeholder vuoti.
Static Analysis
Una volta ottenuti i .dll è possibile analizzare staticamente il codice .Net usando strumenti come dnSpy o ILSpy che permettono di modificare il codice dell’app. Questo può essere molto utile per manomettere l’applicazione e bypassare protezioni, per esempio.
Nota che dopo aver modificato l’app dovrai ripacchettarla e risignarla.
dnSpy è archived; fork mantenuti come dnSpyEx continuano a funzionare con assembly .NET 8/MAUI e preservano i simboli di debug durante il re-saving.
Dynamic Analysis
L’analisi dinamica include il controllo dello SSL pinning e l’uso di strumenti come Fridax per modifiche runtime del binario .NET nelle app Xamarin. Script Frida sono disponibili per bypassare root detection o SSL pinning, migliorando le capacità di analisi.
Other interesting Frida scripts:
Updated Frida-xamarin-unpin (Mono >=6) effettua hook su System.Net.Http.HttpClient.SendAsync e sostituisce l’handler con uno permissivo, quindi funziona anche quando il pinning è implementato in custom handlers. Run it after the app starts:
frida -U -l dist/xamarin-unpin.js com.target.app --no-pause
Template rapido per hookare i managed methods con il frida-mono-api incluso:
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()); } });
Rifirmare
Lo strumento Uber APK Signer semplifica la firma di più APK con la stessa chiave e può essere usato per rifirmare un’app dopo che sono state effettuate modifiche.
Riferimenti
- 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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


