Xamarin aplikacije
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Xamarin je platforma otvorenog koda dizajnirana za developere da prave aplikacije za iOS, Android i Windows koristeći .NET i C# framework-e. Ova platforma pruža pristup brojnim alatima i ekstenzijama za efikasno kreiranje modernih aplikacija.
Arhitektura Xamarin-a
- Za Android, Xamarin se integriše sa Android i Java namespaces kroz .NET bindings, radeći unutar Mono izvršnog okruženja pored Android Runtime-a (ART). Managed Callable Wrappers (MCW) i Android Callable Wrappers (ACW) olakšavaju komunikaciju između Mono i ART, od kojih su oba izgrađena na Linux kernelu.
- Za iOS, aplikacije rade pod Mono runtime-om, koristeći punu Ahead of Time (AOT) kompilaciju da konvertuju C# .NET kod u ARM asemblerski jezik. Ovaj proces radi pored Objective-C Runtime-a na UNIX-sličnom kernelu.
.NET Runtime i Mono Framework
The .NET framework uključuje assemblies, klase i namespaces za razvoj aplikacija, dok .NET Runtime upravlja izvršavanjem koda. Pruža platformsku nezavisnost i kompatibilnost unazad. The Mono Framework je verzija .NET framework-a otvorenog koda, započeta 2005. godine da proširi .NET na Linux, sada podržana od strane Microsoft-a i vođena od strane Xamarin-a.
Obrnuto inženjerstvo Xamarin aplikacija
Dekompilacija Xamarin assemblies
Dekompilacija pretvara kompajlirani kod nazad u izvorni kod. Na Windows-u, Modules prozor u Visual Studio može identifikovati module za dekompilaciju, što omogućava direktan pristup kodu trećih strana i ekstrakciju izvornog koda za analizu.
JIT vs AOT kompilacija
- Android podržava Just-In-Time (JIT) i Ahead-Of-Time (AOT) kompilaciju, sa Hybrid AOT modom za optimalnu brzinu izvršavanja. Full AOT je ekskluzivan za Enterprise licence.
- iOS koristi isključivo AOT kompilaciju zbog Apple-ovih ograničenja na dinamičko izvršavanje koda.
Ekstrakcija dll fajlova iz APK/IPA
Da biste pristupili assemblies u APK/IPA, raspakujte fajl i pregledajte direktorijum assemblies. Za Android, alati kao što su XamAsmUnZ i xamarin-decompress mogu raspakovati dll fajlove.
python3 xamarin-decompress.py -o /path/to/decompressed/apk
U slučajevima kada se nakon dekompajliranja APK-a može videti direktorijum unknown/assemblies/ sa .dll fajlovima unutra, moguće je koristiti dnSpy direktno nad tim .dll fajlovima za analizu. Međutim, ponekad se fajlovi assemblies.blob i assemblies.manifest nalaze u direktorijumu unknown/assemblies/. Alat pyxamstore može da raspakuje assemblies.blob fajl u Xamarin aplikacijama, omogućavajući pristup .NET assemblies za dalju analizu:
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
Novije Android MAUI 9 kompilacije više ne izlažu assemblies.blob direktno. Umesto toga, svaki ABI isporučuje ELF kontejner kao što je lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. To je validna shared library sa prilagođenom payload sekcijom koja sadrži managed assembly store.
Brzi tok rada:
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
Ako llvm-readelf prikazuje sekciju payload, iskopirajte je i proverite da li izvučeni blob počinje sa XABA (0x41424158). Taj payload je assembly store dokumentovan u .NET for Android, a ne pojedinačan DLL.
Raspored store-a je koristan kada treba ručno izdvojiti assembly-je ili validirati extractor:
- Zaglavlje:
struct.unpack('<5I', ...)zamagic,version,entry_count,index_entry_count,index_size - Deskriptori:
entry_countzapisa odstruct.unpack('<7I', ...)sadata_offset/data_sizei opcionim debug/config offset-ima - Index: preskočite
index_sizebajtova - Names:
uint32 length+ UTF-8 bajtovi - Data: pozicionirajte se na svaki
data_offseti upišitedata_sizebajtova kao<name>.dll
Neki izvučeni fajlovi i dalje se neće direktno otvoriti u dnSpy/ILSpy/dotPeek zato što su dodatno umotani u XALZ. U tom slučaju:
- Proverite prva 4 bajta svakog izvučenog fajla da li su
XALZ - Pročitajte nekompresovanu veličinu iz bajtova
8:12kao little-endianuint32 - Dekompresujte bajtove
12:pomoćulz4.block.decompress(...)
Minimalna logika dekompresije:
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)
Ako ne želite ručno parsirati store, pymauistore automatizuje ELF payload extraction, XABA store parsing i XALZ decompression za MAUI 9 APKs.
Neki stariji Xamarin/MAUI buildovi pohranjuju kompresovane assemblies koristeći XALZ format unutar /assemblies.blob ili /resources/assemblies. Možete ih brzo dekompresovati koristeći biblioteku 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)
iOS dll fajlovi su lako dostupni za dekompajliranje, otkrivajući značajan deo koda aplikacije, koji često ima zajedničku bazu na različitim platformama.
AOT on iOS: managed IL je kompajliran u native
*.aotdata.*files. Patchovanje samog DLL-a neće promeniti logiku; potrebno je hook-ovati native stubs (npr. sa Frida) jer su IL bodies prazni placeholderi.
Statička analiza
Kada se .dll fajlovi dobiju, moguće je statički analizirati .Net kod koristeći alate kao što su dnSpy ili ILSpy koji omogućavaju modifikaciju koda aplikacije. Ovo može biti veoma korisno za manipulisanje aplikacijom kako bi se, na primer, zaobišle zaštite.
Napomena: nakon izmene aplikacije biće potrebno ponovo je pakovati i ponovo potpisati.
dnSpy je arhiviran; održavani forkovi kao što je dnSpyEx nastavljaju da rade sa .NET 8/MAUI assemblies i čuvaju debug simbole prilikom ponovnog čuvanja.
Dinamička analiza
Dinamička analiza podrazumeva proveru SSL pinninga i korišćenje alata kao što je Fridax za runtime modifikacije .NET binara u Xamarin aplikacijama. Frida skripte su dostupne za zaobilaženje detekcije root-a ili SSL pinninga, poboljšavajući mogućnosti analize.
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. Pokrenite ga nakon pokretanja aplikacije:
frida -U -l dist/xamarin-unpin.js com.target.app --no-pause
Kratak šablon za hook managed methods pomoću uključenog 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()); } });
Ponovno potpisivanje
Alat Uber APK Signer pojednostavljuje potpisivanje više APK-ova istim ključem i može se koristiti za ponovno potpisivanje aplikacije nakon što su u nju izvršene izmene.
Referencije
- 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
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


