Aplicações Xamarin

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

Xamarin é uma plataforma de código aberto projetada para desenvolvedores construírem apps para iOS, Android e Windows usando os frameworks .NET e C#. Esta plataforma oferece acesso a diversas ferramentas e extensões para criar aplicações modernas de forma eficiente.

Arquitetura do Xamarin

  • Para Android, o Xamarin integra-se com namespaces Android e Java através de bindings do .NET, operando dentro do ambiente de execução Mono juntamente com o Android Runtime (ART). Managed Callable Wrappers (MCW) e Android Callable Wrappers (ACW) facilitam a comunicação entre o Mono e o ART, ambos construídos sobre o kernel Linux.
  • Para iOS, as aplicações executam sob o runtime Mono, utilizando compilação Ahead of Time (AOT) completa para converter código C# .NET em linguagem assembly ARM. Esse processo executa em paralelo com o Objective-C Runtime em um kernel semelhante a UNIX.

.NET Runtime e Mono Framework

O .NET framework inclui assemblies, classes e namespaces para desenvolvimento de aplicações, com o .NET Runtime gerenciando a execução do código. Ele oferece independência de plataforma e compatibilidade retroativa. O Mono Framework é uma versão de código aberto do .NET framework, iniciada em 2005 para estender o .NET ao Linux, agora suportada pela Microsoft e liderada pela Xamarin.

Engenharia Reversa de Aplicações Xamarin

Descompilação de assemblies Xamarin

A descompilação transforma código compilado de volta em código-fonte. No Windows, a janela Modules do Visual Studio pode identificar módulos para descompilação, permitindo acesso direto a código de terceiros e extração do código-fonte para análise.

Compilação JIT vs AOT

  • Android suporta Just-In-Time (JIT) e Ahead-Of-Time (AOT) compilation, com um modo Hybrid AOT para velocidade de execução otimizada. Full AOT é exclusivo de licenças Enterprise.
  • iOS emprega exclusivamente compilação AOT devido às restrições da Apple sobre execução dinâmica de código.

Extraindo arquivos dll de APK/IPA

Para acessar os assemblies em um APK/IPA, descompacte o arquivo e explore o diretório assemblies. Para Android, ferramentas como XamAsmUnZ e xamarin-decompress podem descomprimir arquivos dll.

python3 xamarin-decompress.py -o /path/to/decompressed/apk

Em casos em que, após decompilar o APK, é possível ver a pasta unknown/assemblies/ com os arquivos .dll dentro dela, é possível usar o dnSpy diretamente sobre os .dlls para analisá-los. Porém, às vezes os arquivos assemblies.blob e assemblies.manifest estão dentro da pasta unknown/assemblies/. A ferramenta pyxamstore pode desempacotar o arquivo assemblies.blob em apps Xamarin, permitindo o acesso às assemblies .NET para análise posterior:

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

Builds recentes do Android MAUI 9 não expõem mais assemblies.blob diretamente. Em vez disso, cada ABI inclui um contêiner ELF como lib/arm64-v8a/libassemblies.arm64-v8a.blob.so. Trata-se de uma biblioteca compartilhada válida com uma seção customizada payload que contém o armazenamento de assemblies gerenciados.

Fluxo de trabalho rápido:

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

Se llvm-readelf mostrar uma seção payload, extraia-a e verifique se o blob extraído começa com XABA (0x41424158). Esse payload é o assembly store documentado pelo .NET para Android, não um único DLL.

O layout do store é útil quando você precisa recuperar assemblies manualmente ou validar um extractor:

  • Cabeçalho: struct.unpack('<5I', ...) para magic, version, entry_count, index_entry_count, index_size
  • Descritores: entry_count registros de struct.unpack('<7I', ...) com data_offset / data_size e offsets opcionais de debug/config
  • Index: pule index_size bytes
  • Names: uint32 length + bytes UTF-8
  • Data: posicione-se em cada data_offset e escreva data_size bytes como <name>.dll

Algumas entradas extraídas ainda não serão abertas diretamente no dnSpy/ILSpy/dotPeek porque estão adicionalmente encapsuladas com XALZ. Nesse caso:

  • Verifique os primeiros 4 bytes de cada arquivo extraído para XALZ
  • Leia o tamanho descomprimido a partir dos bytes 8:12 como uint32 little-endian
  • Descomprima os bytes 12: com lz4.block.decompress(...)

Lógica mínima de descompressão:

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)

Se você não quiser analisar a store manualmente, pymauistore automatiza a extração de payloads ELF, o parsing da store XABA e a descompressão XALZ para MAUI 9 APKs.

Algumas builds mais antigas do Xamarin/MAUI armazenam assemblies comprimidos usando o formato XALZ dentro de /assemblies.blob ou /resources/assemblies. Você pode descomprimí-los rapidamente com a biblioteca 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 files are readily accessible for decompilation, revealing significant portions of the application code, which often shares a common base across different platforms.

AOT on iOS: managed IL is compiled into native *.aotdata.* files. Patching the DLL alone will not change logic; you need to hook native stubs (e.g., with Frida) because the IL bodies are empty placeholders.

Análise Estática

Uma vez obtidos os .dlls, é possível analisar estaticamente o código .Net usando ferramentas como dnSpy ou ILSpy que permitem modificar o código do app. Isso pode ser muito útil para manipular a aplicação e, por exemplo, contornar proteções.
Note que após modificar o app você precisará empacotá-lo novamente e assiná-lo novamente.

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

Análise Dinâmica

A análise dinâmica envolve verificar SSL pinning e usar ferramentas como Fridax para modificações em tempo de execução do binário .NET em apps Xamarin. Scripts Frida estão disponíveis para bypass de root detection ou SSL pinning, ampliando as capacidades de análise.

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

Template rápido para hook de métodos gerenciados com o frida-mono-api embutido:

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()); } });

Reassinatura

A ferramenta Uber APK Signer simplifica a assinatura de múltiplos APKs com a mesma chave e pode ser usada para reassinar um app após alterações terem sido realizadas nele.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks