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

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', ...) ile magic, version, entry_count, index_entry_count, index_size
  • Tanımlayıcılar: entry_count kaydı, struct.unpack('<7I', ...) ile data_offset / data_size ve opsiyonel debug/config offset’leri
  • İndeks: index_size byte atla
  • İsimler: uint32 length + UTF-8 byte’ları
  • Veri: her data_offset’a git ve data_size byte’ı <name>.dll olarak 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ı XALZ için kontrol edin
  • Sıkıştırılmamış boyutu byte 8:12’den little-endian uint32 olarak 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

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