背景与需求

在Android安全研究中,boot.img是内核、初始文件系统(initramfs)和设备树(Device Tree)的集合体,修改它可以实现内核调试、ROOT权限维持等功能。传统方法需解锁Bootloader并刷入TWRP recovery,但存在两个痛点:

  1. 部分厂商设备解锁会触发熔断机制(Knox/RPMB)
  2. 生产环境测试时root会破坏设备完整性

Android分区结构示意图

技术原理

Android的/dev/block目录存放所有硬件分区映射,关键点在于:

  1. 通过ls -al /dev/block/platform/*/by-name可遍历分区表
  2. boot分区通常映射到mmcblk0pX这样的原始设备节点
  3. 未root时adb shell默认无dd执行权限,但部分厂商系统存在权限配置漏洞

实操步骤

1. 准备工作

确保: - USB调试已开启 - 电脑安装对应机型ADB驱动 - 手机剩余存储空间≥128MB(镜像通常50-80MB)

2. 定位boot分区

adb shell "ls -l /dev/block/platform/*/by-name/boot"
# 输出示例:/dev/block/platform/soc/1d84000.ufshc/by-name/boot -> /dev/block/sde22

3. 提取镜像

使用dd命令直接读取原始数据:

adb shell "dd if=/dev/block/sde22 of=/sdcard/boot.img bs=4096"
# 参数说明:
# if=input_file  of=output_file  bs=block_size

4. 拉取到电脑

adb pull /sdcard/boot.img ./boot_backup_$(date +%Y%m%d).img

ADB操作流程截图

自动化脚本

Python自动化脚本示例:

import subprocess
import datetime

def extract_boot():
    # Step1: 获取boot分区路径
    cmd = 'adb shell "ls -l /dev/block/platform/*/by-name/boot"'
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)

    if 'No such file' in result.stderr:
        print("[!] 未找到boot分区,尝试手动定位")
        return

    boot_path = result.stdout.split('->')[-1].strip()

    # Step2: 提取镜像
    timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
    output = f'/sdcard/boot_{timestamp}.img'

    subprocess.run(f'adb shell "dd if={boot_path} of={output}"', shell=True)

    # Step3: 校验文件
    subprocess.run(f'adb shell "ls -lh {output}"', shell=True)

    # Step4: 拉取到本地
    subprocess.run(f'adb pull {output} .', shell=True)

    print(f"[+] 成功提取到 {output}")

常见问题排查

  1. dd: permission denied
    尝试不同厂商设备,部分OPPO/华为机型需要先执行:

    adb shell "whoami"  # 确认当前用户
    adb shell "ls -l /dev/block"  # 检查权限
  2. 文件大小异常
    正常boot镜像应≥20MB,若只有几KB可能是:

  3. 分区路径错误
  4. 存储空间不足
  5. 文件系统损坏

  6. 镜像验证
    使用file命令检查:

    file boot.img  # 应显示"Android bootimg"

安全注意事项

  1. 多次读取同一分区可能触发厂商熔断机制
  2. 部分三星设备会记录dd操作日志
  3. 建议在测试机操作,避免影响主力机保修

延伸思考

可尝试以下进阶方向: 1. 结合CVE-2021-0924等漏洞提升成功率 2. 开发Magisk模块实现动态拦截 3. 对比不同Android版本的分区表差异

通过这个方法,我在Pixel 3XL(Android 12)和Redmi Note9(Android 11)上均成功提取,整个过程无需解锁Bootloader。虽然存在厂商限制,但为安全研究提供了新思路。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐