zoukankan      html  css  js  c++  java
  • 以芯片直读方式得到的Android全盘镜像解析——DOS分区

      最近得到了一个依旧用芯片直读方式得到的Android全盘镜像,这次是一个红米手机的镜像,和之前的镜像不同,这次的分区类型的DOS分区,这里说明一下,算是对之前那篇记录的补充。

      首先要纠正一下我的一个错误观点:认为DOS分区只和windows OS有关,和linux OS没有关系。正确的认知应该是:DOS分区是不分什么OS的,他和GPT分区相似,都是用来管理操作系统中各个文件系统分区的,而这些文件系统可以是windows的fat系列、NTFS,也可以是linux的extx系列。

      DOS分区和GPT分区类比:       1)GPT分区中的EFI相当于x86的BIOS;

                     2)GPT分区表相当于DOS分区的MBR;

      下面来详细说明一下DOS分区的格式:

      1、MBR

      我拿到的这个镜像,最开始是一个MBR扇区,MBR扇区由三部分组成:1)引导代码

                                       2)分区表信息

                                       3)签名值(55 AA)

      想要解析这个镜像,分区表信息是我们的线索,DOS的分区表每项由16个字节构成,每个MBR的分区表有四项,也就是MBR的分区表占据64字节。MBR分区表每项结构是:

      表里的所有数字都是十六进制的。

    偏移(0x) 字节数 描述
    00 1 可引导标志,80是可引导,00是不可引导
    01-03 3 分区起始CHS地址,这个好像现在没有怎么用到
    04 1 分区类型,05是扩展分区,83是linux分区,82是linux swap,0B、0C是win95 FAT32,86、87是NTFS
    05-07 3 分区结束CHS地址
    08-0B 4 分区起始逻辑扇区号,逻辑的意思是相对于DOS分区的起始扇区号而言,也就是说是一个相对地址,计算的时候要通过加上MBR扇区起始地址装换成绝对地址
    0C-0F 4 分区大小扇区数

      分区表的四项内容中,一般是三个主分区和一个扩展分区,主分区项目记录不一定要在扩展分区这一项的前面,就是说下面的两种顺序都是可以的:

    主分区1   扩展分区
    主分区2   主分区1
    主分区3   主分区2
    扩展分区   主分区3

      当然分区表不一定是四项都有内容,也可以是一个主分区,剩下的都是扩展分区,总体来说是比较灵活的。

      2、EBR

      EBR中的E就是extended  扩展的意思,这个扇区用来管理扩展分区,结构和MBR是类似的,也是用分区表来记录扩展分区中每个主分区的分区类型、逻辑起始扇区号、分区扇区数目。需要注意的一点事是,虽然EBR中的逻辑起始扇区号是相对于这个EBR扇区的地址而言的,但是在每个扩展分区的起始扇区号是相对主扩展分区而言,也就是说在跟进EBR分区表将相对地址转为绝对地址时要小心每个扩展分区地址的计算,其他每个分区的计算都只要考虑分区表的起始地址就可以了。下面这张图截自 马林《数据重现-文件系统原理精解与数据恢复最佳实践》 51页:

      

      展示的是6个文件系统分区的情况,当计算二级系统文件分区1的绝对地址时,用2处地址做基址,二级扩展分区1的绝对地址用1处做基址;二级文件系统分区2的基址是3,二级扩展分区2的基址还是1。

      另外要注意到,6个文件系统分区的组织情况是:三个主分区和三个逻辑分区即二级文件系统分区1,2,3都是逻辑分区,他们的EBR分区表最多包含两项,一个逻辑分区一个扩展分区。

      3、superblock

      我们根据MBR和EBR的指引找到了每个文件系统分区的类型,但我们怎么知道这个文件系统分区的名字是什么呢?(比如我们关注比较多的data分区)在GPT分区中,我们通过GPT分区表就直接得到了每个文件系统分区的分区名和地址,但在DOS分区中,我们需要利用超级块得到Android镜像各分区的名字。超级块的偏移0x78-0x87的16个字节记录了这个分区的分区名,因此,根据MBR和EBR分区表得到的文件系统分区起始地址和对应超级块中的分区名组合,我们就可以定位到目标分区的起始地址。

      后续的解析工作就和解析ext4文件系统过程一样,不再重复。

      参考:

        马林《数据重现-文件系统原理精解与数据恢复最佳实践》  第二章和第五章

  • 相关阅读:
    Docker & ASP.NET Core (3):发布镜像
    Docker & ASP.NET Core (2):定制Docker镜像
    Docker & ASP.NET Core (1):把代码连接到容器
    Redis五大数据类型的常用操作
    centos安装Redis
    SpringBoot进阶教程(五十一)Linux部署Quartz
    mybatis在xml文件中处理转义字符
    org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.lang.Integer
    SpringBoot进阶教程(五十)集成RabbitMQ---MQ实战演练
    浅谈RabbitMQ Management
  • 原文地址:https://www.cnblogs.com/jiangcsu/p/8436030.html
Copyright © 2011-2022 走看看