安卓文件结构解析

1.apk
安卓安装包
本质是zip,可以解压
image
APK (ZIP)
├─ AndroidManifest.xml ← 包名/组件/权限
├─ classes[2,3...].dex ← Java/Kotlin 字节码
├─ resources.arsc ← 资源索引
├─ res/ ← 二进制资源
├─ assets/ ← 原始文件
├─ lib/abi/*.so ← Native 库
├─ META-INF/ ← 签名 & 证书
└─ kotlin/ ← Kotlin 元数据

常测漏洞
签名校验绕过:apksigner verify --verbose myApp.apk 可发现删除/篡改。
反编译链:apktool d → 得 smali;dex2jar → 得 jar;jadx-gui → 直接可读 Java。
加固识别:看 lib/ 下是否有多余 libjiagu.so、libshell.so;classes.dex 方法数极少即壳。
敏感信息:密钥放 assets/ 裸奔可被 apkanalyzer files cat --file /assets/secret.key myApp.apk 直接 dump。

2.dex
安卓可执行文件,类型exe.

区域 偏移 大小 作用
header 0x00 0x70 魔数、checksum、各表偏移/数量
string_ids 0x70 起 string_ids_size × 4 字符串索引 → 指向 data 区偏移
type_ids 紧接 type_ids_size × 4 描述符索引 Ljava/lang/String;
proto_ids 紧接 proto_ids_size × 12 方法原型(返回类型 + 参数列表)
field_ids 紧接 field_ids_size × 8 字段(所属类 + 类型 + 名称)
method_ids 紧接 method_ids_size × 8 方法(所属类 + 原型 + 名称)
class_defs 紧接 class_defs_size × 32 类定义(访问标志、超类、接口、代码偏移)
call_site_ids 可选 8 × size lambda/invokedynamic 常量池支持
method_handles 可选 8 × size MethodHandle 常量池
data 任意 剩余 字符串内容、CodeItem、调试信息、注解、MapList 等

常见漏洞

漏洞类别 触发位置 利用场景 防御方案
1. 伪加密 / Magic 篡改 header.magic dex\n038\0crk\n038\0 让 jadx 打不开 系统加载前校验 magic;加固壳二次解密
2. 索引越界(OOB) string_ids[i] > fileSize 构造超大偏移 → 系统 mmap 访问非法地址崩溃 Android 7+ 已加 CheckDexFile;使用合法 dx/r8 编译
3. CodeItem 寄存器溢出 registersSize < insSize 导致栈溢出,可写任意地址 ART 校验 registersSize ≥ insSize;老 4.x 需补丁
4. 动态加载恶意 DEX DexClassLoader 下载云端 dex → 反射执行任意代码 加载前 验签(RSA/ECC)+ MD5 白名单
5. 插入 System.loadLibrary 调用 修改 clinit smali 启动即加载恶意 so,提权 开启 应用签名校验 + Google Play App Signing
6. 调试/日志信息泄露 debugInfoOff ≠ 0 发布包仍含行号 → 逆向轻松定位关键逻辑 发布用 minifyEnabled true + debuggable false
7. 签名校验绕过(9695860) META-INF 额外字段 利用 Java/C 对 short 符号解析差异,dex 被替换仍通过校验 升级到 2022-07-05 之后安全补丁;使用 apksigner v2 签名
8. MethodID 数量超限 method_ids_size > 65536 触发安装失败 / 运行时 NoClassDefFoundError 拆多 DEX + android.useAndroidX=true 自动 multidex
image
posted @ 2025-10-03 21:23  powerTopo  阅读(21)  评论(0)    收藏  举报