📄 cipancaozuoziliao.txt
字号:
7. 文件分配表
文件分配表是 dos 文件组织结构的主要组成部分。我们知道 dos 进行分配的最基本单位是簇。文件分配表是反映硬盘上所 有簇的使用情况,通过查文件分配表可以得知任一簇的使用情况。 dos 在给一个文件分配空间时总先扫描 fat ,找到第一个可 用簇,将该空间分配给文件,并将该簇的簇号填到目录的相应段内。即形成了“簇号链”。 fat 就是记录文件簇号的一张表。 fat 的头两个域为保留域,对 fat12 来说是 3 个字节, fat 来说是 4 个字节。其中头一个字节是用来描述介质的,其余字节为 ffh 。介质格式与 bpb 相同。
第一个字节的 8 位意义:
7 6 5 4 3 2 1 0
└───── - ┘ │ │ │┌ 0 非双面
置 1 │ │ └┤
│ │ └ 1 双面
│ │┌ 0 不是 8 扇区
│ └┤
│ └ 1 是 8 扇区
│┌ 0 不是可换的
└┤
└ 1 是可换的
fat 结构含义
fat12 fat16 意义
000h 0000h 可用
ff0h - ff6h fff0h - fff6h 保留
ff7h fff7h 坏
ff8h - fffh fff8h - ffffh 文件最后一个簇
××× h ×××× h 文件下一个簇
对于 fat16 ,簇号× 2 作偏移地址,从 fat 中取出一字即为 fat 中的域。
逻辑扇区号=数据区起始逻辑扇区号+(簇号- 2 )×每簇扇区数
簇号=(逻辑扇区号-数据区起始逻辑扇区号) div 每簇扇区数+ 2
要点:( 1 ) fat 反映硬盘上所有簇的使用情况,它记录了文件在硬盘中具体位置(簇)。
( 2 )文件第一个簇号(在目录表中)和 fat 的该文件的簇号串起来形成文件的“簇号链”,恢复被破坏的文件就是根 据这条链。
( 3 )由簇号可算逻辑扇区号,反之,由逻辑扇区号也可以算出簇号,公式如上。
( 4 ) fat 位于 dbr 之后,其 dos 扇区号从 1 开始。
8. 文件目录
文件目录是 dos 文件组织结构的又一重要组成部分。文件目录分为两类:根目录,子目录。根目录有一个,子目录可以有 多个。子目录下还可以有子目录,从而形成“树状”的文件目录结构。子目录其实是一种特殊的文件, dos 为目录项分配 32 字 节。目录项分为三类:文件,子目录(其内容是许多目录项),卷标(只能在根目录,只有一个。目录项中有文件(或子目 录,或卷标)的名字,扩展名,属性,生成或最后修改日期,时间,开始簇号,及文件大小。
目录项的格式 字节偏移 意义 占字节数
00h 文件名 8b
08h 扩展名 3b
0bh 文件属性 1b
0ch 保留 10b
16h 时间 2b
18h 日期 2b
1ah 开始簇号 2b
1ch 文件长度 4b
目录项文件名区域中第一个字节还有特殊的意义: 00h 代表未使用 05h 代表实际名为 e5h ebh 代表此文件已被删除
目录项属性区域的这个字节各个位的意义如下: 7 6 5 4 3 2 1 0
未 修 修 子 卷 系 隐 只
用 改 改 目 标 统 藏 读
标 标 录 属 属 属
志 志 性 性 性
注意: windows 的长文件名使用了上表中所说的“保留”这片区域。
要点:( 1 )文件目录是记录所有文件,子目录名,扩展名属性,建立或删除最后修改日期。文件开始簇号及文件长度的一张 登记表 .
( 2 ) dos 中 dir 列出的内容训是根据文件目录表得到的。
( 3 )文件起始簇号填在文件目录中,其余簇都填在 fat 中上一簇的位置上。
9. 物理驱动器与逻辑驱动器
物理驱动器指实际安装的驱动器。 逻辑驱动器是对物理驱动器格式化后产生的 硬盘逻辑锁巧解在谈论具体的解决方法前,先讲述一下被 " 逻辑锁 " 锁住的硬盘为什么不能用普通办法启动的原因:计算机在引导 dos 系统时将会搜索所有逻辑盘的顺序,当 dos 被引导时,首先要去找主引 导扇区的分区表信息,位于硬盘的零头零柱面的第一个扇区的 obeh 地址开始的地方,当 分区信息开始的地方为 80h 时表示是主引导分区,其他的为扩展分区,主引导分区被定义 为逻辑盘 c 盘,然后查找扩展分区的逻辑盘,被定义为 d 盘,以此类推找到 e , f , g..... " 逻辑锁 " 就是在此下手,修改了正常的主引导分区记录将扩展分区的第一个逻辑盘指向 自己, dos 在启动时查找到第一个逻辑盘后,查找下个逻辑盘总是找到是自己,这样一来 就形成了死循环,这就是使用软驱 , 光驱,双硬盘都不能正常启动的原因。实际上这 " 逻辑锁 " 只是利用了 dos 在启动时的一个小小缺陷,便令不少高手都束手无策。知道了 " 逻辑 锁 " 的 " 上锁 " 原理,要解锁也就比较容易了。以前我看到有位朋友采用 " 热拔插 " 硬盘电源的方法来处理:就是在当系统启动时,先不给被锁的硬盘插上电源线,等待启动完成后再给硬盘 " 热插 " 上电源线,这时如果硬盘没有烧坏的话,系统就可以控制硬盘了。当然这是一种非常危险的方法,大家不要轻易尝试,下面介绍两种比较简单和安全的处理方法。
方法一:修改 dos 启动文件 首先准备一张 dos6.22 的系统盘,带上 debug 、 pctools5.0 、 fdisk 等工具。然后在一台正常的机器上,使用你熟悉的二进制编辑工具( debug 、 pctools5.0 ,或者 windows 下的 ultraedit 都行)修改软盘上的 io.sys 文件(修改前记住改该文件的属性为正常),具体是在这个文件里面搜索第一个 "55aa" 字符串,找到以后修改为任何其他数值即可。用这张修改过的系统软盘你就可以顺利地带着被锁的硬盘启动了。不过这时由于该硬盘正常的分区表已经被黑客程序给恶意修改了,你无法用 fdisk 来删除和修改分区,而且仍无法用正常的启动盘启动系统,这时你可以用 debug 来手工恢复。使用 debug 手工修复硬盘步骤如下:
a:\>debug
-a
-xxxx:100 mov ax,0201 读一个扇区的内容
-xxxx:103 mov bx,500 设置一个缓存地址
-xxxx:106 mov cx,0001 设置第一个硬盘的硬盘指针
-xxxx:109 mov dx,0080 读零磁头
-xxxx: 10c int 13 硬盘中断
-xxxx:10e int 20
-xxxx:0110 退出程序返回到指示符
-g 运行
-d500 查看运行后 500 地址的内容
这时候会发现地址 6be 开始的内容是硬盘分区的信息,发现此硬盘的扩展分区指向自己,这就使 dos 或 windows 启动时查找硬盘逻辑盘进去死循环,在 debug 指示符下用 e 命令修改内存数据 具体如下:
e6be
xx.0 xx.0 xx.0...............
.............................
.......................55 aa
55 aa 表示硬盘有效的标记,不要修改, xx0 表示把以前的数据 "xx" 改成 0
再用硬盘中断 13 把修改好的数据写入硬盘就可以了,具体如下:
a:\>debug
a 100 表示修改 100 地址的汇编指令
-xxxx:100 mov ax,0301 写硬盘一个扇区
-xxxx: 这里直接按回车
-g 运行
-q 退出
然后运行 fdisk/mbr (重置硬盘引导扇区的引导程序 ) ,再重新启动电脑就行了。 怎么样?用这种方法处理够简单的吧?而且这种方法还有一个好处就是可以保住盘上的 数据!如果你不需要保数据的话,还有更加简单的处理方法:
方法二:巧设 bios ,用 dm 解锁大家知道 dm 软件是不依赖于主板 bios 的硬盘识别安装软件,(所以在不能识别大硬盘的老主板上也可用 dm 来安装使用大容量硬盘)。就算在 bios 中将硬盘设为 "none" , dm 也可识别并处理硬盘。首先你要找到和硬盘配套的 dm 软件(找 js 要或去网上荡),然后把 dm 拷到一张系统盘上。接上被锁硬盘,开机,按住 del 键,进 cmos 设置,将所有 ide 硬盘设为 none (这是关键所在 ! ),保存设置,重启动,这时系统即可 " 带锁 " 启动。启动后运行 dm ,你会发现 dm 可以绕过 bios ,识别出硬盘,选中该硬盘,分区格式化,就 ok 了。这么简单?不过这种 方法的弱点是硬盘上的数据将全部丢失。
如何开发自己的操作系统的引导程序?
当你打开计算机时发生了什么?
1.电源打开;2.BIOS开始执行;3.引导程序开始执行。
引导程序的规定:你要有一个普通的二进制文件(COM 格式);大小是512个字节;最后两个字节一定是0AA55h;它能被载入到内存地址0x7C00。
工具:
NASM――是一个免费的汇编工具(有DOS/windows/Linux三种版本)
PARTCOPY2.0――DOS下可自由往磁盘拷贝数据的软件
举例:
1.Just hang……
这个简单的引导程序只能挂起:
hang:
jmp hang
times 512-($-$$)-2 db 0
dw 0AA55h
连接这个引导程序:
nasm -f bin -o hang.bin hang.asm
现在你需要一张格式化磁盘,传送hang.bin到磁盘的引导扇区
partcopy hang.bin 0 200 -f0
“0”的意思是指从hang.bin文件的顶端开始传送
“200”的意思是指拷贝200个字节
插入磁盘和重新启动机器,测试这个引导程序。
2.一个实模式下的引导程序
上面的程序非常简单,下面介绍一个稍微复杂一点的程序。
bits 16
org 0x7C00
start:
cli;关中断
mov ax,0x9000;设置堆栈址:0x90000
mov ss,ax
mov sp,0
sti;开中断
l1:push ds
mov dl,0;
重新设置磁盘控制器
mov ax,0
int 13h
pop ds
jc fail
push es
mov ax,0x1000;ES:BX=10000
mov es,ax
mov bx,0
mov ah,2;读磁盘扇区
mov al,5;读入5个扇区
mov cx,2;柱面号=0,扇区号=2
mov dx, 0;磁头号=0,驱动器号=0
int 13h;ES:BX=来自磁盘上的数据
pop es
jc l1
mov ax,0x10000;设置段寄器
mov es,ax
mov ds,ax
push ax
mov ax,0
push ax
retf
fail:
jmp fail
times 512-($-$$)-2 db 0
dw 0AA55h
连接这个引导程序:
nasm -f bin -o boot.bin boot.asm
传送boot.bin到磁盘的引导扇区
partcopy boot.bin 0 200 -f0
为了使程序可以看到,在编译下面程序
mov ax,1000h;修改段寄存器
mov ds,ax
mov es,ax
mov si,msg;打印 "JIPPIKAYE!"
call putstr
hang:;挂起
jmp hang
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
msg db 'JIPPIKAYE!',13,10,0
连接和传送:
nasm -f bin -o boot.bin boot.asm
partcopy boot.bin 0 200 -f0 200
在partcopy中最后一个参数“200”意思是指磁盘的偏移地址插入磁盘和重新启动机器,你会看到“JIPPIKAYE”然后挂起。
Windows 2000的引导过程
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -