一个软盘映象文件分析示例

首先是 62 个字节的信息内容:

00000000: EB 58 90  ;jmp 58h nop 跳转到 0000005Ah (当前 02h + 58h) 然后一个空指令
00000003: XX XX XX XX XX XX XX XX  ;OEM名称,8 个字符
0000000B: 00 02  ;200h = 512 扇区字节大小
0000000D: 01  ;每簇一个扇区
0000000E: 01 00  ;保留扇区只有零扇区 1 个
00000010: 02  ;默认有 2 个 FAT 表
00000011: E0 00  ;E0h = 224 根目录项目数
00000013: 40 0B  ;B40h = 2880 扇区总数
00000015: F0  ;软盘类型
00000016: 09 00  ;FAT 占用扇区数
00000018: 12 00  ;12h = 18 磁道扇区数
0000001A: 02 00  ;磁头数
0000001C: 00 00 00 00  ;隐藏(坏)扇区数,新磁盘为0
00000020: 00 00 00 00  ;FAT32 使用
00000024: 00  ;MS-DOS 使用
00000025: 00  ;Windows NT 使用
00000026: 29  ;附加 BOOT 标志,29h
00000027: XX XX XX XX  ;卷标序列号,双字
0000002B: XX XX XX XX XX XX XX XX XX XX XX  ;卷标 11 字节,空格补零
00000036: 46 41 54 31 32 20 20 20 ;"FAT12   " 文件系统名称,空格补零
一点点缓冲字节(为与 FAT32 信息兼容而保留,可以不需要)
0000003E: 00 00
00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000050: 00 00 00 00 00 00 00 00 00 00
开头处的 jump 跳到此处开始执行
0000005A: XX XX XX XX XX XX
...
000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00
代码只能到这里,零扇区(512 字节 200h)最后两个字节为 BOOT 标志
000001FE: 55 AA  ;BOOT 标志
下面是第一个 FAT 表
00000200: F0 FF FF FF 0F 00 00 00 00 00 00 00 00 00 00 00
...
000013F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
该 FAT 表大小为 1400h - 0200h = 1200h = 4608
对于 FAT12 每个项目 1.5 字节就是 4608 / 1.5 = 3072 项
需要注意的是 FAT 表第一个字节存放的是媒体信息,即软盘类型
与 0000:0015h 中存放的内容一样(F0h)。
为了保持 FAT12 表的一直性,附加了两个 FFh 字节。
那么,文件数据是用第三个簇 02h 开始。
内容为:FFFh-000h-...-000h
文件数据在第三个簇(02h)为 FFFh 没有后续簇。
从第四个簇开始均为 000h 表示空簇,未使用。
00001400: F0 FF FF FF 0F 00 00 00 00 00 00 00 00 00 00 00
...
000025F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
这是备份 FAT 表,与上一个完全一样。
大小 2600h - 1400h = 1200h = 4608
下面是 ROOT 根目录项目,每个 32 字节
00002600: 54 45 53 54 20 20 20 20 54 58 54  ;"TEST    TXT" 文件名,8.3 格式
0000260B: 00  ;文件属性
0000260C: 10  ;NT 保留 10?
0000260D: 07  ;文件创建毫秒 7 * 5 = 35
0000260E: D4 9E  ;创建时间 9ED4h -> 1001 1110 1101 0100 -> 10011 110110 10100 -> 19:54:40(20*2)
00002610: 51 32  ;创建日期 3251h -> 0011 0010 0101 0001 -> 0011001 0010 10001 -> 2005(25+1980)/2/17
00002612: 00 00  ;最后访问时间
00002614: 00 00  ;第一个簇的高地址
00002616: DC 9E  ;最后修改时间 9EDCh -> 1001 1110 1101 1100 -> 10011 110110 11100 -> 19:54:56
00002618: 51 32  ;最后修改日期 3251h -> 0011 0010 0101 0001 -> 0011001 0010 10001 -> 2005(25+1980)/2/17
0000261A: 02 00  ;第一个簇的低地址,即簇地址为 0000:0002h FAT 表显示无后续簇(FFFh)
0000261C: 0F 00 00 00  ;文件大小 0Fh = 15 字节
一个目录项完毕,下一个目录项 DirName[0] 为 00 表示是空项目
并且在其之前也没有其他的有内容的项目
00002620: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...
000041F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
根目录项目共 4200h - 2600h = 1C00h = 7168 字节 = 224 * 32
下面是文件数据区,与 FAT 表对应,注意这是第三个簇(02h)
00004200: 54 68 69 73 20 69 73 20 61 20 74 65 73 74 2E 00 This is a test.
00004210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...
000043F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第四个簇(03h)开始
00004400: F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6
...
00167FF0: F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6 F6
文件数据区大小为 168000h - 4200h = 163E00h = 1457664 = 2847 * 512
磁盘总计大小为 168000h = 1474560 = 2880 * 512 = 1.44M

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据