Xamarin-Apps

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundlegende Informationen

Xamarin ist eine Open-Source-Plattform, die Entwicklern ermöglicht, Apps für iOS, Android und Windows zu erstellen unter Verwendung der .NET- und C#-Frameworks. Diese Plattform bietet Zugriff auf zahlreiche Tools und Erweiterungen, um moderne Anwendungen effizient zu entwickeln.

Xamarin-Architektur

  • Für Android integriert Xamarin Android- und Java-Namespaces über .NET-Bindings und läuft innerhalb der Mono-Ausführungsumgebung parallel zur Android Runtime (ART). Managed Callable Wrappers (MCW) und Android Callable Wrappers (ACW) ermöglichen die Kommunikation zwischen Mono und ART, die beide auf dem Linux-Kernel basieren.
  • Für iOS laufen Anwendungen unter der Mono-Runtime und nutzen vollständige Ahead of Time (AOT)-Kompilierung, um C# .NET-Code in ARM-Assembler zu konvertieren. Dieser Prozess läuft neben der Objective-C Runtime auf einem UNIX-ähnlichen Kernel.

.NET-Runtime und Mono-Framework

Das .NET-Framework enthält Assemblies, Klassen und Namespaces für die Anwendungsentwicklung, wobei die .NET-Runtime die Codeausführung verwaltet. Es bietet Plattformunabhängigkeit und Abwärtskompatibilität. Das Mono Framework ist eine Open-Source-Variante des .NET-Frameworks, die 2005 initiiert wurde, um .NET auf Linux zu bringen; inzwischen wird es von Microsoft unterstützt und von Xamarin geführt.

Reverse Engineering Xamarin Apps

Decompilation of Xamarin Assemblies

Decompilation wandelt kompilierten Code zurück in Quellcode. Unter Windows kann das Modules-Fenster in Visual Studio Module identifizieren, die dekompiliert werden können, was direkten Zugriff auf Drittanbieter-Code und die Extraktion von Quellcode zur Analyse ermöglicht.

JIT vs AOT Kompilierung

  • Android unterstützt Just-In-Time (JIT) und Ahead-Of-Time (AOT)-Kompilierung, mit einem Hybrid AOT-Modus für optimale Ausführungsgeschwindigkeit. Full AOT ist ausschließlich Enterprise-Lizenzen vorbehalten.
  • iOS verwendet ausschließlich AOT-Kompilierung aufgrund von Apples Beschränkungen für dynamische Codeausführung.

Extrahieren von dll-Dateien aus APK/IPA

Um auf die Assemblies in einer APK/IPA zuzugreifen, entpacke die Datei und durchsuche den Ordner “assemblies”. Für Android können Tools wie XamAsmUnZ und xamarin-decompress dll-Dateien entpacken.

python3 xamarin-decompress.py -o /path/to/decompressed/apk

In Fällen, in denen nach dem Decompilieren der APK der Ordner unknown/assemblies/ mit den .dll-Dateien darin sichtbar ist, kann man dnSpy direkt auf die .dlls anwenden, um sie zu analysieren. Allerdings befinden sich manchmal die Dateien assemblies.blob und assemblies.manifest im Ordner unknown/assemblies/. Das Tool pyxamstore kann die Datei assemblies.blob in Xamarin-Apps entpacken und ermöglicht so den Zugriff auf die .NET Assemblies für weitere Analysen:

pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack

.NET MAUI 9 / .NET for Android assembly stores innerhalb von ELF .so

Neuere Android MAUI 9-Builds legen assemblies.blob nicht mehr direkt offen. Stattdessen liefert jede ABI einen ELF-Container, wie z. B. lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Dies ist eine gültige shared library mit einer benutzerdefinierten payload-Section, die den verwalteten Assembly-Store enthält.

Schneller Workflow:

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

If 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.

Das Store-Layout ist nützlich, wenn du Assemblies manuell carve musst oder einen Extractor validieren willst:

  • Header: struct.unpack('<5I', ...) für magic, version, entry_count, index_entry_count, index_size
  • Descriptors: entry_count records of struct.unpack('<7I', ...) with data_offset / data_size and optional debug/config offsets
  • Index: skip index_size bytes
  • Names: uint32 length + UTF-8 bytes
  • Data: seek to each data_offset and write data_size bytes as <name>.dll

Some extracted entries still won’t open directly in dnSpy/ILSpy/dotPeek because they are additionally wrapped with XALZ. In that case:

  • Prüfe die ersten 4 Bytes jeder extrahierten Datei auf XALZ
  • Lese die unkomprimierte Größe aus den Bytes 8:12 als little-endian uint32
  • Dekomprimiere die Bytes 12: mit lz4.block.decompress(...)

Minimale Dekompressionslogik:

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)

Wenn du den Store nicht manuell parsen möchtest, automatisiert pymauistore die Extraktion von ELF-Payloads, das Parsen des XABA-Stores und die Dekompression von XALZ für MAUI 9 APKs.

Einige ältere Xamarin/MAUI-Builds speichern komprimierte assemblies im XALZ-Format in /assemblies.blob oder /resources/assemblies. Du kannst sie schnell mit der xamarout Bibliothek dekomprimieren:

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)

iOS .dll-Dateien sind leicht zugänglich für die Dekompilierung und offenbaren große Teile des Anwendungscodes, der häufig eine gemeinsame Basis über verschiedene Plattformen hinweg teilt.

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.

Statische Analyse

Sobald die .dlls erhalten sind, ist es möglich, den .Net-Code statisch mit Tools wie dnSpy oder ILSpy zu analysieren, die das Modifizieren des App-Codes erlauben. Das kann sehr nützlich sein, um die Anwendung beispielsweise zu manipulieren, um Schutzmechanismen zu umgehen.
Beachte, dass nach dem Modifizieren der App diese wieder gepackt und neu signiert werden muss.

dnSpy ist archiviert; gepflegte Forks wie dnSpyEx funktionieren weiterhin mit .NET 8/MAUI-Assemblies und erhalten Debug-Symbole beim erneuten Speichern.

Dynamische Analyse

Dynamische Analyse umfasst das Prüfen auf SSL pinning und den Einsatz von Tools wie Fridax für Laufzeitmodifikationen der .NET-Binärdatei in Xamarin-Apps. Frida-Skripte sind verfügbar, um Root-Detection oder SSL-Pinning zu umgehen und so die Analysefähigkeiten zu erweitern.

Weitere interessante Frida-Skripte:

Das aktualisierte Frida-xamarin-unpin (Mono >=6) hookt System.Net.Http.HttpClient.SendAsync und tauscht den Handler gegen einen permissiven aus, sodass es weiterhin funktioniert, selbst wenn Pinning in benutzerdefinierten Handlern implementiert ist. Führe es aus, nachdem die App gestartet ist:

frida -U -l dist/xamarin-unpin.js com.target.app --no-pause

Schnelle Vorlage, um mit dem mitgelieferten frida-mono-api managed methods zu hooken:

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()); } });

Neu signieren

Das Tool Uber APK Signer vereinfacht das Signieren mehrerer APKs mit demselben Schlüssel und kann verwendet werden, um eine App nach vorgenommenen Änderungen neu zu signieren.

Referenzen

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks