Xamarin Apps

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basiese Inligting

Xamarin is ’n open-source platform ontwerp vir ontwikkelaars om apps vir iOS, Android, en Windows te bou met die .NET- en C#-raamwerke. Hierdie platform bied toegang tot talle gereedskap en uitbreidings om moderne toepassings doeltreffend te skep.

Xamarin se Argitektuur

  • Vir Android, integreer Xamarin met Android- en Java-namespaces deur .NET bindings, en werk binne die Mono-uitvoeringsomgewing langs die Android Runtime (ART). Managed Callable Wrappers (MCW) en Android Callable Wrappers (ACW) fasiliteer kommunikasie tussen Mono en ART, wat albei op die Linux-kern gebou is.
  • Vir iOS, hardloop toepassings onder die Mono runtime en gebruik volledige Ahead of Time (AOT) compilatie om C# .NET-kode na ARM-assemblytaal om te skakel. Hierdie proses loop langs die Objective-C Runtime op ’n UNIX-agtige kern.

.NET Runtime en Mono Framework

Die .NET framework sluit assemblies, classes en namespaces in vir toepassingontwikkeling, met die .NET Runtime wat kode-uitvoering bestuur. Dit bied platformonafhanklikheid en agterwaartse verenigbaarheid. Die Mono Framework is ’n open-source weergawe van die .NET framework, begin in 2005 om .NET na Linux uit te brei, en word nou deur Microsoft ondersteun en deur Xamarin gelei.

Reverse Engineering Xamarin Apps

Decompilation of Xamarin Assemblies

Decompilation transformeer saamgestelde kode terug in bronkode. In Windows kan die Modules window in Visual Studio modules identifiseer vir decompilation, wat direkte toegang tot third-party code en die onttrekking van bronkode vir analise moontlik maak.

JIT vs AOT Compilation

  • Android ondersteun Just-In-Time (JIT) en Ahead-Of-Time (AOT) compilatie, met ’n Hybrid AOT-modus vir optimale uitvoersnelheid. Volledige AOT is uitsluitlik beskikbaar vir Enterprise-lisensies.
  • iOS gebruik uitsluitlik AOT-compilatie as gevolg van Apple’s beperkings op dinamiese kode-uitvoering.

Extracting dll Files from APK/IPA

Om toegang tot die assemblies in ’n APK/IPA te kry, pak die lêer uit en verken die assemblies-direktorie. Vir Android kan gereedskap soos XamAsmUnZ en xamarin-decompress dll-lêers uitpak.

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

In gevalle waar, nadat die APK gedecompileer is, dit moontlik is om die unknown/assemblies/ gids met die .dll-lêers daarin te sien, is dit moontlik om dnSpy direk oor die .dlls te gebruik om hulle te analiseer. Soms is egter die assemblies.blob en assemblies.manifest lêers binne die unknown/assemblies/ gids. Die hulpmiddel pyxamstore kan die assemblies.blob lêer in Xamarin apps uitpak, wat toegang tot die .NET assemblies vir verdere analise moontlik maak:

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

.NET MAUI 9 / .NET for Android assembly stores inside ELF .so

Onlangse Android MAUI 9-boue openbaar nie meer assemblies.blob direk nie. In plaas daarvan lewer elke ABI ’n ELF-behouer soos lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Dit is ’n geldige gedeelde biblioteek met ’n aangepaste payload-afdeling wat die beheerde assembly store bevat.

Vinnige werkvloeistroom:

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

As llvm-readelf payload-afdeling wys, dump dit en verifieer dat die uitgehaalde blob begin met XABA (0x41424158). Daardie payload is die assembly store gedokumenteer deur .NET for Android, nie ’n enkele DLL nie.

Die store-layout is nuttig wanneer jy assemblies handmatig moet uitkrap of ’n extractor moet valideer:

  • Opskrif: struct.unpack('<5I', ...) vir magic, version, entry_count, index_entry_count, index_size
  • Beskrywers: entry_count rekords van struct.unpack('<7I', ...) met data_offset / data_size en opsionele debug/config offsets
  • Indeks: slaan index_size bytes oor
  • Name: uint32 length + UTF-8 bytes
  • Data: gaan na elke data_offset en skryf data_size bytes as <name>.dll

Sommige uitgehaalde inskrywings sal steeds nie direk in dnSpy/ILSpy/dotPeek oopmaak nie omdat hulle addisioneel met XALZ toegedraai is. In daardie geval:

  • Kontroleer die eerste 4 bytes van elke uitgehaalde lêer vir XALZ
  • Lees die ongekomprimeerde grootte uit bytes 8:12 as little-endian uint32
  • Dekomprimeer bytes 12: met lz4.block.decompress(...)

Minimale dekompressielogika:

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)

As jy nie die store handmatig wil ontleed nie, pymauistore automatiseer ELF payload extraction, XABA store parsing, en XALZ dekompressie vir MAUI 9 APKs.

Sommige ouer Xamarin/MAUI builds bewaar saamgeperste assemblies in die XALZ-formaat binne /assemblies.blob of /resources/assemblies. Jy kan hulle vinnig dekomprimeer met die xamarout biblioteek:

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-lêers is maklik beskikbaar vir dekompilasie, wat groot dele van die application code openbaar, wat dikwels ’n gemeenskaplike basis oor verskillende platforms deel.

AOT on iOS: managed IL word saamgestel in native *.aotdata.* files. Om net die DLL te patch sal nie die logika verander nie; jy moet native stubs hook (bv. met Frida) omdat die IL bodies leë plekhouers is.

Static Analysis

Sodra die .dll-lêers bekom is, is dit moontlik om die .Net code staties te ontleed met gereedskap soos dnSpy of ILSpy wat dit toelaat om die code van die app te wysig. Dit kan uiters nuttig wees om die application te manipuleer om byvoorbeeld beskermings te omseil.
Let wel: nadat jy die app gewysig het, sal jy dit weer moet inpakk en weer moet onderteken.

dnSpy is gearchiveer; maintained forks soos dnSpyEx werk steeds met .NET 8/MAUI assemblies en bewaar debug symbols wanneer dit herbewaar word.

Dynamic Analysis

Dynamic analysis behels die nagaan van SSL pinning en die gebruik van gereedskap soos Fridax vir runtime-wysigings van die .NET binary in Xamarin apps. Frida scripts is beskikbaar om root detection of SSL pinning te bypass, wat die analisevermoëns verbeter.

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

Vinnige sjabloon om managed methods te hook met die ingeslote frida-mono-api:

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

Herondertekening

Die hulpmiddel Uber APK Signer vereenvoudig die ondertekening van verskeie APK’s met dieselfde sleutel, en kan gebruik word om ’n app weer te onderteken nadat daar veranderinge daaraan aangebring is.

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks