Xamarin Apps
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Βασικές Πληροφορίες
Xamarin είναι μια πλατφόρμα ανοικτού κώδικα σχεδιασμένη για προγραμματιστές ώστε να δημιουργούν εφαρμογές για iOS, Android και Windows χρησιμοποιώντας τα .NET και C# frameworks. Αυτή η πλατφόρμα προσφέρει πρόσβαση σε πλήθος εργαλείων και επεκτάσεων για αποτελεσματική δημιουργία σύγχρονων εφαρμογών.
Αρχιτεκτονική του Xamarin
- Για Android, το Xamarin ενσωματώνεται με namespaces του Android και Java μέσω .NET bindings, λειτουργώντας μέσα στο περιβάλλον εκτέλεσης Mono παράλληλα με το Android Runtime (ART). Managed Callable Wrappers (MCW) και Android Callable Wrappers (ACW) διευκολύνουν την επικοινωνία μεταξύ Mono και ART, τα οποία και τα δύο βασίζονται στον πυρήνα Linux.
- Για iOS, οι εφαρμογές τρέχουν κάτω από το runtime του Mono, χρησιμοποιώντας πλήρη Ahead of Time (AOT) μεταγλώττιση για να μετατρέψουν κώδικα C# .NET σε ARM assembly. Αυτή η διαδικασία τρέχει παράλληλα με το Objective-C Runtime σε ένα UNIX-όμοιο kernel.
.NET Runtime και Mono Framework
Το .NET framework περιλαμβάνει assemblies, classes και namespaces για την ανάπτυξη εφαρμογών, με το .NET Runtime να διαχειρίζεται την εκτέλεση του κώδικα. Προσφέρει ανεξαρτησία πλατφόρμας και συμβατότητα προς τα πίσω. Το Mono Framework είναι μια έκδοση ανοιχτού κώδικα του .NET framework, ξεκίνησε το 2005 για να επεκτείνει το .NET σε Linux, τώρα υποστηρίζεται από τη Microsoft και ηγείται από την Xamarin.
Αντίστροφη Μηχανική Εφαρμογών Xamarin
Απομεταγλώττιση των Xamarin Assemblies
Η απομεταγλώττιση (decompilation) μετατρέπει τον compiled κώδικα πίσω σε πηγαίο κώδικα. Σε Windows, το παράθυρο Modules στο Visual Studio μπορεί να εντοπίσει modules για απομεταγλώττιση, επιτρέποντας άμεση πρόσβαση σε κώδικα τρίτων και εξαγωγή του πηγαίου κώδικα για ανάλυση.
JIT vs AOT Μεταγλώττιση
- Android υποστηρίζει Just-In-Time (JIT) και Ahead-Of-Time (AOT) μεταγλώττιση, με λειτουργία Hybrid AOT για βέλτιστη ταχύτητα εκτέλεσης. Η πλήρης AOT είναι αποκλειστική σε Enterprise άδειες.
- iOS χρησιμοποιεί αποκλειστικά AOT μεταγλώττιση λόγω των περιορισμών της Apple στην δυναμική εκτέλεση κώδικα.
Εξαγωγή αρχείων dll από APK/IPA
Για να αποκτήσετε πρόσβαση στα assemblies μέσα σε ένα APK/IPA, αποσυμπιέστε το αρχείο και εξερευνήστε τον φάκελο assemblies. Για Android, εργαλεία όπως XamAsmUnZ και xamarin-decompress μπορούν να αποσυμπιέσουν αρχεία dll.
python3 xamarin-decompress.py -o /path/to/decompressed/apk
Σε περιπτώσεις όπου, μετά το decompiling του APK, είναι δυνατόν να δει κανείς τον φάκελο unknown/assemblies/ με τα .dll αρχεία μέσα, είναι δυνατό να χρησιμοποιήσει κανείς το dnSpy απευθείας πάνω στα .dlls για να τα αναλύσει. Ωστόσο, κάποιες φορές τα αρχεία assemblies.blob και assemblies.manifest βρίσκονται μέσα στον φάκελο unknown/assemblies/. Το εργαλείο pyxamstore μπορεί να αποσυσκευάσει το αρχείο assemblies.blob σε Xamarin apps, επιτρέποντας την πρόσβαση στις .NET assemblies για περαιτέρω ανάλυση:
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack
.NET MAUI 9 / .NET for Android αποθήκες assembly μέσα σε ELF .so
Οι πρόσφατες builds του Android MAUI 9 δεν εκθέτουν πλέον το assemblies.blob απευθείας. Αντ’ αυτού, κάθε ABI περιλαμβάνει ένα δοχείο ELF όπως το lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Αυτό είναι μια έγκυρη shared library με μια προσαρμοσμένη ενότητα payload που περιέχει τη διαχειριζόμενη αποθήκη assembly.
Quick 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.
Η διάταξη του store είναι χρήσιμη όταν χρειάζεται να εξάγετε assemblies χειροκίνητα ή να επαληθεύσετε έναν extractor:
- Επικεφαλίδα:
struct.unpack('<5I', ...)γιαmagic,version,entry_count,index_entry_count,index_size - Περιγραφείς:
entry_countεγγραφές τουstruct.unpack('<7I', ...)μεdata_offset/data_sizeκαι προαιρετικά debug/config offsets - Ευρετήριο: παράλειψε
index_sizebytes - Ονόματα:
uint32 length+ UTF-8 bytes - Δεδομένα: μεταβείτε σε κάθε
data_offsetκαι γράψτεdata_sizebytes ως<name>.dll
Μερικές εξαγόμενες εγγραφές ίσως δεν ανοίγουν απευθείας σε dnSpy/ILSpy/dotPeek επειδή είναι επιπλέον τυλιγμένες με XALZ. Σε αυτή την περίπτωση:
- Ελέγξτε τα πρώτα 4 bytes κάθε εξαγόμενου αρχείου για
XALZ - Διαβάστε το μη-συμπιεσμένο μέγεθος από τα bytes
8:12ως little-endianuint32 - Αποσυμπιέστε τα bytes
12:μεlz4.block.decompress(...)
Ελάχιστη λογική αποσυμπίεσης:
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)
Αν δεν θέλετε να αναλύσετε το store χειροκίνητα, το pymauistore αυτοματοποιεί την ELF payload extraction, το XABA store parsing και την XALZ decompression για MAUI 9 APKs.
Ορισμένα παλαιότερα builds του Xamarin/MAUI αποθηκεύουν συμπιεσμένα assemblies χρησιμοποιώντας τη μορφή XALZ μέσα σε /assemblies.blob ή /resources/assemblies. Μπορείτε να τα αποσυμπιέσετε γρήγορα με τη βιβλιοθήκη 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)
Τα αρχεία dll για iOS είναι εύκολα προσβάσιμα για απομεταγλώττιση, αποκαλύπτοντας σημαντικά τμήματα του κώδικα της εφαρμογής, τα οποία συχνά μοιράζονται κοινή βάση ανάμεσα σε διαφορετικές πλατφόρμες.
AOT on iOS: το managed IL μεταγλωττίζεται σε native
*.aotdata.*αρχεία. Η τροποποίηση του DLL μόνη της δεν θα αλλάξει τη λογική· πρέπει να κάνετε hook στα native stubs (π.χ. με Frida) επειδή τα IL bodies είναι κενά placeholders.
Στατική Ανάλυση
Μόλις αποκτηθούν τα .dll είναι δυνατό να αναλυθεί ο .Net κώδικας στατικά χρησιμοποιώντας εργαλεία όπως dnSpy ή ILSpy που θα επιτρέψουν την τροποποίηση του κώδικα της εφαρμογής. Αυτό μπορεί να είναι πολύ χρήσιμο για να αλλοιώσετε την εφαρμογή, π.χ. για να παρακάμψετε προστασίες.
Σημειώστε ότι μετά την τροποποίηση της εφαρμογής θα χρειαστεί να τη συσκευάσετε ξανά και να την υπογράψετε εκ νέου.
dnSpy έχει αρχειοθετηθεί· forks που συντηρούνται όπως dnSpyEx συνεχίζουν να λειτουργούν με assemblies .NET 8/MAUI και διατηρούν τα debug symbols κατά την επανα-αποθήκευση.
Δυναμική Ανάλυση
Η δυναμική ανάλυση περιλαμβάνει έλεγχο για SSL pinning και τη χρήση εργαλείων όπως Fridax για runtime τροποποιήσεις του .NET binary σε εφαρμογές Xamarin. Διαθέσιμα Frida scripts μπορούν να παρακάμψουν root detection ή SSL pinning, ενισχύοντας τις δυνατότητες ανάλυσης.
Other interesting Frida scripts:
Updated Frida-xamarin-unpin (Mono >=6) κάνει hook στο System.Net.Http.HttpClient.SendAsync και αντικαθιστά τον handler με έναν permissive, οπότε λειτουργεί ακόμη και όταν το pinning υλοποιείται σε custom handlers. Εκτελέστε το μετά την εκκίνηση της εφαρμογής:
frida -U -l dist/xamarin-unpin.js com.target.app --no-pause
Σύντομο πρότυπο για hook managed methods με το ενσωματωμένο 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()); } });
Επανυπογραφή
Το εργαλείο Uber APK Signer απλοποιεί την υπογραφή πολλαπλών APK με το ίδιο κλειδί και μπορεί να χρησιμοποιηθεί για την επανυπογραφή μιας εφαρμογής μετά την πραγματοποίηση αλλαγών σε αυτή.
Αναφορές
- 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
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


