标题:[转]主引导记录工作原理
只看楼主
chengstone
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
结帖率:0
已结贴  问题点数:0 回复次数:2 
[转]主引导记录工作原理
导读:
  有好多朋友在主引导分区损坏后束手无策,本人在此剖析一下,希望对各位初学电脑的兄弟有所帮助,现在好书越来越少了,资料也太少,看来以后要多写些文字
  =====================================================
  
  
  
  ;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============
搜索更多相关主题的帖子: 原理 引导 记录 
2010-04-16 20:05
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:20 
资料很好,注释得也很活泼风趣。不过不同的低级格式化软件所形成的硬盘引导分区代码会略有不同,基本原理是差不多的。

活到老,学到老! http://www. E-mail:hu-jj@
2010-04-17 09:38
井绳
Rank: 2
等 级:论坛游民
帖 子:96
专家分:69
注 册:2010-6-29
得分:0 
何不拍个动画片
2010-07-07 14:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-303285-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.211877 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved