分区表与文件结构

任务一 MBS引导扇区

读取命令

在MS-DOS中输入debug进入debug 模式,通过调用INT 13功能来获取MBS信息

1
2
3
4
5
6
7
8
9
-A 100
mov ax,0201
mov bx,0600
mov cx,0001
mov dx,0080
int 13
int 3
-G;通过查看运行的汇编指令来判断是否执行
-D 600 800;通过查看数据的方式来查看刚才保存进入缓冲区的数据

由于MS-DOS屏幕无法滚动因此采用查看两次两张图片拼接的方式来显示数据

KRx7LDndS9Yolkt.png

6MK9QvJOkwcNWf1.png

分析含义

MBR的组成

引导程序机器码 分区表×4 定位符/有效位
446B 64B 2B 0X55AA

前446B的机器码在不同的MBR硬盘上都一样的,在XP的MBP硬盘(现在的硬盘基本都是GPT格式的了)通过WINHEX来导出前446B数据,通过IDA打开就可以得到以下汇编代码

I2ry5oaXMZNqEKn.png

由于安装的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
2
3
4
5
6
7
8
9
10
debug
-a 100
mox ax,0201
mov bx,1000
mov cx,0001
mov dx,0180
int 13
int 3
-g
-d 1000 1200

输出如下

loiNJfOHbsaCUzq.png

ha61IKMkXFwG84W.png

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:扩展引导标签,0x280x29

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
2
3
4
echo "this is a test text" -> this_is_a_long_long_long_long_name.txt
debug
-L 1000 2,1,1
-D 1000 1200

获取到截图如下

pHSFe1yGP2dvYx9.png

z5svreIDopgNS7h.png

V9i2vhupb3IOlkL.png

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表项,截图如下

wJ2tmH7iY9MgRQ1.png

由于是FAT32,因此一个FAT项占用4个字节

FAT的簇号起始于2号,0号的值总是为F8 FF FF 0F,1号的值用于记录系统异常错误,通常1号的值为FF FF FF FFFF 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查看数据

SWXmF6af32DQd4M.png

可以看到我们刚才建立的this_is_a_long_long_long_long_name.txt的文件表示为THIS_I~1TXT

wKioL1LLZaryRrZbAAEU013v_ho125.jpg

tup

wKiom1LLaM7AfCeHAABJ0UIbWsc692.jpg

wKiom1LLaM7AfCeHAABJ0UIbWsc692.jpg

wKioL1LLbN3DTdvXAABXaWgL6jM246.jpg

wKioL1LLbKOxoS_oAABFm_xFUtY021.jpg

根据以上几个图可以分析该文件的信息

由于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

也就是180754

66 4F:创建日期

0100111 1011 00110

也就是2019116

66 4F:最近访问日期,创建好之后就没有访问过,所以是创建日期

00 00:起始簇号的高位

FB 90:文件修改时间,创建好之后就没有修改过,所以是创建日期

66 4F:文件修改日期,创建好之后就没有修改过,所以是创建时间

B2 08:文件起始簇号的低位

19 00 00 00:文件的大小

然后看向上方表示的文件名,就选取其中一个来进行分析

vLQfNbughpUwDdx.png

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

就可以看到文件内容

razu1xOiIjwQXGC.png

任务五 删除文件

在DOS中输入del THIS_I~1.txt 删除文件

MxYmNC4lIaXshV6.png

然后查看FDT

MyPX6fIohxpvjeO.png

可以看到第一个序列号位变成了E5,但是首簇号仍然指向原来的地方

查看FAT

QTIFRxylsKDqwi8.png

可以看到FAT没有变化,进入数据区查看数据

uCe6lt9BgDhwjvI.png

可以发现数据还在原地

任务六 文件恢复

我们在XP下面新建一个文本文件

gOHmC95Lo1EvsYJ.png

通过上面的方法在WINHEX中来定位出文件的数据区位置

Yz3Scr6k5JBdyeC.png

然后将其删除

7YDw1k5PMU2XApe.png

随后进入文件的数据区位置,然后在WINHEX里新建一个文件,讲数据粘贴进去,得到原来的文件

LY5pN38cegzyvma.png