ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

apk-reverse的Flutter/Dart AOT分析完整指南:从快照解码到业务逻辑补丁

apk-reverse的Flutter/Dart AOT分析完整指南:从快照解码到业务逻辑补丁 apk-reverse的Flutter/Dart AOT分析完整指南从快照解码到业务逻辑补丁【免费下载链接】apk-reverseSuitable for Android APK reverse engineering analysis项目地址: https://gitcode.com/gh_mirrors/ap/apk-reverse在 apk-reverse面向 Android APK 逆向分析的 Agent Skill 仓库中Flutter 应用是绕不开的高地Java 层只是薄壳真正的业务逻辑被 AOT 编译进了libapp.so的Dart 快照。本文带你走通完整链路——确定 Dart 版本 → 解码快照 → 建立对象池索引 → 提取字符串 → 定位业务逻辑 → 安全打补丁帮你跨过新手最常踩的几个坑。1️⃣ 先确认你的目标真的是 Flutter 吗很多改不动的经历根源是把层搞错了。识别 Flutter 应用只需看 APK 里这几个特征特征含义libflutter.soFlutter 引擎负责 UI 渲染libapp.so⭐ 业务逻辑的 AOT 快照真正的战场assets/flutter_assets/Flutter 资源目录快速判据对 UI 相关的 Java 类打 hook——如果一次都不触发而界面明明正常显示说明 UI 由 Dart 层绘制dex-only 的计划会原地搁浅。详见 framework-runtimes.md 的层陷阱一节。2️⃣ Dart AOT 为什么难读Dart 代码经 AOT 编译后有几个反人性的特点函数名被混淆形如_abc12345且随构建变化product 构建没有调试信息约 97–99% 的实例字段名直接缺失常量、字符串、类型、闭包全部存放在对象池object pool中代码通过x27寄存器池基址以压缩指针访问快照格式与 Dart 版本强绑定——版本不对反编译器可能能跑但输出全错这比直接失败更坑。好在字符串字面量不会被剥离它是你最好的锚点。3️⃣ 第零步钉死 Dart 版本快照格式是版本相关的先选版本再选工具。从libflutter.so注意是引擎不是libapp.so里读版本横幅import re blob open(libflutter.so, rb).read() m re.search(rb(\d\.\d\.\d \(stable\)[^\x00]{0,60}), blob) print(m.group(1).decode() if m else not found)⚠️坑这个横幅可能是一个长得像版本的谎言。实测有真实libflutter.so输出0.0.1加一片空白 build-id没有(stable)标记——此时不要拿0.0.1去构建反编译器改用快照哈希或结构探测确认版本。4️⃣ 选对快照解码前端两条路线后续一切分析都依赖一份带pp0x…偏移的对象池列表pp.txt级别输出这是解码前端产出的仓库脚本无法凭空生成。两条路线路线特点适合场景Route Aaotopsy纯 Go 静态二进制无需 Dart VM/SDK开箱即用支持 x86_64想立刻跑通全流程Route Bblutter内嵌对应版本 Dart VM走 VM 原生反序列化保真度最高输出规范pp.txt需从源码构建约 78 秒需 cmake/ninja/C20追求完整保真实测 aotopsy 在 Dart 3.6.0 的真实libapp.so上一次性解出 30,586 个函数、6,133 个类布局、39,202 条池条目并产出functions.jsonl、call_edges.jsonl和带注解的asm/反汇编树——asm/才是整条链路里信息最丰富的产物一个文件对应一个库 URI内含带池注解的完整指令列表。5️⃣ 对象池两种偏移空间别搞混新手在这里浪费数小时是常态先记牢PP 偏移pp0x…pp.txt和反汇编中池加载指令使用的空间文件偏移字节在libapp.so磁盘上的实际位置。两个空间之间没有固定换算关系实测 4,241 条字符串出现 4,237 个不同差值所以不要试图从文件偏移反推 PP 偏移——这正是必须用解码前端的原因。建立池偏移 → 引用它的指令地址索引只需一条命令dart_pprefs.py 用算术解码而非全量 capstone秒级完成python skills/apk-reverse/scripts/dart_pprefs.py libapp.so pp_refs.json python skills/apk-reverse/scripts/dart_pprefs.py --lookup pp_refs.json 0x1d1a8 0xc9d06️⃣ 字符串提取编码决定成败池内字符串按[tag 字节][payload]打包tag 0x80 | (len1) | two_byte_bit。由此得到最实用的搜索规则ASCII 字面量/api/foo、isVip、URL→ 用UTF-8字节搜索中文/非拉丁字面量→ 是UTF-16LEUTF-8 搜索必然 0 命中——这正是字符串被剥离了误判的来源armv732 位快照格式完全不同字符串以 4 字节对齐的独立记录内联存放[header u32][length u32le][UTF-8 payload]紧凑链式表不存在。dart_pool_strings.py在 armv7 上报告kept: 0是格式不匹配不是表为空——对同一应用的 arm64 快照它能保留 4,980 条链式条目。python skills/apk-reverse/scripts/dart_pool_strings.py libapp.so strings.tsv --min 3 原始字节扫描会产生海量假候选一次实测扫出约 88 万条字符串几乎全是错位噪声。脚本强制链式约束——上一条tagpayload必须恰好结束于下一条候选起点——这是过滤垃圾的关键。7️⃣ 识别业务逻辑三种汇编签名带池注解反汇编后多数业务逻辑会归入这三种形态用 dart_disasm.py 做窗口反汇编A — 读 mapmap[key]记住这个四件套ldur [..,#-1]ubfx #0xc,#0x14add x30,x0,...blr其中 key 来自池字符串注解会标出来。B — 写 mapmap[key] value特征是stur写入。⚠️读和写千万别搞混stur是写、blr是读。把写点误当判定逻辑去补丁等于改了一个从不影响 UI 的序列化器。C — 函数入口stp x29, x30, [x15, #-0x10]! 栈溢出检查用于圈定函数边界。8️⃣ 定位工作流从字符串到补丁点锚定最短的特征字符串字段名、接口路径、标签优先于整句——句子常被拼接用dart_pprefs.py --lookup找它的引用指令dart_disasm.py --pp pp.txt --refs pp_refs.json对每个引用点做窗口反汇编分类读/写若写点的值来自池常量它是上报参数站点而非本地决策站点向外走找函数入口再建 B/BL 调用者索引查调用方聚类交叉验证相关字符串在池中相邻 引用点代码相邻 同一块连贯逻辑强烈提示你找对地方了。9️⃣ 安全打补丁改数据源而不是判定优先改数据源定位从 map 读字段 → 类型转换 → 存栈槽这条链把中段替换为池常量加载。一次编辑喂给所有消费方比逐个追判定条件干净得多布尔位最便宜tbnz/tbz改nop或无条件分支或互换add xD, x22, #0x20TRUE与#0x30FALSE翻转构造常量。Dart 的布尔不是 0/1而是x22null 基址旁的小偏移对象改共享字符串前先数引用数多个站点共读同一池条目时改数据不如改代码等长替换才安全补丁前先断言原始字节补后再回读验证。APK 内的libapp.so通常是 deflate 压缩条目不能原地改 zip——改解出的文件再整体替换条目并重打包签名见 repack-and-sign.md永远不要替换 API 路径或 URL实测有案例把广告拉取路径改掉后404 错误体不是合法 JSON启动流程jsonDecode抛FormatException应用永远卡在启动页——广告没了应用也没了多个目标互为子串时先替换最长的welfare_ad是welfare_ad_top的子串先换短的会污染长的应用发行几种 ABI 就补几种只改arm64-v8a留下armeabi-v7a设备完全可能跑你没动的那份。 验证没有 UI 变化 没改成功静态回读补丁字节 结构检查verification.md运行时Dart AOT 层的改动没有任何静态途径可自证——必须在应用自己的 UI 中观察到行为变化。如果该决策同时受服务端强制客户端改对也不等于结果可达见 membership-and-limits.md。 延伸阅读与配套脚本资料用途dart-aot.md本主题完整参考版本钉定、解码前端、寄存器约定x27/x22/x21…、陷阱清单framework-runtimes.md运行时识别与层陷阱EXTENSION-dart-aot-formats.md双 ABI 字符串表格式的实测证据dart_pool_strings.py从快照恢复字符串字面量dart_pprefs.py构建/查询对象池 → 代码位点索引dart_disasm.py带池注解的窗口反汇编 调用者索引一句话总结先钉 Dart 版本再选解码前端分清 PP 偏移与文件偏移按编码双路搜字符串用读/写签名区分判定与上报改数据源、覆盖全 ABI最后在 UI 里亲眼看到变化——Dart AOT 快照就没有那么神秘了。【免费下载链接】apk-reverseSuitable for Android APK reverse engineering analysis项目地址: https://gitcode.com/gh_mirrors/ap/apk-reverse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表