
Extraia os assemblies gerenciados (.NET) de um assembly store do MAUI Android.
Extrai os assemblies gerenciados (.NET) de um assembly store do MAUI Android.
Os aplicativos .NET Android distribuem seu código gerenciado dentro de uma biblioteca compartilhada, geralmente
libassemblies.<abi>.blob.so (versões mais antigas) ou libassembly-store.so.
O mauidll analisa esse arquivo e grava cada assembly que ele contém no disco como um
arquivo .dll padrão, pronto para inspeção em um decompilador como o
ILSpy.
A ferramenta é um único programa Crystal autocontido, sem dependências externas. O descompressor LZ4 de que ele precisa é implementado inline, então nada além da biblioteca padrão é necessário.
crystal build --release mauidll.cr -o mauidll
./mauidll libassembly-store.so extracted-dlls
O binário produzido por crystal build é autocontido: ele só precisa do Crystal
na máquina de compilação, não em qualquer máquina onde você o execute.
O mauidll é compilado com a linguagem Crystal. Se você ainda não tem o Crystal:
A forma mais popular é o Homebrew:
brew install crystal
O Crystal também está disponível como um tarball universal oficial (Apple Silicon e Intel) na página de downloads.
No Debian, Ubuntu e distribuições relacionadas, instale o repositório de pacotes oficial e depois o compilador:
curl -fsSL https://crystal-lang.org/install.sh | sudo bash
sudo apt install crystal
Alternativamente, em qualquer distribuição que suporte snaps:
sudo snap install crystal --classic
No Arch Linux:
sudo pacman -S crystal shards
crystal build --release mauidll.cr -o mauidll
O mauidll foi desenvolvido e testado com o Crystal 1.20.x. Ele usa apenas a
biblioteca padrão, então qualquer versão razoavelmente recente deve funcionar.
./mauidll <assembly-store.so> [outdir]
| Argumento | Significado |
|---|---|
assembly-store.so | Caminho para o store, por exemplo libassemblies.arm64-v8a.blob.so |
outdir (opcional) | Diretório de saída, o padrão é dlls no diretório atual |
Exemplo:
./mauidll /tmp/app64-v8a/libassembly-store.so /tmp/extracted
As linhas de saída reportam uma linha por assembly (name: size -> decompressed size, valid PE), seguidas por um resumo como:
Extracted 235 entries, valid PE (MZ) after extraction: 235/235
payload não carregável, que o mauidll localiza através dos cabeçalhos
de seção do ELF (ELF de 32 e 64 bits são ambos suportados).XABA de 20 bytes: magic, versão, número de
entradas, número de entradas do índice e tamanho do índice.XALZ é um bloco LZ4 bruto (não o formato de frame LZ4)
precedido por um cabeçalho de 12 bytes que inclui o tamanho descomprimido; qualquer
outra coisa (começando com MZ) é armazenada literalmente.MZ.