分区表与文件结构
任务一 MBS引导扇区
读取命令
在MS-DOS中输入debug
进入debug 模式,通过调用INT 13
功能来获取MBS信息
1 | -A 100 |
由于MS-DOS屏幕无法滚动因此采用查看两次两张图片拼接的方式来显示数据
分析含义
MBR的组成
引导程序机器码 | 分区表×4 | 定位符/有效位 |
---|---|---|
446B | 64B | 2B 0X55AA |
前446B的机器码在不同的MBR硬盘上都一样的,在XP的MBP硬盘(现在的硬盘基本都是GPT格式的了)通过WINHEX来导出前446B数据,通过IDA打开就可以得到以下汇编代码
由于安装的DOS只有一个分区,因此我们就只需要分析一个分区表
80 01 01 00 0B 7F BF 07 3F 00 00 00 C1 FB 3F 00
80
:代表是有引导程序的活动分区
01 01 00
:代表起始位置是01
磁道01
扇区00
柱面
0B
:代表分区类型是FAT32
7F BF 07
:代表结束位置是7F
磁道BF
扇区07
柱面
3F 00 00 00
:代表相对第一个扇区的扇区数,采用小端序就是0x3F
C1 FB 3F 00
:代表磁盘占用总扇区数,采用小端序就是0x3FFBC1
换算成GB就是
$$
0x3FFBC1\times512\div1024\div 1024\div 1024 = 2GB
$$
最后采用55 AA
作为结尾
任务二 DBS和BPB
同样采用INT 13
功能读取C盘第一个扇区的数据
1 | debug |
输出如下
DBR分区的组成为
跳转指令 | 厂商OEM代号 | BPB | 扩展BPB | 引导程序机器码 | 结束标志 |
---|---|---|---|---|---|
3B | 8B | 53B | 26B | 420B | 2B 0X55AA |
E8 58 90
:跳转指令,翻译成汇编就是JMP SHORT 0000005A;NOP
,相对开始的005A就是引导程序的启动地址
4D 53 57 49 4E 34 2E 31
:生产厂商OEM
00 02
:每个扇区512字节
08
:每个簇8个扇区
20 00
:保留00 20
也就是32个扇区
02
:FAT数
00 00
:根目录项数为0
00 00
:小扇区数为0
F8
:介质为硬盘
00 00
:每FAT扇区数位0
00 3F
:每个磁道63个扇区
00 80
:128个磁头
3F 00 00 00
:隐藏扇区63个
C1 FB 3F 00
:一共有4193217个扇区,也就是4193217*512/1024/1024/1024=2GB
F7 0F 00 00
:每个FAT有4087个扇区
00 00
:扩展标志
00 00
:文件系统版本
02 00 00 00
:根目录簇号2
01 00
:文件系统信息扇区号01
06 00
:备份引导扇区
00 00 00 00 00 00 00 00 00 00 00 00
:12个保留字节
扩展BPB
80
:物理驱动器号,指硬盘
00
:保留
29
:扩展引导标签,0x28
或0x29
E7 17 31 0B
:分区序列号s
4D 53 44 4F 53 37 31 30 20 20 20
:卷标,11字节,这里是MSDOS710
46 41 54 33 32 20 20 20
:系统ID,这里是FAT32
任务三 读取FAT表
先生成一个文本文件,然后直接在debug中使用L命令来读取DBR数据
1 | echo "this is a test text" -> this_is_a_long_long_long_long_name.txt |
获取到截图如下
52 52 61 41
:扩展引导标签
剩下的没有使用
25 f7 07 00
:剩下522021个扇区未用。
然后我们来计算FAT表的位置,在MBR中我们知道了C盘的扇区号是00 3F
,因此我们输入-L 2,0,1
的含义就是读入00 3f
一个扇区进入缓冲区,在DBR记录中我们看到保留扇区数是00 20
,由于FAT表就是跟在DBR后面的,所以
FAT1起始扇区 = DBR扇区号+保留扇区数 = 3f+20 = 5f
,
在DEBUG中输入-l 1000 2,20,1
就可以打开FAT1表项,截图如下
由于是FAT32,因此一个FAT项占用4个字节
FAT的簇号起始于2号,0号的值总是为F8 FF FF 0F
,1号的值用于记录系统异常错误,通常1号的值为FF FF FF FF
或FF FF FF 0F
从第2项开始看,每一个4字节的项都指向一个文件的下一个簇,末尾就用FF FF FF 0F
来表示结束,有2个小文件。
任务四 查找文件
然后就是FDT位置的计算,由之前DBR的数据可知,这里的每个FAT表项占用扇区数是0x0FF7
,两个FAT表,两个分区表就是
0x20+0xff7*2 = 0x200e
由于之前也有文件,我们加一个扇区
DEBUG中输入-l 1000 2,200f,1
读取数据,然后-d 1000 1100
查看数据
可以看到我们刚才建立的this_is_a_long_long_long_long_name.txt
的文件表示为THIS_I~1TXT
根据以上几个图可以分析该文件的信息
由于FAT32的长文件名是采用的倒叙,所以我们可能还要向前看几个扇区
54 48 49 53 5F 49 7E 31
:短文件名THIS_I~1
54 58 54
:后缀名TXT
20
:属性,bin(0x20)=100000
,即是归档
00
:系统保留
00
:创建时间的10毫秒位
FB 90
:创建时间
10010 000111 11011
也就是18
时07
分54
秒
66 4F
:创建日期
0100111 1011 00110
也就是2019
年11
月6
日
66 4F
:最近访问日期,创建好之后就没有访问过,所以是创建日期
00 00
:起始簇号的高位
FB 90
:文件修改时间,创建好之后就没有修改过,所以是创建日期
66 4F
:文件修改日期,创建好之后就没有修改过,所以是创建时间
B2 08
:文件起始簇号的低位
19 00 00 00
:文件的大小
然后看向上方表示的文件名,就选取其中一个来进行分析
01
:序列号
74 00 68 00 69 00 73 00 5F 00
:this_
0F
:长目录属性标志固定为此值
00
:保留
FB
:短文件名校验和
69 00 73 00 5F 00 61 00 5F 00 6C 00
:is_a_l
00 00
:始终为0
6F 00 6E 00
:on
根据公式S = (C-2)x P + B
得出,我们要找的地方就是在(08B2-2)*8+200e=658e
运行如下-l 1000 2,658e,1
,d 1000 1100
就可以看到文件内容
任务五 删除文件
在DOS中输入del THIS_I~1.txt
删除文件
然后查看FDT
可以看到第一个序列号位变成了E5
,但是首簇号仍然指向原来的地方
查看FAT
可以看到FAT没有变化,进入数据区查看数据
可以发现数据还在原地
任务六 文件恢复
我们在XP下面新建一个文本文件
通过上面的方法在WINHEX中来定位出文件的数据区位置
然后将其删除
随后进入文件的数据区位置,然后在WINHEX里新建一个文件,讲数据粘贴进去,得到原来的文件