从 MAUI Android assembly store 中提取托管(.NET)程序集。
.NET Android 应用将其托管代码打包在一个共享库中,通常是
libassemblies.<abi>.blob.so(较旧版本)或 libassembly-store.so。
mauidll 解析该文件,并将其中包含的每个程序集以标准 .dll 文件的形式
写入磁盘,可直接在 ILSpy 等反编译器中查看。
该工具是一个单一的自包含 Crystal 程序,没有任何外部依赖。它所需的 LZ4 解压器已内联实现,因此除标准库外无需任何其他东西。
crystal build --release mauidll.cr -o mauidll
./mauidll libassembly-store.so extracted-dlls
crystal build 生成的二进制文件是自包含的:它只需要在构建机器上安装
Crystal,而在任何运行它的机器上都不需要。
mauidll 使用 Crystal 语言编译。如果你还没有 Crystal:
最常用的方式是通过 Homebrew:
brew install crystal
Crystal 也以官方通用压缩包(Apple Silicon 和 Intel)的形式提供, 可从下载页面获取。
在 Debian、Ubuntu 及相关发行版上,安装官方软件包仓库,然后安装编译器:
curl -fsSL https://crystal-lang.org/install.sh | sudo bash
sudo apt install crystal
或者,在任何支持 snap 的发行版上:
sudo snap install crystal --classic
在 Arch Linux 上:
sudo pacman -S crystal shards
crystal build --release mauidll.cr -o mauidll
mauidll 使用 Crystal 1.20.x 开发和测试。它仅使用标准库,因此任何
较新的版本都应该可以正常工作。
./mauidll <assembly-store.so> [outdir]
| 参数 | 含义 |
|---|---|
assembly-store.so | store 的路径,例如 libassemblies.arm64-v8a.blob.so |
outdir(可选) | 输出目录,默认为当前目录下的 dlls |
示例:
./mauidll /tmp/app64-v8a/libassembly-store.so /tmp/extracted
输出行会为每个程序集报告一行(name: size -> decompressed size, valid PE),随后是一个摘要,例如:
Extracted 235 entries, valid PE (MZ) after extraction: 235/235
payload 节中,mauidll 通过 ELF 节头定位它(同时支持 32 位和
64 位 ELF)。XABA 头开始:magic、version、entry
count、index entry count 和 index size。XALZ 开头的
blob 是原始 LZ4 块(不是 LZ4 帧格式),前面有一个 12 字节的头,
其中包含未压缩大小;其他任何内容(以 MZ 开头)都按原样存储。MZ PE
签名开头。