
Extract the managed (.NET) assemblies out of a MAUI Android assembly store.
Extract the managed (.NET) assemblies out of a MAUI Android assembly store.
.NET Android apps ship their managed code inside a shared library, usually
libassemblies.<abi>.blob.so (older versions) or libassembly-store.so.
mauidll parses that file and writes every assembly it contains to disk as a
standard .dll file, ready for inspection in a decompiler such as
ILSpy.
The tool is a single self-contained Crystal program with no external dependencies. The LZ4 decompressor it needs is implemented inline, so nothing beyond the standard library is required.
crystal build --release mauidll.cr -o mauidll
./mauidll libassembly-store.so extracted-dlls
The binary produced by crystal build is self-contained: it only needs Crystal
on the build machine, not on any machine where you run it.
mauidll is compiled with the Crystal language. If you do not have Crystal yet:
The most popular way is Homebrew:
brew install crystal
Crystal is also available as an official universal tarball (Apple Silicon and Intel) from the downloads page.
On Debian, Ubuntu and related distributions, install the official package repository and then the compiler:
curl -fsSL https://crystal-lang.org/install.sh | sudo bash
sudo apt install crystal
Alternatively, on any distribution that supports snaps:
sudo snap install crystal --classic
On Arch Linux:
sudo pacman -S crystal shards
crystal build --release mauidll.cr -o mauidll
mauidll was developed and tested with Crystal 1.20.x. It uses only the standard
library, so any reasonably recent release should work.
./mauidll <assembly-store.so> [outdir]
| Argument | Meaning |
|---|---|
assembly-store.so | Path to the store, e.g. libassemblies.arm64-v8a.blob.so |
outdir (optional) | Output directory, defaults to dlls in the current directory |
Example:
./mauidll /tmp/app64-v8a/libassembly-store.so /tmp/extracted
Output lines report one line per assembly (name: size -> decompressed size, valid PE), followed by a summary such as:
Extracted 235 entries, valid PE (MZ) after extraction: 235/235
payload section, which mauidll locates via the ELF section
headers (32- and 64-bit ELF are both supported).XABA header: magic, version, entry
count, index entry count and index size.XALZ is a raw LZ4 block (not the LZ4 frame format)
preceded by a 12-byte header that includes the uncompressed size; anything
else (starting with MZ) is stored verbatim.MZ PE signature.