吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 526|回复: 6
上一主题 下一主题
收起左侧

[Android 原创] AndroidManifest魔改分析向-记一次对魔改样本的分析和经验分享

[复制链接]
跳转到指定楼层
楼主
罗婷 发表于 2026-4-22 02:55 回帖奖励
本帖最后由 罗婷 于 2026-4-22 03:28 编辑

🧬 Android AXML 魔改分析与修复全流程(含 010 模板 & 自动导出)

适用于:逆向 / 安全分析 / APK 修复
工具:010 Editor + 自定义 BT 模板 + 脚本
碎碎念:本来最开始是做游戏安全分析的,苦于不会营销自己,没生意转做桌面应用安全分析,后来还是没生意,又转做了web项目安全分析,结果还是喝西北风,现在转到移动应用安全分析了。因为没有文化背景和学历,年少轻狂选择了肄业,现在养家艰难,希望有个不挑马的伯乐把我给收了吧~


📌 一、问题背景

今天朋友委托对一个apk的AndroidManifest.xml进行修复,这份AndroidManifest.xml 被魔改(obfuscation),导致:

  • 010 Editor 使用AndroidManifest.bt模板进行解析报错:

    模板已通过变量 'scStringOffsets' 的文件结尾
  • apktool / aapt/ jadx/ jeb等工具 无法正常解析
  • 普通 AXML 工具直接崩溃
  • 如图所示

🔍 二、AXML 正常结构

标准 AXML:

[XML Header]
[StringPool]
[ResourceMap]
[Namespace + Tag 流]

💣 三、魔改手法(本案例,因相关规章制度原因此贴不附带样本)

1️⃣ 头部插入假 chunk(核心手法)

00 00 08 00 08 00 00 00

解析为:

type = 0x0000
headerSize = 8
chunkSize = 8

📌 作用:

👉 把 StringPool 偏移从 0x08 推到 0x10


2️⃣ root 内 padding

00 00 00 00

📌 作用:

  • 干扰 chunkSize 校验
  • 让解析器误判结束位置
  • 正常的axml文件设计很紧凑,不会在分块中放置连续4个字节的空白
  • 如图所示

3️⃣ 文件尾垃圾字节

08 00 00 00

📌 作用:

  • 破坏 root chunkSize 与 FileSize 一致性
  • 上一张图的padding字节后就是垃圾字节

⚠️ 四、为什么 BT 模板会崩

原模板:

ResChunkHeader header;
StringChunk stringChunk;

👉 它假设:

StringPool 紧跟在 XML header 后

但实际:

[XML]
[假 chunk ❌]
[StringPool ✔]

❗ 结果

模板在 0x08 解析:

type = 0
chunkSize = 8

继续错位读取:

scStringCount = 0x001c0001 ❌(巨大值)

👉 最终崩溃:

scStringOffsets 越界

🛠 五、手动修复 AXML

✅ 步骤

① 删除假 chunk

偏移:

0x08 ~ 0x0F

删除:

00 00 08 00 08 00 00 00

⚠️ 必须 Delete Bytes(物理删除)


② 修改 root chunkSize

根据是否删除 padding:

情况 chunkSize
保留 padding 88 0C 01 00
删除 padding 84 0C 01 00

③ 删除尾部垃圾

08 00 00 00

✅ 修复后正确结构

03 00 08 00 88 0C 01 00
01 00 1C 00 14 58 00 00

👉 0x08 == 01 00 就说明对齐成功


🧠 六、通用去混淆规则

✔ 保留

0x0001 StringPool
0x0180 ResourceMap
0x0100~0x0104 XML 节点

❌ 丢弃

0x0000 chunk
chunkSize < 8
越界 chunk
尾部垃圾

⚙️ 七、完美 BT 模板设计要点

一个稳定模板必须:

✅ 1. 扫描 StringPool

while (...) {
    if (type == 0x0001) break;
}

✅ 2. 不信 root chunkSize

real_end = min(root.chunkSize, FileSize())

✅ 3. 防御性读取

if (count * 4 > chunkSize) skip;

✅ 4. 支持重同步

if (chunk非法)
    try next offset

🧪 八、自动导出净化版 AXML

✔ 使用 010 Script

脚本功能:

  • 跳过假 chunk
  • 复制合法 chunk
  • 修正 chunkSize
  • 导出 clean AXML

👉 使用方法:

1. 打开原 AXML
2. 运行脚本
3. 输出 clean_AndroidManifest.xml

🧰 九、完整工具链

功能 工具
分析 010 Editor + analysis.bt
解析 hardened / perfect.bt
修复 手动 / script
导出 export_clean_axml.1sc

🧬 十、本案例魔改总结

手法 作用
假 chunk 破坏结构对齐
padding 干扰长度
尾巴垃圾 破坏一致性

👉 本质:

让解析器错位,而不是破坏数据


🚀 十一、进阶建议

如果你做逆向/安全分析,建议:

🔥 做一个 AXML 自动修复工具

支持:

  • 批量 APK
  • 自动检测 fake chunk
  • 自动重建 chunk 流
  • 输出标准 manifest

🧾 十二、可分享的模板和基于Editor Script Language开发的一键修复脚本

👉 原 010 仓库的模板 AndroidManifest.zip (3.71 KB, 下载次数: 6)


👉 针对魔改AXML修改后的模板 AndroidManifest_perfect_fixed_v4.zip (5.39 KB, 下载次数: 10)
👉 一键修复脚本 export_clean_axml.zip (2.07 KB, 下载次数: 0) 版本陈旧,新版本: export_clean_axml_v4.zip (1.38 KB, 下载次数: 11)

ScreenShot_2026-04-22_023338_380.png (53.53 KB, 下载次数: 0)

ScreenShot_2026-04-22_023338_380.png

ScreenShot_2026-04-22_022847_214.png (222.74 KB, 下载次数: 1)

ScreenShot_2026-04-22_022847_214.png

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
buluo533 + 1 + 1 用心讨论,共获提升!
zfpapio + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
 楼主| 罗婷 发表于 2026-4-22 03:10 |楼主
文章编辑次数 10+,文章末尾的图片还是会多加一份,使用论坛教程教的方法会导致文章中的图片无法显示,使用图片链接+md标签的方法会在文章末尾自动又附加一份,燃尽了~
3#
xtmpip 发表于 2026-4-22 08:12
4#
Kls673M 发表于 2026-4-22 10:01
app会对这个文件进行校验吗? 内容格式正确不就行了吗?
5#
lfm2026 发表于 2026-4-22 10:28
感谢分享!
6#
Bigstmart 发表于 2026-4-22 11:06
这就是大佬吗
7#
mxjmxj5 发表于 2026-4-22 12:18
厉害!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-22 13:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表