rea-reverse

用 REA 分析 Android APK:代码、资源、设备拉包与 Flutter

基于 REA 6.7.0发布者 rea-reverse更新于 约 3 分钟读完
本页目录

REA 是第三方开源工具,它把四个 Android 后端放在同一个 CLI 和 MCP Server 后面:JADX 看代码,Apktool 看资源,adb 拉取已安装的包,再加一个内置的 Flutter 构建解析器。每个工具返回的都是绑定 APK SHA-256 的结构化 Evidence,而不是一堆反编译文件。本文是总览,每一块都有单独的详细教程。

下面的命令都在 macOS 上实际跑过:npm 版 REA 6.7.0、Temurin JDK 17.0.18、jadx-headless-mcp 0.7.1、Apktool 2.12.1、adb 37.0.1,外加一个 API 36 模拟器。目标是 Aegis Authenticator v3.4.3(GPL-3.0,SHA-256 fa091c91…b528)和 BSD-3-Clause 协议的 Flutter Gallery 2.9.2 发布版 APK。

需要准备什么

这些后端 REA 都不替你装:

  • REA 6.7.0(见 安装并连接 agent)
  • 代码工具需要完整的 JDK 17+ 和 jadx-headless-mcp 0.7.1 的 -all.jar
  • 资源工具需要 Apktool 2.7.0 或更高版本
  • 设备拉包需要 platform-tools 里的 adb,以及模拟器或你自己的手机

Android 部分在 macOS 和 Linux 上验证过,Windows 建议走 WSL。

代码:JADX

inspect-android-package、search-android-classes、inspect-android-class、inspect-android-method、trace-android-references 分别负责 manifest、类搜索、重载、单个方法反编译和静态调用者。完整配置和 Aegis 实例(3,077 个类,追出六位验证码怎么计算、被谁调用)见 JADX MCP Server 配置教程。

资源:Apktool

export REA_APKTOOL_COMMAND=/absolute/path/apktool   # 可选,不设则用 PATH
rea inspect-apktool-client
rea decode-android-resources /absolute/path/aegis-v3.4.3.apk --locales de --locales pt-BR

REA 用 --no-src 调 Apktool,把 apktool.yml 元数据、解码后的 manifest 和字符串表作为数据返回。最值得注意的一点:选语言前先看返回的 locales 列表。Aegis 的 values-de 里只有 86 条 AndroidX 字符串(“Nach oben”、“Fertig”),应用自己的德语文案在 values-de-rDE,--locale de-DE 返回 472 条。上面那条 --locales 命令返回三张表:默认 615 条、de 86 条、pt-BR 557 条。各参数、.aab 的表现和资源提取见 APK 与 AAB 解包;和 JADX、JEB 的对比见 JADX vs JEB vs Apktool。

设备拉包:ADB

只连接你自己的或获得授权的设备。

rea list-adb-devices
rea resolve-adb-packages emulator-5554 aegis
rea pull-adb-package emulator-5554 com.beemdevelopment.aegis --output-directory /tmp/acq

pull-adb-package 按 pm path 拉取完整的 split 集合,并为每个文件计算摘要。我们在模拟器上拉下来的 base.apk 和 GitHub 下载的 SHA-256 完全一致。--output-directory 里以包名命名的子目录不能事先存在,否则顶层只报一个笼统的 unreadable_output,真正原因在 details.reason 里。inspect-adb-package 返回的 version_code 是十进制字符串("82");通过 adb 安装的应用,installer_package_name 是字符串 "null",不是 JSON 的 null。安装、启动、停止、卸载这类命令不会被隐式执行;uninstall-adb-package 会删掉 user 0 下的应用及其数据,最好只在模拟器上用。logcat、bugreport 和复现崩溃见 adb logcat 与 bugreport 崩溃调试。

Flutter 构建

rea identify-flutter-build /absolute/path/flutter-gallery.apk
rea inspect-dart-aot /absolute/path/flutter-gallery.apk

这两条命令直接解析 libflutter.so 和 libapp.so,不运行任何东西。在 117.8 MB 的 Flutter Gallery APK 上,arm64-v8a、armeabi-v7a 和 x86_64 都返回了快照哈希 65817c30a78bb44c3dc3771876b6010a,用时约一秒。REA 不做哈希到 Dart SDK 版本的映射,需要借助 reFlutter 维护的那类外部数据集。package: URI 列表最多返回 500 条(Flutter Gallery 至少有 756 条)。完整流程(含混淆构建)见 Flutter APK 逆向。

手里只有 .aab 时

JADX 工具会直接拒绝 bundle,提示 “is zip; provide one standalone APK”。decode-android-resources 却不会拒绝:在我们的测试 bundle 上它正常退出,所有元数据字段都是 null,coverage 还是 "complete",所以那里的空结果不能当结论。请用项目发布的 APK,或者在测试设备上正常安装后拉取已安装的 split 集合。