reverse-skill 使用教程 · APK 与 .so 逆向
面向 AI 编码客户端的网络安全技能路由包(v1.0.1,MIT 主协议)· 把 APK / 二进制 / JS 加密 / CTF 任务路由到正确方法论与工具链 · 技能按使用频率讲解,.so 反编译单独成模块
1这是什么
把逆向任务路由到正确方法论与工具链的技能包;本页是高频路径速查,不是完整技能百科。
scope.md 的 auth.status=granted,或「明确授权的离线样本」。只对自己的 App / 已授权样本 / 开源项目 / CTF 做逆向。skills/。2安装与初始化
先装才能用
克隆
git clone https://github.com/zhaoxuya520/reverse-skill.git
cd reverse-skill
刷新索引(Linux / macOS)
bash skills/scripts/refresh-tool-index.sh
接入客户端
# 把 skills/ 放进 Cursor / Claude Code / Codex 的 skills 目录即可
前置依赖
| 依赖 | 用途 |
|---|---|
| JDK | jadx / apktool |
| Node 22.12+ | JS 加密链 |
| Python3 | frida |
| 自有 IDA 许可 | 深度反编译(脚本不破解) |
.ps1,Linux/macOS 用 .sh。3推荐黄金路径
分析一个 APK 里的 .so:授权 → 解包 → 侦察 → 反编译 → 动态验证 → 证据沉淀
4必用 · 每次分析
授权 + 解包 + 快速侦察
确认授权范围(合规第一步) 必用
reverse-skill 强制的 scope 门禁:任何目标动作前需生成 scope.md,auth.status=granted + 合法网络/离线样本范围。-Force 不绕过。
skills/scripts/case-init.ps1
# 生成 scope.md;仅「提了目标名字」≠已授权
APK 解包 / 找 .so(jadx + apktool) 必用
用 jadx + apktool 解包 APK,看 AndroidManifest、smali、资源,并定位 lib/**/*.so。核心逻辑在 native 时切到 ida-reverse / radare2。
apktool d app.apk -o apktool_out
jadx -d jadx_out app.apk
grep -r 'System.loadLibrary' apktool_out/smali/
lib/ 下是否有 .so。.so 命令行快速侦察(radare2) 必用
第一轮 triage:看架构、字符串、导入导出,再进函数级反汇编。轻量、零许可、命令行友好。
rabin2 -I libxxx.so
rabin2 -z libxxx.so
rabin2 -i libxxx.so
r2 -A -q -c 'afl;iz;ii' libxxx.so
aaa → afl → s 函数 → pdf。5高频 · .so 深入
深度反编译 + 动态 Hook + 证据链
.so 深度反编译(IDA F5) 高频
打开 so → 反编译 → 类型恢复 → 重命名。长期深入、要伪代码时的首选。需自有 IDA 许可。
scripts/start.ps1 # 后台起 IDA HTTP MCP
scripts/open.ps1 -Path libxxx.so -TimeoutSeconds 120
sub_xxxx,靠 xref 还原。大 so 自动分析像卡死时用 -TimeoutSeconds 轮询;MCP schema 报错用 open.ps1 HTTP 直调。.so 运行时动态 Hook(Frida) 高频
运行时观察/验证 native 函数:打印参数与返回值,必要时改返回值。静态看不出时必用。
frida-ps -U
frida -U -f com.xxx.app -l hook.js
Ghidra 免费反编译 高频
跨平台(含 macOS)免费方案:函数图 + 反编译可用,是 IDA 的平替。
# 打开 Ghidra → Import libxxx.so → Auto Analyze
证据链 Evidence(field-journal) 高频
把每个导入表/字符串/函数的关键发现写入 Evidence(如 E-imports),形成可追溯证据链。这是 reverse-skill 的硬要求。
# 每个导入表 / 字符串 / 函数发现 → 写入 Evidence(E-imports 等)
6中频 · 按需路由
方法论 / Web / 报告 / 移动端
通用逆向方法论 / OLLVM
遇到 OLLVM 控制流扁平化(F5 出来一堆 while+switch)时,参考去扁平化文档,或动态跑通关键分支再反推。
# 参考 skills/reverse-engineering/references/ollvm-deobfuscation.md
前端 / Web 加密参数逆向
anything-analyzer + Reqable MCP + js-reverse:分析 Web/JS 端加密参数、签名逻辑。同样需落在授权范围内。
# anything-analyzer + Reqable MCP + js-reverse/
案例审查与报告交接
产出 timeline + Evidence→Finding→Path + report,把分析结论沉淀成可交接报告。
# skills/case-review/ 产出 timeline + Evidence→Finding→Path + report
移动端逆向(iOS / 反检测)
iOS 的 dylib/Mach-O 等价物、反检测绕过、objection 深入用法。Android 与 iOS 反检测思路互通。
# skills/mobile-reverse/references/ 含反检测绕过、objection 深入
7深度模块 · 反编译整个 .so 库
流程 / 注意事项 / 常见坑
0. 前置:从 APK 取出 .so
apktool d app.apk -o apktool_out # 解包 APK
ls apktool_out/lib/ # arm64-v8a / armeabi-v7a / x86_64
cp apktool_out/lib/arm64-v8a/libxxx.so ./ # 取出目标 so
file libxxx.so # 确认架构与位数
arm64-v8a(aarch64);模拟器可能 x86_64。先 file 确认架构。先在 Java 层 grep -r "System.loadLibrary" apktool_out/smali/ 确认哪个 so 承载核心逻辑。1. 工具决策树
只快速看导出 / 字符串 / 导入
用 radare2:命令行、快、零许可。适合第一轮 triage。
要 F5 伪代码 / 类型恢复
用 IDA Pro(需自有许可):反编译最深、交互最强。
没有 IDA 预算
用 Ghidra:免费、跨平台(含 macOS)、函数图 + 反编译可用,是 IDA 的平替。
2. 静态分析(radare2 快速流)
rabin2 -I libxxx.so # 基本信息:架构/位数/入口/是否 stripped
rabin2 -z libxxx.so # 字符串(搜 "encrypt"/"key"/"secret"/"http")
rabin2 -i libxxx.so # 导入表(MUST 先记录,再进函数级)
rabin2 -E libxxx.so # 导出函数
r2 -A -q -c "afl;iz;ii" libxxx.so # 自动分析 + 列函数/字符串/导入
r2 libxxx.so # 交互:aaa → afl → s 函数 → pdf 反汇编
axt <addr> 找谁引用;afl~JNI 找 JNI 函数;s JNI_OnLoad 看动态注册。未 rabin2 -i 落 Evidence 不得进入函数级深挖。3. 深度反编译(IDA)
scripts/start.ps1 # 后台静默起 IDA HTTP MCP
scripts/open.ps1 -Path libxxx.so -TimeoutSeconds 120 # 带超时轮询打开
IDA GUI:Shift+F12 字符串 → G 跳地址 → X 交叉引用 → F5 反编译 → N 重命名 / Y 改类型。符号被 strip 后靠字符串引用 + xref + 参数类型推断逐步还原,必要时写 IDAPython 批量标注。
4. 动态验证(Frida)
frida-ps -U # 连设备列进程
frida -U -f com.xxx.app -l hook.js # spawn 注入
# hook.js:拦截 JNI 函数,打印参数/返回值
5. 注意事项(技术)
- 先备份原 .so,只读分析优先;patch 前必须
r2 -w且清醒确认(radare2 默认只读)。 - 导入表硬门禁:未
rabin2 -i落 Evidence 不得进函数级深挖。 - IDA 自动分析大 so 可能长时间无输出——用
open.ps1 -TimeoutSeconds轮询,别误判,更别taskkill /T杀(会连 GUI 一起干掉)。 - 架构要匹配:arm64 so 用对应 IDA/radare2;混用反汇编会乱码。
- 所有关键发现写入 Evidence,便于回写报告。
6. 常见坑
| 坑 | 现象 | 解法 |
|---|---|---|
| 加固 / 加壳(360/腾讯/梆梆) | dex 加密、so 段被加密 | 先 dump 脱壳(frida-dexdump / 内存 dump),再分析原始 so |
| OLLVM 控制流扁平化 | F5 出来一堆 while+switch | 去扁平化脚本(参考 ollvm-deobfuscation.md),或动态跑通关键分支 |
| 动态注册 JNI | Java 层搜不到 native 实现 | 去 JNI_OnLoad 里找 RegisterNatives 的真实函数偏移表 |
| 符号剥离 stripped | 全 sub_xxxx | 字符串 + xref + 类型恢复;写 IDAPython 批量标注 |
| IDA 打开卡死 / 超时 | 一直无输出 | open.ps1 -TimeoutSeconds 轮询;别 taskkill /T |
| MCP schema 报错 | idb_open 报 output schema 不符 | 用 scripts/open.ps1 HTTP 直调绕过校验层 |
| 反调试 / 反 Frida | hook 失败、App 闪退 | frida-server 改名换端口 + spawn;先脱壳 |
| 浮点 / NEON 指令 | 伪代码可读性差 | 结合动态跑、查 ARM 手册,或看汇编 |
| 架构不匹配 | 反汇编全乱码 | file 确认架构后用对应工具 |
8深度模块 · IDA / Ghidra / radare2 怎么选
定位对比 / 决策 / 能力矩阵 / macOS 适配
三个工具都能分析 .so,但定位不同:radare2 是命令行侦察刀,IDA 是工业级深度显微镜,Ghidra 是免费平替显微镜。
一句话定位
radare2(r2)
开源免费、纯命令行。快、轻、零许可。强在侦察与脚本化;伪代码弱,需 r2ghidra 插件补。
IDA Pro
商业付费、GUI。反编译(F5)最强、交互最顺。需自有许可,贵。
Ghidra
NSA 开源、免费、跨平台(含 macOS)。自带反编译器 + 函数图。大文件比 IDA 慢,日常够用。
能力对比矩阵
| 能力 | radare2 | IDA Pro | Ghidra |
|---|---|---|---|
| 价格 | 免费 | 商业(贵) | 免费 |
| 界面 | 命令行/脚本 | GUI | GUI |
| 反编译伪代码 | 弱(需 r2ghidra) | 最强 | 强(够用) |
| 反汇编 | 强 | 强 | 强 |
| 函数图/控制流 | 有 | 最强 | 有 |
| 类型恢复 | 手工为主 | 最强 | 强 |
| macOS 原生 | brew | ida64 | 跨平台 |
| 上手成本 | 高(命令多) | 中 | 中 |
决策:标准组合拳
# ① 第一轮:radare2 看全貌(免费、快)
rabin2 -I libxxx.so && rabin2 -z libxxx.so && rabin2 -i libxxx.so
r2 -A -q -c 'afl~JNI;iz' libxxx.so
# ② 要 F5 / 类型恢复:IDA(有许可)或 Ghidra(无预算)
# IDA: scripts/open.ps1 -Path libxxx.so -TimeoutSeconds 120
# Ghidra: Import → Auto Analyze
# ③ 运行时看输入输出:Frida
macOS 适配
- radare2:
brew install radare2,终端直接跑。 - IDA:官方有 macOS 版
ida64。仓库自带scripts/*.ps1偏 Windows,Mac 上需手动起 IDA + HTTP MCP,或直接 GUI 打开。 - Ghidra:Java 写的,macOS 直接
./ghidraRun。 - 三者都能在 Mac 分析 arm64 的 .so(aarch64),架构匹配即可。
选型常见坑
| 坑 | 解法 |
|---|---|
| IDA 许可贵 / 没预算 | 直接上 Ghidra,反编译覆盖 80% 场景;剩下靠 radare2 + 耐心 |
| Ghidra 大 so 卡慢 | 先 radare2 圈定关键函数,再把那几个丢 Ghidra,别全量 Auto Analyze |
| radare2 命令太多记不住 | 记核心 5 条:rabin2 -I/-z/-i、r2 aaa→afl→s→pdf;其余现查 |
| 三者伪代码不一致 | 静态为主、Frida 动态交叉验证;Ghidra 与 IDA 互相印证更稳 |
9常见路由速查
任务类型 → 先走哪条技能
| 你手上是… | 先走 | 再走 |
|---|---|---|
| 一个陌生 APK | 授权门禁 → apktool/jadx 解包 | 有 .so 则 radare2 → IDA/Ghidra → Frida → Evidence |
| 已知 .so 文件 | rabin2 侦察(导入表必落 Evidence) | IDA/Ghidra 深挖 + Frida 验证 |
| Web/JS 加密参数 | 确认授权范围 | js-reverse / anything-analyzer 链 |
| F5 全是 while+switch | ollvm-deobfuscation 参考 | 动态跑通关键分支 |
| 要出报告交接 | Evidence 齐全 | case-review 产出 timeline + report |
| 练手 / 竞赛 | 开源 CTF 样本 | 仓库 CTF-Sandbox-Orchestrator(完整包) |
10完整技能包与省略项
本页优先高频路径;其余见仓库
| 技能(低频 / 特定场景) | 说明 |
|---|---|
| dotnet-reverse | .NET / C#:dnSpy / IL 元数据等价锚点 |
| go-rust-reverse | Go / Rust 符号与 runtime 结构 |
| macos-reverse | Mach-O 段/节/符号/签名 |
| malware-analysis | YARA / 行为分析(仅授权样本) |
| ctf-orchestrator | CTF 42 子技能沙盒 |
| scope-contract | 授权范围模板化(ops/scope-contract) |