主引导记录工作原理(源码分析很COOL)  

njhhack 2001-12-06 06:01:13
有好多朋友在主引导分区损坏后束手无策,本人在此剖析一下,希望对各位初学电脑的兄弟有所帮助,现在好书越来越少了,资料也太少,看来以后要多写些文字
=====================================================



;rem 下面是DOS汇编部分,不要乱动哦
;@ECHO OFF
;GOTO END_BATCH
;下面是一些编译设置,因为要编成COM文件,所以是TINY模式
.MODEL tiny
.CODE
STARTUPCODE
;BIOS引导系统把我从硬盘的主引导分区中搬到了内存中,我现在的位置是0000:7C00
;我好开心哦:)我终于可以工作了,让我先设置新的堆栈段,数据段,附加段吧!
M_0100:
CLI
XOR AX,AX
;SS:SP=0000:7C00,因为0000:7C00是我的家,所以我的堆栈当然要在我前面啦:)
MOV SS,AX
MOV SP,7C00H
;等一会我们就要搬家了,所以先把般家的位置准备好,DS:SI=0000:7C00,ES=0000
MOV SI,SP
PUSH AX
POP ES
PUSH AX
POP DS
STI
;把新家搬到0000:0600的位置吧,因为0000:7C00这个地方要让给DOS引导程序玩啊:(
;注意:系统引导型病毒也会搬家的哦,不过是搬到9FC0:0这个内存最高端的1K内
;存中的,这样既腾出了空间给DOS,又保护了自已不会发现,当然新家就很安全了哦
CLD
MOV DI,0600H
MOV CX,0100H
REPNZ
MOVSW
;新家搬好了,赶快跳过去吧,是0000:061D这个地方,不要跳错了哦:)
DB 0EAH,1DH,6,0,0 ;JMP 0000:061D
;终于跳到新家了,我们又可以继续我们的工作了,不过我现在的位置是在0000:061D处
M_011D:
;设好分区表的起始位置,我们要一个一个地检查了啊
MOV SI,0600H+PT-M_0100
;我们要读4个分区的信息,所以BL=4,BL是我们的计数器哦,不要数错了,要不打你PP啊:)
MOV BL,04
M_0122:
CMP BYTE PTR [SI],80H
;如果我们读到了活动分区标志80H的话,快去M_0135这个地方继续工作吧
JZ M_0135
;80H是活动分区标志,00是非活动分区标志,其它数值是非法的,如果是其它数值,
;你可能感染病毒了,不会哪么惨吧,不是的话,就是你的硬盘坏了,嘿嘿嘿
CMP BYTE PTR [SI],00
;如果没有活动分区,而且分区是非法的话,哪就去死吧:(
JNZ M_0148
;继续看看下面有没有合法分区,最好有活动分区就谢天谢地喽:(
ADD SI,+10H
DEC BL
;还没看完吧,回去再看看吧,机会总是有的嘛,不要太灰心了哟,上帝保佑:)
JNZ M_0122
;终于死掉了,虽然读到的分区都是合法的,可是很不爽啊,居然没有一个是活动的,可
;能是没吃饭吧,罢工了,呵呵,没法了,去玩ROM BASIC啊,这可是BILL GATES刚出道时
;玩的东东哟,听清楚了吗,是BASIC,编程序的,如果你不会编程序,呵呵,哭吧,哈哈哈
INT 18H
M_0135:
;运气真不错,居然读到活动分区了,先把基本参数保存好,我要请DOS引导程序进来玩了
MOV DX,[SI]
MOV CX,[SI+02]
;先把活动分区的位置存在BP中,我们有用的哦
MOV BP,SI
M_013C:
;每个分区表有10H大,再看看其它分区再说,要是让我瞧见非法分区,呵呵,不让你活
ADD SI,+10H
DEC BL
;如果4个分区信息都读完了,哪我们就不要玩了,把DOS引导程序搬到内存中来,也
;让它来玩玩啊,要不电脑可要罢工的啊,快到M_015D去请DOS出来吧,呵呵
JZ M_015D
CMP BYTE PTR [SI],00
;如果这个分区是合法的,呵呵,检查下一个分区吧,宁可错杀一千,不可放过一个,呵呵
JZ M_013C
M_0148:
;哈哈,终于让我抓着个非法的分区了,先显示个无效分区的字符串信息让你瞧瞧吧,
;然后就宰了你,呵呵,600+8B=68B处是无效分区的字符串位置,没搞错吧
MOV SI,0600H+IPT-M_0100
M_014B:
;开始显示吧,这个子程别人也要用的,不过我先来,所以先用一下哦,别跟我抢,呵呵
;这是一专门用来显示字符串的子程序,不过它可是有来无回哦,找到RET指令了吗,没
;有吧,因为它要是被执行了,你就要被杀头了哟,所以没必要回来了啊,呵呵
LODSB
CMP AL,00
;如果字符串显示结束了,哪你也就死到临头了,想挣扎一下吗,去M_015B看看吧,是不
;是嗅到死亡的气息了哟,呵呵
JZ M_015B
;在当前光标位置以TTY电传方式显示一个字符
PUSH SI
MOV BX,0007
MOV AH,0EH
INT 10H
POP SI
;继续显示下一个字符
JMP M_014B
M_015B:
;在地狱的滋味可真不好受,可是...........
;没人把你拎出来了,因为这是死循环,所以就在这玩吧,不过这儿很安静,我喜欢,呵呵
JMP M_015B
M_015D:
;我的任务终于完成了,下面要让DOS来接班了,先把DOS引导程序从硬盘搬到内存中来吧
;搬到7C00这个地方,不要搬错了啊,我有5次搬家机会,由DI作计数器,数好了,不要有错
MOV DI,0005
M_0160:
MOV BX,7C00H
MOV AX,0201H
PUSH DI
INT 13H
POP DI
;如果搬家成功,就到M_0178处去作一下体检,要是非法入侵者,呵呵,小心狗头!
JNB M_0178
;唉,真不爽,竟然搬不了家,不过没关系,从来一次,我还有4次机会哦:)先把旧家整理好
XOR AX,AX
INT 13H
;又要少一次机会了:(
DEC DI
;机会还有,回去再试一次,呵呵
JNZ M_0160
;哇,居然搬不了家,算了吧,显示一个装载操作系统出错的信息吧,可能硬盘坏了,555555
MOV SI,0600H+ELOS-M_0100
;去M_014B显示字符串吧,不过显示完了也就死了,呵呵
JMP M_014B
M_0178:
;呵呵,虽然还没体检,不过我先把错误提示字符串的位置准备好,省得等一会再忙,这
;年头骗子真多,小心为好:)
MOV SI,0600H+MOS-M_0100
;开始检验了,看看7C00H+VSIG这个位置的两个字节是不是55 AA
MOV DI,7C00H+VSIG-M_0100
CMP WORD PTR [DI],0AA55H
;如果我们读进来的DOS引导记录中没有55 AA这个标志,哪它就要被判死刑了啊,快去
;M_014B这个地方报到吧,这可是鬼门关哟,不过信息也要显示一下哦,哈哈哈
JNZ M_014B
;终于过了体检关,把分区表的位置存到SI中吧,DOS要用他来读取扩展分区的逻辑盘哦
MOV SI,BP
;如果一切正常,就让等在0000:7C00处的DOS引导程序继续玩吧,我可要退休了哟,呵呵
;真不容易,连过两关,不过DOS引导程序中不知道有没有坏蛋呢,不过这不是我管的,呵
;呵,去玩吧,DOS,最好不要死了哦
DB 0EAH,0,7CH,0,0 ;JMP 0000:7C00h
;下面是一些提示信息,大家看看是不是见过啊,见过它们的朋友有没有哭过啊,不喜欢
;就删了它们吧,微软不会来找你麻烦的,呵呵
ORG 18BH
IPT DB 'Invalid partition table',0 ;无效的分区表
ELOS DB 'Error loading operating system',0 ;操作系统装载出错
MOS DB 'Missing operating system',0 ;丢失操作系统
;下面是一个分区表示例,并不是每个硬盘都是这个模样哦,人要有灵活性,不能死板,对
;不对啊:)
ORG 2BEH
PT DB 80H,01,01,0,6,0EH,0FEH,81H,3EH,0,0,0,6,0BEH,0CH,0
DB 30H dup(0)
;这是有效分区的标志,虽然它没什么用,可是没有它你就要死了哟,等着看看你电脑罢
;工吧:)
VSIG DB 55H,0AAH
;唉,终于结束了,启动电脑原来这么简单,哈哈哈...................
END
;=============下面是DOS批处理部分,不要乱动哦===================
;:END_BATCH
;TASM %0.BAT
;TLINK /X /T %0,BOOTC
;DEL %0.OBJ
;ECHO ON
;rem ========谢谢,我是njhhack,记住我的QQ:10772919============

...全文
364 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen630 2001-12-21
  • 打赏
  • 举报
回复
关注
njhhack 2001-12-20
  • 打赏
  • 举报
回复
哈哈哈........
sdice 2001-12-20
  • 打赏
  • 举报
回复
需要ME和XP的MBR~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~
~~~~
~
~
dragon_xhf 2001-12-20
  • 打赏
  • 举报
回复
程序中要定义类和对象,并且要使用类和对象!!! 因为程序的目的就是为

了展现面向对象的特点和优点!!!
假定: 对一家公司的员工进行管理:
包括人员名字,出生日期,加入公司的年份,那个部门(用ring0---ring9表

示10个部门) ,工资标准等(多多不限)
要求有对(假如有员工改名, 可以实现改名, 尽管使用中不常见, 但主要

是为了实现面向对象思想)(更改工资标准)(开除员工和增加员工)(通过

工龄即加入公司的时间来对员工进行排序, 同一年的可随便排)(通过部门

的对员工排序, 个部门的集中在一起显示,譬如ring0的排了下了跟着就是全

是ring1部门的。。。)
请兄弟们快点回帖, 把源代码和程序发给我, 搞定后就给200分!!!
这是我期末考试的题目, 兄弟们要快快快!!
我的email : citmit@163.com
bnj 2001-12-15
  • 打赏
  • 举报
回复
yq
hypmonkey 2001-12-14
  • 打赏
  • 举报
回复
ntfs
Programmersheaven 2001-12-11
  • 打赏
  • 举报
回复
厉害~~~~~~~~~能不能解释一下WIN2000的引导过程呢?
snowingedge 2001-12-10
  • 打赏
  • 举报
回复
to y_and_y(跳舞的青蛙):如果你的可引导分区在1024柱面以后,你该怎么引导呢??
hypmonkey 2001-12-08
  • 打赏
  • 举报
回复
请教,ntfs的引导和fat32的引导有什么区别吗?
njhhack 2001-12-08
  • 打赏
  • 举报
回复
嘿嘿,int13是dos下进行磁盘访问的软中断向量,他入口参数是这样的
mov ah,2 ;ah中存放功能号,2为读,3为写
mov al,1 ;al中存放要读写的扇区个数
mov ch,0 ;ch中存放软盘磁道或硬盘柱面编号的低8位(从0号开始编码)
mov cl,1 ;cl中的低6位存放物理扇区的编号(从1号开始编码)
;cl中的最高2位存放软盘磁道或硬盘柱面编号的最高2位(共10位)
mov dh,0 ;dh中存放磁头的编号(从0号开始编码)
mov dl,80h ;dl中存放驱动器的编号(软盘为0,1,硬盘为80h,81h,...)
mov bx,200h ;es:bx中存放读写缓冲区的地址
int 13h ;调用中断例程
ret
我们来分析一下为什么windows nt4.0只认识2G的硬盘,为什么BIOS只认识8G的硬盘:
一般情况下,柱面,磁头,扇区的分布如下:
柱面 磁头 扇区 扇区大小
1024 64 64 512
最后我们得到1024*64*64*512=2G
所以windows nt4.0只认识2G的盘
用LBA的逻辑硬盘模式可以将磁头修改为256个,这样硬盘最多可以用8G
现在超过8G的大硬盘随处可见,所以后来的windows 98用了32寄存器的扩展硬盘驱动,从而实现
了超过8G硬盘的读写
===================================================================




liting 2001-12-08
  • 打赏
  • 举报
回复
very good!!!
y_and_y 2001-12-08
  • 打赏
  • 举报
回复
to :snowingedge(下雪边界) :int 13 与mbr有什么关系?
类库 2001-12-07
  • 打赏
  • 举报
回复
好人!
CNer 2001-12-07
  • 打赏
  • 举报
回复
呵呵,真好,
njhhack 2001-12-07
  • 打赏
  • 举报
回复
真有意思,呵呵.......
CodeDemon 2001-12-06
  • 打赏
  • 举报
回复
haha
yoboo_yb 2001-12-06
  • 打赏
  • 举报
回复
签到!
njhhack 2001-12-06
  • 打赏
  • 举报
回复
好,我看看,wn9x以后的mbr是什么,呵呵
seeking 2001-12-06
  • 打赏
  • 举报
回复
哗,教幼儿园的来了?:)
snowingedge 2001-12-06
  • 打赏
  • 举报
回复
在win95以后就不使用这种MBR了.这种MBR不支持扩展INT13H,也就是说存在1024柱面的限制

1,650

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧