Skip to content

Latest commit

 

History

History
244 lines (155 loc) · 5.26 KB

File metadata and controls

244 lines (155 loc) · 5.26 KB

Garlic decompiler

License

Telegram

中文 | English

世界最快的 APK (Android)/Java 开源反编译器/ELF全量分析器

用 C 语言实现的 Android/Java 反编译器

从 class/jar/dex/apk 文件生成 Java 源码的工具

定制服务

邮件: neocanable#gmail.com (替换 # 为 @)

微信: neocanable

author

功能

  • 反编译apk文件
  • 反编译dex文件
  • 反编译class文件
  • 反编译jar文件
  • 反编译war文件
  • 分析aarch64的elf
    • control flow
    • IR
    • imports
    • exports
    • strings
    • function call graph

编译

1. 在Linux/macOS上编译

编译环境: cmake版本: >=3.26

没有其它依赖

git clone https://github.com/neocanable/garlic.git
cd garlic
cmake -B build
cmake --build build
./build/garlic
2. 在windows上编译

​ 请查看在windows编译方法

另见 [Windows 使用指南](docs/garlic-on-windows.md) 了解性能优化和已知问题。
3. 使用 Zig 编译 (跨平台)

编译环境: zig >= 0.16.0

直接编译本机平台:

git clone https://github.com/neocanable/garlic.git
cd garlic
zig build --release=fast
./zig-out/bin/garlic

使用 -Dtarget 交叉编译到任意目标平台:

# Linux x86_64 (musl)
zig build --release=fast -Dtarget=x86_64-linux-musl

# Linux x86_64 (glibc)
zig build --release=fast -Dtarget=x86_64-linux-gnu

# Linux aarch64
zig build --release=fast -Dtarget=aarch64-linux-musl

# Linux i686 (32位)
zig build --release=fast -Dtarget=x86-linux-musl

# Windows x86_64
zig build --release=fast -Dtarget=x86_64-windows

# Windows 32位
zig build --release=fast -Dtarget=x86-windows

# macOS x86_64 (Intel)
zig build --release=fast -Dtarget=x86_64-macos

# macOS aarch64 (Apple Silicon)
zig build --release=fast -Dtarget=aarch64-macos

Zig 自带交叉链接器和 libc,无需安装任何交叉编译工具链,开箱即用。产物输出到 zig-out/bin/

4. 使用 Android NDK 交叉编译

编译环境: Android NDK (>= r21, 已在 r28 验证)

​ NDK 的定位方式(按优先级):-DANDROID_NDK=/path/to/ndkANDROID_NDK_HOME / ANDROID_NDK_ROOT 环境变量 → ANDROID_HOME/ANDROID_SDK_ROOT<sdk>/ndk/<version>), macOS / Android Studio 的默认安装路径也会自动探测。

./build.sh android-arm64-v8a

​ 或手动调用 CMake:

cmake -B build/build-android-arm64-v8a \
      -DCMAKE_TOOLCHAIN_FILE=toolchains/toolchain-android-arm64-v8a.cmake \
      -DPLATFORM_NAME=android-arm64-v8a
cmake --build build/build-android-arm64-v8a

​ 产物为 build/garlic-android-arm64-v8a(arm64-v8a,minSdkVersion 23)。

​ 注意:Android 平台暂无预编译的 librosemarylib(ELF 分析库),该平台编译时会 自动跳过 ELF 分析功能(-n),其余反编译功能不受影响。

使用方法

  • 反编译apk

    garlic /path/to/android.apk
    
    garlic /path/to/android.apk -o /path/to/save # -o 选项是源码输出的目录
    
    garlic /path/to/android.apk -t 5             # -t 选项是线程数量, 默认是4
  • 反编译dex

    garlic /path/to/classes.dex
    
    garlic /path/to/classes.dex -o /path/to/save # -o 选项是源码输出的目录
    
    garlic /path/to/classes.dex -t 5             # -t 选项是线程数量, 默认是4
  • 反编译 .class 文件

    反编译 .class 文件默认输出是stdout

    garlic /path/to/jvm.class
  • 反编译 jar 文件

    garlic /path/to/file.jar
    
    garlic /path/to/file.jar -o /path/to/save # -o 选项是源码输出的目录
    
    garlic /path/to/file.jar -t 4             # -t 选项是线程数量, 默认是4

    没有制定输出目录情况下,默认输出目录是jar的同级目录。

  • javap

    像javap,比javap快一些,关闭了LineNumber和StackMapTable属性输出。

    garlic /path/to/jvm.class -p
  • dexdump

    garlic /path/to/dalvik.dex -p 
    
  • 搜索字符串

    garlic ~/demo/demo.apk -f "windowInfo" # search "windowInfo" in demo.apk
    
    garlic ~/demo/demo.jar -f "[W|w]indow" # search regex [W|w]indow in demo.jar
    
    garlic ~/demo/demo.dex -f "info" # search contains string in demo.dex
    

调试

修改 src/jvm.c 中的 main 函数:

int main(int argc, char **argv)
{
    jar_file_analyse(path_of_jar, out_of_jar, 1);
    return 0;
}

如果线程数小于 2,则会禁用多线程。

速度

反编译最新(2025-06-16)的微信,200M+大小, 19万+个类,需要12秒左右,默认4线程

garlic ~/wechat/wechat.apk
[Garlic] APK file analysis
File     : ~/wechat/wechat.apk
Save to  : ~/wechat/wechat_apk
Thread   : 4
Progress : 192538 (192538)
[Done]

decompile tiktok

Garlic + Rosemary 流水线

视频


Licensed under the Apache 2.0 License