不运行 APK 也能读懂它:rea Android 静态分析五入口完整指南
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
拿到一个 .apk,想看清里面有哪些类、某个方法长什么样,但不想运行它,也不想装 Android 环境。rea 的 APK 静态分析就是干这个的:把一个 headless(无界面)的 JADX 反编译引擎包成统一的 CLI 与 MCP 工作流,每次操作都带回可引用的证据,而不只是一行反编译文本。
🔧 准备工作:JDK 与引擎 JAR 自备清单
先说底层思路:rea 不自己写反编译器,它包装一个被锁死的上游引擎——jadx-headless-mcp 0.7.1。源码以未修改的子模块留在仓库里,src/android/JadxRelease.ts 里同时钉死了上游提交号和 JAR 字节的 SHA-256。每次分析前,rea 会调用引擎的状态工具核对自报版本,不一致直接报错;另有一个随包分发的元数据桥(单个 Java 文件),用 JDK 的 source-file 模式对着未改动的引擎 JAR 编译运行。
对你来说,要自备的就两样:
- 一个完整的 JDK 17 或更高版本——"完整"指带 jdk.compiler 模块,因为桥要走 source-file 编译,只有 JRE 不行,可用
java --list-modules确认; - 引擎 0.7.1 的 JAR,用绝对路径塞进环境变量
REA_JADX_MCP_JAR。相对路径、不存在的文件都会被拒绝,报错里会明说:rea 不替你下载或安装它。JAVA_HOME是可选的,用来指定某个现成 JDK,同样必须绝对;不设就用 PATH 上的java。
不用装的:Android SDK、模拟器、JADX 本体、设备服务,一概不需要。
平台边界:真实验证过的主路径是 macOS arm64 + OpenJDK 21,Linux 的 POSIX 适配也已支持;Windows 侧要求较新的 x64 包且带捆绑原生控制,旧发布包可能会直接拒绝这台主机。
包与类层面的三个问题
包检查:先摸清 manifest
你想问:这个包叫什么、声明了哪些权限、大概什么规模。
rea inspect-android-package /path/Example.apk拿到的是解码后的 manifest XML、摘要声明、权限列表和类/资源计数。两个坑提前说:摘要字段由上游引擎抽取,拿不准时以保留的 XML 为准;signature_verification恒为not_performed,这步从不验签。
类搜索:子串匹配,全量翻页
rea search-android-classes /path/Example.apk MainActivity
query 大小写敏感;传空字符串就是清点全部类名。工具按每页 4096 个名称翻完所有分页,遇到计数漂移、重复条目、总数与加载时 class_count 对不上,直接报错,而不是悄悄截断。
类清点:不生成源码也能看成员
rea inspect-android-class /path/Example.apk example.MainActivity
它读解析后的元数据而非反编译,返回全部成员的展示类型、字段和内部类名。注意两点:代码生成隐藏的 synthetic 成员可能出现在这里;overload(同名重载)的顺序绑定"这份产物 + 这个引擎",不是跨构建稳定的身份。
方法层面的两个问题
方法检查:重载方法怎么点名
rea inspect-android-method /path/Example.apk example.MainActivity onCreate # 同名 select 有多个重载时,点名: rea inspect-android-method /path/Example.apk example.MainActivity select --overload-index 1同名方法超过一个而你没给下标时,工具会停下来,把所有候选签名列出来让你补--overload-index,不会替你选第一个。原因在引擎侧:smali 回退(反编译失败时引擎输出汇编文本的机制)会把所有同名重载的函数体拼在一起,挑中任何一个都等于把整段拼贴归因到它头上,所以 rea 对重载方法直接拒绝这条回退。没有函数体的 native/abstract 方法返回body_status: "not_available",不猜测是哪个标志导致的。
结果文本会标明 Java 表示还是 smali 表示;撞上 1 MiB 的上游字节预算时,截断会被标成 partial。
引用追踪:谁静态引用了它
rea trace-android-references /path/Example.apk example.MainActivity --method-name onCreate
返回的是节点间的静态入向关系,source_line和dex_offset恒为 null——这是静态推断,不是观测到的运行时调用。目标方法若存在多个重载,该操作会报 unsupported,因为引擎的引用操作没法替你选某一个。
MCP 一侧对应五个工具:inspect_android_package、search_android_classes、inspect_android_class、inspect_android_method、trace_android_references。参数同形:path必填,类和方法操作带class_name、method_name,可选overload_index,例如方法检查就是一条{"name": "inspect_android_method", "arguments": {"path": "...", "class_name": "example.MainActivity", "method_name": "select", "overload_index": 1}}的请求。
怎么读结果、哪里会踩坑
先看证据。每个操作的 Evidence 里留着:原始请求、APK 的 SHA-256、实际使用的引擎 JAR 的 SHA-256,以及每次工具调用的原始响应;source_revision只有当字节与审计过的发布 JAR 匹配时才填充,否则为 null。中途失败也一样,失败前收集到的上游请求与回复都保留在错误的partial_observation里。
再谈投影。APK 归档的证据可以先用清点/提取工具拿到,再用免执行投影组合成应用图:
rea project-android-application-graph '{"inventory_evidence":[<inventory Evidence>]}'
投影报告精确的组件路径与哈希、运行时族提示(按完整 so 名匹配,如 libflutter.so)和基于路径的桥接假设。它不解码 DEX,也不声称观测到运行时调用——路径对不证明任何加载关系。
🔍 会话、额度与真实验证
额度速查表
| 边界 | 数值 |
|---|---|
| 单个操作执行期限(到队首后) | 120 秒 |
| 上游反编译上限 | 90 秒 |
| manifest / 方法文本预算 | 1 MiB,超限标截断 |
| 类名分页 | 每页 4096 个名称 |
| 单条协议帧 | 8 MiB |
| 单操作 stdout+stderr 合计 | 32 MiB,超限按诊断失败,不当完整结果返回 |
会话生命周期一句话说清
rea 只保留一个序列化会话,工作区是私有不可变副本。复用键 = APK 路径与哈希 + JAR 路径与哈希 + 桥哈希 + Java 可执行 + JVM 参数的组合,键变就退役旧会话起新的。空闲 60 秒自动清理;一次性 CLI 命令返回前一定等清理完成。rea 从不写回原始 APK,也从不启动目标代码。想调内存时用REA_JADX_HEAP_MIB和REA_JADX_ACTIVE_PROCESSOR_COUNT(映射为 -Xmx 与 -XX:ActiveProcessorCount,必须是正的 safe integer),rea 会保留JAVA_TOOL_OPTIONS等标准变量而不覆盖。
真实验证两步走
npm run fixtures:android export REA_JADX_MCP_JAR="$PWD/_reference/apk-integration/jadx-headless-mcp-0.7.1-all.jar" export REA_ANDROID_TEST_APK="$PWD/_reference/apk-integration/ApiDemos-debug.apk" npm run verify:android下载脚本校验固定 SHA-256,复用匹配文件、拒绝覆盖不同的已有文件;APK/JAR 落在被忽略的_reference/下,不进包内容。scripts/verify/android/analysis.mjs 先断言两个哈希,再让五个操作逐一跑真实 CLI 与 MCP 请求,与合成协议回归互相独立。不需要 Gradle、模拟器、Android SDK 或 Ghidra。
能力边界速览:这套工具不执行 APK,不处理 split APK/AAB,不验证签名,不分析 native 库,不做运行时捕获,引用结果也不代表真实调用点。它回答"里面有什么、怎么关联、源码长什么样";不回答"跑起来会做什么、签名是否可信"。需要运行时证据时,请配合仓库里的观测类工具另开一条线。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考