Xamarin Додатки

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

Основна інформація

Xamarin — це відкрита платформа, призначена для розробників для створення додатків для iOS, Android та Windows з використанням .NET та C# фреймворків. Ця платформа надає доступ до численних інструментів і розширень для ефективного створення сучасних додатків.

Архітектура Xamarin

  • Для Android Xamarin інтегрується з просторами імен Android і Java через .NET bindings, працюючи в середовищі виконання Mono поряд з Android Runtime (ART). Managed Callable Wrappers (MCW) та Android Callable Wrappers (ACW) забезпечують взаємодію між Mono і ART, обидва з яких базуються на ядрі Linux.
  • Для iOS додатки виконуються під Mono runtime, використовуючи повну Ahead of Time (AOT) компіляцію для перетворення C# .NET коду в ARM assembly. Цей процес працює поряд з Objective-C Runtime на UNIX-подібному ядрі.

.NET Runtime та Mono Framework

.NET framework включає assemblies, класи та простори імен для розробки додатків, при цьому .NET Runtime керує виконанням коду. Він забезпечує незалежність від платформи та зворотну сумісність. Mono Framework — це відкрита версія .NET framework, започаткована у 2005 році для розширення .NET на Linux, наразі підтримується Microsoft і ведеться під керівництвом Xamarin.

Реверс-інжиніринг Xamarin додатків

Декомпіляція Xamarin assemblies

Декомпіляція перетворює скомпільований код назад у вихідний код. У Windows вікно Modules у Visual Studio може ідентифікувати модулі для декомпіляції, дозволяючи безпосередній доступ до стороннього коду та витягнення вихідного коду для аналізу.

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

У випадках, коли після декомпіляції APK видно папку unknown/assemblies/ з файлами .dll всередині, можна використовувати dnSpy безпосередньо над .dll для їхнього аналізу. Однак іноді у папці unknown/assemblies/ знаходяться файли assemblies.blob та assemblies.manifest. Інструмент pyxamstore може розпакувати файл assemblies.blob у додатках Xamarin, що дозволяє отримати доступ до збірок .NET для подальшого аналізу:

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

.NET MAUI 9 / .NET for Android: сховища збірок всередині ELF .so

Останні збірки Android MAUI 9 більше не надають assemblies.blob безпосередньо. Натомість кожна ABI постачає ELF-контейнер, наприклад lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Це дійсна спільна бібліотека з власною секцією payload, яка містить сховище керованих збірок.

Швидкий робочий процес:

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 корисна, коли потрібно carve assemblies manually або validate an extractor:

  • Заголовок: struct.unpack('<5I', ...) for magic, version, entry_count, index_entry_count, index_size
  • Дескриптори: entry_count записів struct.unpack('<7I', ...) з data_offset / data_size та опційними offset-ами для debug/config
  • Індекс: пропустіть index_size байт
  • Імена: uint32 length + UTF-8 байти
  • Дані: перейдіть до кожного data_offset і запишіть data_size байт як <name>.dll

Деякі витягнуті записи все ще не відкриваються безпосередньо в dnSpy/ILSpy/dotPeek, оскільки вони додатково загорнуті в XALZ. У цьому випадку:

  • Перевірте перші 4 байти кожного витягнутого файлу на наявність XALZ
  • Прочитайте неупакований розмір з байтів 8:12 як little-endian uint32
  • Декомпресуйте байти 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.

Деякі старіші 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)

iOS .dll файли легко доступні для декомпіляції, що відкриває значні частини коду застосунку, які часто мають спільну базу між різними платформами.

AOT on iOS: managed IL is compiled into native *.aotdata.* files. Патчинг лише DLL не змінить логіку; потрібно hook native stubs (наприклад, з Frida), бо тіла IL — порожні заповнювачі.

Static Analysis

Отримавши .dll-файли, можна статично аналізувати .Net код за допомогою інструментів, таких як dnSpy або ILSpy, які дозволяють модифікувати код застосунку. Це може бути дуже корисно для підтасовування застосунку, наприклад, щоб обійти захисти.
Зауважте, що після модифікації застосунок доведеться заново упакувати та підписати.

dnSpy is archived; maintained forks like dnSpyEx keep working with .NET 8/MAUI assemblies and preserve debug symbols when re-saving.

Dynamic Analysis

Динамічний аналіз включає перевірку SSL pinning та використання інструментів, як Fridax, для runtime-модифікацій .NET бінарника в Xamarin-застосунках. Доступні Frida-скрипти для обходу root detection або SSL pinning, що розширює можливості аналізу.

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

Швидкий шаблон для перехоплення (hook) керованих методів за допомогою вбудованого 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 одним ключем і може бути використаний для перепідписування додатка після внесення до нього змін.

Посилання

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