| name | android-reverse |
| description | Android 应用逆向工程工作流技能。用户提到 APK/APKS/AAB/XAPK、DEX、SO/JNI、smali、Frida、IDA/JADX/JEB、脱壳/加固、反编译/重打包、抓包/hook、去广告/VIP、patch/mod、协议或签名还原、设备指纹、反调试/反检测、OLLVM、dex2so/dragoncore/libmetasec,或要求继续既有 Android 逆向任务时必须触发,即使没有点名本技能。覆盖授权 Android 应用的静态分诊、Java/JNI/Native、运行时取证、保护绕过、动态 Dex、Split、Flutter/Hermes/Unity、Native TLS、Storage/IPC、WebView、Smali patch、协议恢复和 Android CTF。不要用于普通 Android 开发、未授权漏洞利用、Android 系统/ROM/TEE 级逆向或 iOS 逆向。 |
Android Reverse Framework
这是面向真实 Android 应用逆向交付的工作流入口,不是要求每次加载全部资料的知识库。
边界
- 只处理用户有权分析的 Android 应用、样本、设备和流量。
- 普通 Android 开发、系统/ROM/TEE 逆向、iOS 逆向和未授权利用不属于本技能。
- 不主动触发真实短信、支付、生产账号流量、数据清除或不可逆安装操作;需要时先说明影响并取得确认。
两种工作模式
快速分诊
范围窄、只需静态回答且不涉及动态取证或修改目标时,直接完成最小反编译、关键词搜索和证据结论。不要为了一个“有没有壳”问题创建完整状态机。
完整任务
出现以下任一情况时创建 task-local:T2-T5 交付、多轮续跑、动态取证、patch/重签、协议迁移、跨 Java/JNI/Native 建链或保护绕过。
node <SKILL_BASE>/tools/task/task-start.mjs <task-id>
启动协议见 docs/reference/reverse-bootstrap.md,契约字段见 references/task-contract-protocol.md。
核心原则
1. Observe before change
先确定目标、运行环境和第一条可证伪假设,再选择工具。工具可用不等于当前路线正确。
2. Artifact before claim
将要支撑根因、patch 或交付的事实,先写入 run/fixtures.json 或对应日志,再更新 route-state。聊天里的推断不能自动升级为证据。
3. Bridge before deep native
涉及 JNI 时,先建立 System.loadLibrary → JNI_OnLoad/RegisterNatives → Java↔Native 映射。没有桥接证据,不把任意 SO 函数语义提升为业务结论。
4. Verify before declare
- T2:脚本独立运行并命中目标数据。
- T3:no-op 重签基线通过,业务 patch 通过安装、冷启动和任务特定回归。
- T4:协议字段、算法和来源可回指。
- T5:独立实现对至少两组不同输入/输出向量通过
task-verify,最终运行时不依赖原 SO/RPC/Frida/ADB。
5. Goal-lock and stop-loss
每个阶段检查当前动作是否推进用户原始 objective。相同工具和策略连续三次失败、连续 tombstone 或没有新增证据时,先 retrospective 再 pivot;不要用细微脚本变体伪装新路线。
完整任务强制执行循环
“执行轮”指一个可证伪假设及其直接的 probe、patch 或 verify,不按聊天轮数或工具调用数量计算。完整任务的每个执行轮都按以下顺序推进:
- 回读
task.json::objective、当前 deliverable、相关 criteria 和 state/route-state.json::execution,确认本轮动作直接缩短交付路径。
- 首次运行动态工具、连接设备或执行安装/重签/目标状态变更前,读取
references/environment-preflight.md,只检查当前路线和用户指定工具需要的能力;有清数据、真实账号流量或不可逆影响时先取得确认。
- 在首次领域操作前读取一个直接匹配的 playbook;后续出现新信号时只补读新命中的协议,不遍历全部资料。
- 写明可证伪假设、预期观察、失败判据和失败后的不同方向,再执行能区分假设的最小动作。
- 动作结束后先把原始证据写入任务目录。每次 probe、patch、verify 和工具预检,无论
success / failed / invalid / inconclusive / blocked,都立即运行 task-record-attempt;聊天或 report.md 不能替代结构化尝试记录。
- 运行
task-advance。状态为 ready-to-continue 时执行 nextExecutableAction,不要停在状态复述。
- 同一工具和策略连续三次失败、动态测试连续失败、tombstone 累积或多轮没有新增验收证据时,读取
references/failure-protocol.md,先写 retrospective,再选择与失败历史实质不同的 pivot。
- 在分诊/环境预检完成、获得改变路线的关键证据或 patch/verify 结果、pivot 前、暂停/上下文交接前更新
report.md;报告是阶段摘要,原始证据仍以 run/ 产物为准。
尝试记录的最小命令形态:
node <SKILL_BASE>/tools/task/task-record-attempt.mjs <task> \
--kind=<probe|patch|verify|tool> --status=<success|failed|blocked|invalid|inconclusive> \
--tool=<tool> --strategy=<strategy> --evidence=<task-local-refs> \
--hypothesis=<falsifiable-hypothesis> --expected=<expected-observation> --actual=<actual-observation>
patch 另外记录 candidate、root-cause evidence 和 rollback;只有候选设计、尚未应用时使用 --proposal。
需要支撑后续推理的首条关键证据出现时读取 references/output-gates.md 的证据落盘规则;准备声明完成时再执行其中的完整完成门禁和 references/completion-gate-checklist.md。
任务契约
Schema v2 使用:
objective:用户原话
deliverables[]:可同时包含 T3、T5 等多个交付单元
completionCriteria[]:结构化 id / label / status / evidenceRefs
currentDeliverableId
protectionTier:分诊前保持 null
disallowedFallbacks、userRejectedApproaches
criteria 状态只使用 pending | met | blocked | rejected;deliverable 使用 in-progress | blocked | acceptance-ready | delivered | rejected。一个交付单元成功不能关闭其他交付单元。
旧任务只读兼容;显式迁移:
node <SKILL_BASE>/tools/task/task-migrate.mjs <task> --to=2 --dry-run
node <SKILL_BASE>/tools/task/task-migrate.mjs <task> --to=2
状态与恢复
state/route-state.json 是机器状态真源:保存 entrypoints、attempts、patch candidates、validation runs、stop-loss 和下一动作。
state/route-plan.md、state/clues.md、state/progress.md 是生成视图,不要手工双写。硬证据内容放在 run/fixtures.json 或日志,route-state 只记录证据如何改变路线。
续跑顺序:
task.json
state/route-state.json
report.md 与 run/fixtures.json
task-sync
task-advance
- 若状态为
ready-to-continue,执行 nextExecutableAction
Android 路由门禁
防护定级
防护等级是 A0-A7,但 topic 命中不能自动推导等级。先记录壳/动态加载/检测/混淆的具体证据,再写 protectionTier。
确认动态 Dex 或壳时,读取 references/unpack-tool-matrix.md,按设备、ABI、ROM、进程存活、检测时序和 Anti-Frida 证据选路。A4 只表示复杂保护,不表示 Frida 必然失败。
OLLVM 与 Frida
出现 FLA/BR/BCF/SUB、dispatcher、JUMPOUT 等可复核信号时,读取 references/signal-gates.md 并先静态还原受影响的目标控制流。
门禁只阻止依赖未还原控制流语义的 Native attach/call/patch;模块枚举、maps、Java hook、装载时机和 RegisterNatives 边界取证不因 A4 或 OLLVM 自动禁止。
首次 Frida 运行前读取 references/hook-snippets.md 的环境探测模板,确认设备、进程、版本和 spawn/attach 时机。
T3 Smali patch
读取 references/smali-patching-playbook.md。首个业务 patch 前完成:
原 APK → no-op 重打包/重签 → apksigner 验证 → 安装 → 冷启动
然后记录:
node <SKILL_BASE>/tools/task/task-baseline.mjs <task> \
--source=<original.apk> --resigned=<noop.apk> --evidence=<refs> \
--signature-verified --installed --launched
签名不同需要卸载时,先说明会清数据并取得明确同意。业务 patch 按最小根因执行,每个候选都记录 hypothesis、evidence、expected observation 和 rollback。
通用回归至少覆盖 cold-start / core-path / signature-integrity,这三项必须实测通过。如果 objective 是“全部去广告”,再覆盖 onboarding、home、query-results、login/SSO、deep navigation、resume;确实不存在的业务面才可标为 not-applicable,并附理由及组件/静态证据。未覆盖路径写成待验收,不能宣称全局完成。
T5 本地迁移
最终产物允许标准库、常见加密/编码/HTTP/数学库,不允许原 SO、RPC、Frida、ADB、Java 子进程、Unidbg/Unicorn/angr/Qiling 作为运行时依赖。
在 run/verification.spec.json 声明 Node/Python 入口和断言,显式执行:
node <SKILL_BASE>/tools/task/task-verify.mjs <task>
验证器使用结构化 argv、shell:false、任务目录约束、产物哈希和输出断言;仅退出码为 0 或 stdout 非空不算验证。
专题路由
完整关键词索引见 references/topic-playbook-index.md。高频路由:
| 信号 | 读取 |
|---|
| JNI/RegisterNatives | references/jni-bridge-playbook.md |
| Native SO | references/native-so-playbook.md |
| 协议/签名/加密 | references/crypto-protocol-playbook.md |
| 动态 Dex/壳 | references/dex-loader-playbook.md + references/unpack-tool-matrix.md |
| 梆梆企业版/libDexHelper | references/dex-loader-playbook.md + references/unpack-tool-matrix.md + references/bangcle-libdexhelper-playbook.md |
| OLLVM/混淆 | references/signal-gates.md + references/deobfuscation-playbook.md |
| 运行期自解密 SO/匿名 RX | references/so-runtime-evidence-playbook.md |
| Frida Java/Native | references/frida-java-playbook.md / references/frida-native-playbook.md |
| Flutter/Hermes/Unity | references/framework-runtime-playbook.md |
| Cronet/BoringSSL/native TLS | references/native-network-playbook.md |
| APKS/AAB/XAPK | references/split-delivery-playbook.md |
| WebView/Hybrid | references/webview-hybrid-playbook.md |
| Storage/IPC | references/storage-ipc-playbook.md |
| Root/Frida/Integrity/Pinning | 对应 anti-* 与 integrity playbook |
专题结论边界
- Split:分包重组前,不因 base.apk 缺逻辑下“目标不存在”结论。
- Framework runtime:识别 Flutter/Hermes/Unity 后再选择资源和 Native 路径。
- Native network:Java TrustManager 未命中不能证明没有 pinning。
- ART:先排查进程、时机和编译状态,再解释 hook miss。
- 保护绕过:只对实际目标涉及的 root/frida/integrity/pinning 子面裁定;未验证的子面写明未测。
回复与完成
第一条完整任务回复只需说明:目标和交付单元、当前阶段、本轮成功证据、下一可执行动作。工具状态只列真实阻塞或用户指定工具。
正常进度回复不受完成门禁阻止。准备使用“已完成/已交付”时读取 references/output-gates.md 和 references/completion-gate-checklist.md。
没有真实用户消息证据时,不得写“用户已确认”。agent 侧完成但仍缺真实短信、登录或设备边界验收时,使用 acceptance-ready。
CLI
node <SKILL_BASE>/tools/task/task-init.mjs <task-id> [--task-input=...]
node <SKILL_BASE>/tools/task/task-sync.mjs <task-id>
node <SKILL_BASE>/tools/task/task-record-attempt.mjs <task-id> ...
node <SKILL_BASE>/tools/task/task-advance.mjs <task-id>
node <SKILL_BASE>/tools/task/task-verify.mjs <task-id>
node <SKILL_BASE>/tools/task/task-close.mjs <task-id>
能力边界与成熟度
synthetic-e2e (8): crypto-protocol, dex-loader, framework-runtime, jni-bridge, protection-bypass, runtime-hooking, split-delivery, static-triage
guided (10): ctf, deobfuscation, device-fingerprint, hook-injection, kernel-assisted-re, so-runtime-evidence, stealth-hook, trace-analysis, unidbg-simulation, vmp-analysis
closed-loop (9): anti-emulator-debug, art-runtime, call-flow, java-api, native-network, native-so, smali-patching, storage-ipc, webview-hybrid
reference-only (0): none published yet
成熟度表示现有模板和 QA 深度,不等于所有真实 App 都已验证。详细口径见 docs/reference/capability-matrix.md。