Xamarin Uygulamaları
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Temel Bilgiler
Xamarin, geliştiricilerin .NET ve C# framework’lerini kullanarak iOS, Android ve Windows için uygulama geliştirmesine olanak sağlayan bir açık kaynak platformdur. Bu platform, modern uygulamaları verimli bir şekilde oluşturmak için çok sayıda araç ve eklentiye erişim sağlar.
Xamarin’ın Mimarisi
- Android için, Xamarin .NET bindings aracılığıyla Android ve Java namespaces ile bütünleşir; Mono yürütme ortamı içinde Android Runtime (ART) ile birlikte çalışır. Managed Callable Wrappers (MCW) ve Android Callable Wrappers (ACW), Mono ile ART arasındaki iletişimi kolaylaştırır; her ikisi de Linux kernel üzerine inşa edilmiştir.
- iOS için, uygulamalar Mono runtime altında çalışır ve C# .NET kodunu ARM assembly diline dönüştürmek için tam Ahead of Time (AOT) derlemesi kullanır. Bu süreç, Objective-C Runtime ile birlikte UNIX-benzeri bir kernel üzerinde çalışır.
.NET Runtime ve Mono Framework
.NET framework, uygulama geliştirme için assemblies, sınıflar ve namespaces içerir; .NET Runtime ise kod yürütümünü yönetir. Platform bağımsızlığı ve geriye dönük uyumluluk sağlar. Mono Framework, .NET framework’ünün açık kaynaklı bir sürümüdür; 2005’te .NET’i Linux’a taşımak amacıyla başlatılmıştır, şu anda Microsoft tarafından desteklenmekte ve Xamarin tarafından yönetilmektedir.
Xamarin Uygulamalarının Tersine Mühendisliği
Decompilation of Xamarin Assemblies
Decompilation, derlenmiş kodu kaynak koda geri dönüştürür. Windows’ta, Visual Studio’daki Modules penceresi decompilation için modülleri belirleyebilir; bu, üçüncü taraf koda doğrudan erişim ve analiz için kaynak kodu çıkarmaya olanak tanır.
JIT vs AOT Derlemesi
- Android, Just-In-Time (JIT) ve Ahead-Of-Time (AOT) derlemelerini destekler; optimal yürütme hızı için Hybrid AOT modu bulunur. Tam AOT yalnızca Enterprise lisanslarına özeldir.
- iOS, Apple’ın dinamik kod yürütme kısıtlamaları nedeniyle yalnızca AOT derlemesi kullanır.
APK/IPA’den dll Dosyalarını Çıkarma
APK/IPA içindeki assemblies’e erişmek için dosyayı unzip yapın ve assemblies dizinini inceleyin. Android için XamAsmUnZ ve xamarin-decompress gibi araçlar dll dosyalarını açabilir.
python3 xamarin-decompress.py -o /path/to/decompressed/apk
APK’yi decompile ettikten sonra unknown/assemblies/ klasörünü içinde .dll dosyalarıyla görebiliyorsanız, .dlls üzerinde doğrudan dnSpy kullanarak bunları analiz etmek mümkündür. Ancak bazen assemblies.blob ve assemblies.manifest dosyaları unknown/assemblies/ klasörünün içinde yer alır. Araç pyxamstore Xamarin uygulamalarında assemblies.blob dosyasını açabilir ve .NET assemblies’e erişim sağlayarak daha fazla analiz yapılmasına olanak tanır:
pyxamstore unpack -d /path/to/decompressed/apk/assemblies/
# After patching DLLs, rebuild the store
pyxamstore pack
.NET MAUI 9 / .NET for Android assembly mağazaları ELF .so içinde
Yeni Android MAUI 9 build’ları artık assemblies.blob’u doğrudan açığa çıkarmıyor. Bunun yerine, her ABI lib/arm64-v8a/libassemblies.arm64-v8a.blob.so gibi bir ELF konteyneri ile dağıtılıyor. Bu, yönetilen assembly mağazasını içeren özelleştirilmiş bir payload bölümü olan geçerli bir shared library’dir.
Hızlı iş akışı:
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
Eğer llvm-readelf bir payload bölümü gösteriyorsa, dump edin ve çıkarılan blob’un XABA (0x41424158) ile başladığını doğrulayın. Bu payload, .NET for Android tarafından belgelenen assembly store’dur, tek bir DLL değildir.
Store yapısı, assembly’leri manuel olarak carve etmeniz gerektiğinde veya bir extractor’ü doğrulamanız gerektiğinde faydalıdır:
- Başlık:
struct.unpack('<5I', ...)ilemagic,version,entry_count,index_entry_count,index_size - Tanımlayıcılar:
entry_countkaydı,struct.unpack('<7I', ...)iledata_offset/data_sizeve opsiyonel debug/config offset’leri - İndeks:
index_sizebyte atla - İsimler:
uint32 length+ UTF-8 byte’ları - Veri: her
data_offset’a git vedata_sizebyte’ı<name>.dllolarak yaz
Bazı çıkarılan girdiler yine de dnSpy/ILSpy/dotPeek ile doğrudan açılamaz çünkü ayrıca XALZ ile sarılmıştır. Bu durumda:
- Her çıkarılan dosyanın ilk 4 byte’ını
XALZiçin kontrol edin - Sıkıştırılmamış boyutu byte
8:12’den little-endianuint32olarak okuyun 12:itibaren olan byte’larılz4.block.decompress(...)ile dekomprese edin
Minimal dekompresyon mantığı:
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)
Eğer store’u manuel olarak parse etmek istemiyorsanız, pymauistore MAUI 9 APK’leri için ELF payload extraction, XABA store parsing ve XALZ decompression işlemlerini otomatikleştirir.
Bazı daha eski Xamarin/MAUI build’leri sıkıştırılmış assembly’leri /assemblies.blob veya /resources/assemblies içinde XALZ formatında tutar. Bunları hızlıca xamarout kütüphanesiyle açabilirsiniz:
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 files kolaylıkla dekompile edilebilir; bu, uygulama kodunun önemli bölümlerini açığa çıkarır ve bu kod genellikle farklı platformlar arasında ortak bir taban paylaşır.
AOT on iOS: managed IL, yerel
*.aotdata.*dosyalarına derlenir. Sadece DLL’i yamalamak mantığı değiştirmez; IL gövdeleri boş yer tutucular olduğu için native stub’lara hook (ör. Frida ile) yapmanız gerekir.
Statik Analiz
Once the .dlls are obtained it’s possible to analyze the .Net code statically using tools such as dnSpy or ILSpy that will allow modifying the code of the app. This can be super useful to tamper the application to bypass protections for example.
Note that after modifying the app you will need to pack it back again and sign it again.
dnSpy is archived; maintained forks like dnSpyEx keep working with .NET 8/MAUI assemblies and preserve debug symbols when re-saving.
Dinamik Analiz
Dinamik analiz, SSL pinning kontrol etmeyi ve Xamarin uygulamalarındaki .NET binary’sinin çalışma zamanında değiştirilmesi için Fridax gibi araçların kullanılmasını içerir. Root tespiti veya SSL pinning’i atlamak için Frida script’leri mevcuttur ve bu, analiz yeteneklerini artırır.
Diğer ilginç Frida script’leri:
Güncellenmiş Frida-xamarin-unpin (Mono >=6), System.Net.Http.HttpClient.SendAsync’e hook atar ve handler’ı izin verici bir handler ile değiştirir; böylece pinning custom handler’larda uygulandığında bile çalışmaya devam eder. Uygulama başladıktan sonra çalıştırın:
frida -U -l dist/xamarin-unpin.js com.target.app --no-pause
Birlikte gelen frida-mono-api ile managed metotları hooklamak için hızlı şablon:
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()); } });
Yeniden İmzalama
Aracı Uber APK Signer aynı anahtarla birden fazla APK’yı imzalamayı basitleştirir ve yapılan değişikliklerden sonra uygulamayı yeniden imzalamak için kullanılabilir.
References
- 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’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


