首页 > 代码库 > 关于今下午惊魂的电脑崩溃经历

关于今下午惊魂的电脑崩溃经历

  在学校机房看了一个月的kali与win7双系统双引导的装机过程,于是我下午就选择了开工。前期十分顺利也搞了几个分区,啥都搞好了,大约3个小时吧,期间一直在练尤克里里成都演奏。

先上图:

技术分享技术分享

然而还是死在了最后GRUB的引导上。qtmd,我后来选择通过手动引导进入kali吧。然后就完成安装,重启电脑,电脑显示bios设置的是u盘优先,好吧关了重启之后进bios,发现不对,是硬盘优先。那么为啥会出现u盘优先呢?后来又看了看其他的设置,改了改发现并没有什么卵用。于是我就陷入了懵逼阶段,reboot and select proper boot device。找不到硬盘吗???尤克里里我也扔在一边了。发现这次有点玩大了。

  我就想,既然硬盘是没有问题但是却无法进入系统应该是MRB出问题了吧,但是自己也不确定,上网度娘搜了搜,结果也没有啥结果。好吧,没办法,只好试试了,实在不行就重装系统吧,心想可怜我的笔记本好不容易安装上的vs2015又要没了(i3处理器,显卡是a卡,10年的老本了,玩MC都有点卡,更何况装vs了当时花了我5个小时的安装)。既然MRB出问题,或者也应该是分区表的问题吧,为了修复我也是去查了查工作原理(多亏当年学机器人的时候学了点汇编能够看懂)。

汇编代码:

  1 ;rem 下面是DOS汇编部分,不要乱动哦   2 ;@ECHO OFF   3 ;GOTO END_BATCH   4 ;下面是一些编译设置,因为要编成COM文件,所以是TINY模式   5 .MODEL tiny   6 .CODE   7 STARTUPCODE   8 ;BIOS引导系统把我从硬盘的主引导分区中搬到了内存中,我现在的位置是0000:7C00   9 ;我好开心哦:)我终于可以工作了,让我先设置新的堆栈段,数据段,附加段吧!  10 M_0100:  11 CLI  12 XOR AX,AX  13 ;SS:SP=0000:7C00,因为0000:7C00是我的家,所以我的堆栈当然要在我前面啦:)  14 MOV SS,AX  15 MOV SP,7C00H  16 ;等一会我们就要搬家了,所以先把般家的位置准备好,DS:SI=0000:7C00,ES=0000  17 MOV SI,SP  18 PUSH AX  19 POP ES  20 PUSH AX  21 POP DS  22 STI  23 ;把新家搬到0000:0600的位置吧,因为0000:7C00这个地方要让给DOS引导程序玩啊:(  24 ;注意:系统引导型病毒也会搬家的哦,不过是搬到9FC0:0这个内存最高端的1K内  25 ;存中的,这样既腾出了空间给DOS,又保护了自已不会发现,当然新家就很安全了哦  26 CLD  27 MOV DI,0600H  28 MOV CX,0100H  29 REPNZ  30 MOVSW  31 ;新家搬好了,赶快跳过去吧,是0000:061D这个地方,不要跳错了哦:)  32 DB 0EAH,1DH,6,0,0 ;JMP 0000:061D  33 ;终于跳到新家了,我们又可以继续我们的工作了,不过我现在的位置是在0000:061D处  34 M_011D:  35 ;设好分区表的起始位置,我们要一个一个地检查了啊  36 MOV SI,0600H+PT-M_0100  37 ;我们要读4个分区的信息,所以BL=4,BL是我们的计数器哦,不要数错了,要不打你PP啊:)  38 MOV BL,04  39 M_0122:  40 CMP BYTE PTR [SI],80H  41 ;如果我们读到了活动分区标志80H的话,快去M_0135这个地方继续工作吧  42 JZ M_0135  43 ;80H是活动分区标志,00是非活动分区标志,其它数值是非法的,如果是其它数值,  44 ;你可能感染病毒了,不会哪么惨吧,不是的话,就是你的硬盘坏了,嘿嘿嘿  45 CMP BYTE PTR [SI],00  46 ;如果没有活动分区,而且分区是非法的话,哪就去死吧:(  47 JNZ M_0148  48 ;继续看看下面有没有合法分区,最好有活动分区就谢天谢地喽:(  49 ADD SI,+10H  50 DEC BL  51 ;还没看完吧,回去再看看吧,机会总是有的嘛,不要太灰心了哟,上帝保佑:)  52 JNZ M_0122  53 ;终于死掉了,虽然读到的分区都是合法的,可是很不爽啊,居然没有一个是活动的,可  54 ;能是没吃饭吧,罢工了,呵呵,没法了,去玩ROM BASIC啊,这可是BILL GATES刚出道时  55 ;玩的东东哟,听清楚了吗,是BASIC,编程序的,如果你不会编程序,呵呵,哭吧,哈哈哈  56 INT 18H  57 M_0135:  58 ;运气真不错,居然读到活动分区了,先把基本参数保存好,我要请DOS引导程序进来玩了  59 MOV DX,[SI]  60 MOV CX,[SI+02]  61 ;先把活动分区的位置存在BP中,我们有用的哦  62 MOV BP,SI  63 M_013C:  64 ;每个分区表有10H大,再看看其它分区再说,要是让我瞧见非法分区,呵呵,不让你活  65 ADD SI,+10H  66 DEC BL  67 ;如果4个分区信息都读完了,哪我们就不要玩了,把DOS引导程序搬到内存中来,也  68 ;让它来玩玩啊,要不电脑可要罢工的啊,快到M_015D去请DOS出来吧,呵呵  69 JZ M_015D  70 CMP BYTE PTR [SI],00  71 ;如果这个分区是合法的,呵呵,检查下一个分区吧,宁可错杀一千,不可放过一个,呵呵  72 JZ M_013C  73 M_0148:  74 ;哈哈,终于让我抓着个非法的分区了,先显示个无效分区的字符串信息让你瞧瞧吧,  75 ;然后就宰了你,呵呵,600+8B=68B处是无效分区的字符串位置,没搞错吧  76 MOV SI,0600H+IPT-M_0100  77 M_014B:  78 ;开始显示吧,这个子程别人也要用的,不过我先来,所以先用一下哦,别跟我抢,呵呵  79 ;这是一专门用来显示字符串的子程序,不过它可是有来无回哦,找到RET指令了吗,没  80 ;有吧,因为它要是被执行了,你就要被杀头了哟,所以没必要回来了啊,呵呵  81 LODSB  82 CMP AL,00  83 ;如果字符串显示结束了,哪你也就死到临头了,想挣扎一下吗,去M_015B看看吧,是不  84 ;是嗅到死亡的气息了哟,呵呵  85 JZ M_015B  86 ;在当前光标位置以TTY电传方式显示一个字符  87 PUSH SI  88 MOV BX,0007  89 MOV AH,0EH  90 INT 10H  91 POP SI  92 ;继续显示下一个字符  93 JMP M_014B  94 M_015B:  95 ;在地狱的滋味可真不好受,可是...........  96 ;没人把你拎出来了,因为这是死循环,所以就在这玩吧,不过这儿很安静,我喜欢,呵呵  97 JMP M_015B  98 M_015D:  99 ;我的任务终于完成了,下面要让DOS来接班了,先把DOS引导程序从硬盘搬到内存中来吧 100 ;搬到7C00这个地方,不要搬错了啊,我有5次搬家机会,由DI作计数器,数好了,不要有错 101 MOV DI,0005 102 M_0160: 103 MOV BX,7C00H 104 MOV AX,0201H 105 PUSH DI 106 INT 13H 107 POP DI 108 ;如果搬家成功,就到M_0178处去作一下体检,要是非法入侵者,呵呵,小心狗头! 109 JNB M_0178 110 ;唉,真不爽,竟然搬不了家,不过没关系,从来一次,我还有4次机会哦:)先把旧家整理好 111 XOR AX,AX 112 INT 13H 113 ;又要少一次机会了:( 114 DEC DI 115 ;机会还有,回去再试一次,呵呵 116 JNZ M_0160 117 ;哇,居然搬不了家,算了吧,显示一个装载操作系统出错的信息吧,可能硬盘坏了,555555 118 MOV SI,0600H+ELOS-M_0100 119 ;去M_014B显示字符串吧,不过显示完了也就死了,呵呵 120 JMP M_014B 121 M_0178: 122 ;呵呵,虽然还没体检,不过我先把错误提示字符串的位置准备好,省得等一会再忙,这 123 ;年头骗子真多,小心为好:) 124 MOV SI,0600H+MOS-M_0100 125 ;开始检验了,看看7C00H+VSIG这个位置的两个字节是不是55 AA 126 MOV DI,7C00H+VSIG-M_0100 127 CMP WORD PTR [DI],0AA55H 128 ;如果我们读进来的DOS引导记录中没有55 AA这个标志,哪它就要被判死刑了啊,快去 129 ;M_014B这个地方报到吧,这可是鬼门关哟,不过信息也要显示一下哦,哈哈哈 130 JNZ M_014B 131 ;终于过了体检关,把分区表的位置存到SI中吧,DOS要用他来读取扩展分区的逻辑盘哦 132 MOV SI,BP 133 ;如果一切正常,就让等在0000:7C00处的DOS引导程序继续玩吧,我可要退休了哟,呵呵 134 ;真不容易,连过两关,不过DOS引导程序中不知道有没有坏蛋呢,不过这不是我管的,呵 135 ;呵,去玩吧,DOS,最好不要死了哦 136 DB 0EAH,0,7CH,0,0 ;JMP 0000:7C00h 137 ;下面是一些提示信息,大家看看是不是见过啊,见过它们的朋友有没有哭过啊,不喜欢 138 ;就删了它们吧,微软不会来找你麻烦的,呵呵 139 ORG 18BH 140 IPT DB Invalid partition table,0 ;无效的分区表 141 ELOS DB Error loading operating system,0 ;操作系统装载出错 142 MOS DB Missing operating system,0 ;丢失操作系统 143 ;下面是一个分区表示例,并不是每个硬盘都是这个模样哦,人要有灵活性,不能死板,对 144 ;不对啊:) 145 ORG 2BEH 146 PT DB 80H,01,01,0,6,0EH,0FEH,81H,3EH,0,0,0,6,0BEH,0CH,0 147 DB 30H dup(0) 148 ;这是有效分区的标志,虽然它没什么用,可是没有它你就要死了哟,等着看看你电脑罢 149 ;工吧:) 150 VSIG DB 55H,0AAH 151 ;唉,终于结束了,启动电脑原来这么简单,哈哈哈................... 152 END 153 ;=============下面是DOS批处理部分,不要乱动哦=================== 154 ;:END_BATCH 155 ;TASM %0.BAT 156 ;TLINK /X /T %0,BOOTC 157 ;DEL %0.OBJ 158 ;ECHO ON 

关于硬盘有些知识当时在搜索的时候感觉可以选择了解一下:【转】

硬盘是一种采用磁介质的数据存储设备,数据存储在密封于洁净的硬盘驱动器内腔的若干个磁盘片上。这些盘片一般是在以铝为主要成分的片基表面涂上磁性介质所形成,在磁盘片的每一面上,以转动轴为轴心、以一定的磁密度为间隔的若干个同心圆就被划分成磁道(track),每个磁道又被划分为若干个扇区(sector),数据就按扇区存放在硬盘上。在每一面上都相应地有一个读写磁头(head),所以不同磁头的所有相同位置的磁道就构成了所谓的柱面(cylinder)。传统的硬盘读写都是以柱面、磁头、扇区为寻址方式的(CHS寻址)。硬盘在上电后保持高速旋转(5400转/min以上),位于磁头臂上的磁头悬浮在磁盘表面,可以通过步进电机在不同柱面之间移动,对不同的柱面进行读写。所以在上电期间如果硬盘受到剧烈振荡,磁盘表面就容易被划伤,磁头也容易损坏,这都将给盘上存储的数据带来灾难性的后果。 
硬盘的第一个扇区(0道0头1扇区)被保留为主引导扇区。在主引导区内主要有两项内容:主引导记录和硬盘分区表。主引导记录是一段程序代码,其作用主要是对硬盘上安装的操作系统进行引导;硬盘分区表则存储了硬盘的分区信息。计算机启动时将读取该扇区的数据,并对其合法性进行判断(扇区最后两个字节是否为0x55AA或0xAA55 ),如合法则跳转执行该扇区的第一条指令。所以硬盘的主引导区常常成为病毒攻击的对象,从而被篡改甚至被破坏。可引导标志:0x80为可引导分区类型标志;0表示未知;1为FAT12;4为FAT16;5为扩展分区等等。

  硬盘数据结构
  初买来一块硬盘,我们是没有办法使用的,你需要将它分区、格式化,然后再安装上操作系统才可以使用。就拿我们一直沿用到现在的Win9x/Me系列来说,我们一般要将硬盘分成主引导扇区、操作系统引导扇区、FAT、DIR和Data等五部分(其中只有主引导扇区是唯一的,其它的随你的分区数的增加而增加)。
  主引导扇区
  主引导扇区位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)。其中主引导记录的作用就是检查分区表是否正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。至于分区表,很多人都知道,以80H或00H为开始标志,以55AAH为结束标志,共64字节,位于本扇区的最末端。值得一提的是,MBR是由分区程序(例如DOS 的Fdisk.exe)产生的,不同的操作系统可能这个扇区是不尽相同。如果你有这个意向也可以自己去编写一个,只要它能完成前述的任务即可,这也是为什么能实现多系统启动的原因(说句题外话:正因为这个主引导记录容易编写,所以才出现了很多的引导区病毒)。
  操作系统引导扇区
  OBR(OS Boot Record)即操作系统引导扇区,通常位于硬盘的0磁道1柱面1扇区(这是对于DOS来说的,对于那些以多重引导方式启动的系统则位于相应的主分区/扩展分区的第一个扇区),是操作系统可直接访问的第一个扇区,它也包括一个引导程序和一个被称为BPB(BIOS Parameter Block)的本分区参数记录表。其实每个逻辑分区都有一个OBR,其参数视分区的大小、操作系统的类别而有所不同。引导程序的主要任务是判断本分区根目录前两个文件是否为操作系统的引导文件(例如MSDOS或者起源于MSDOS的Win9x/Me的IO.SYS和MSDOS.SYS)。如是,就把第一个文件读入内存,并把控制权交予该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数、分配单元(Allocation Unit,以前也称之为簇)的大小等重要参数。OBR由高级格式化程序产生(例如DOS 的Format.com)。

文件分配表

FAT
  FAT(File Allocation Table)即文件分配表,是DOS/Win9x系统的文件寻址系统,为了数据安全起见,FAT一般做两个,第二FAT为第一FAT的备份, FAT区紧接在OBR之后,其大小由本分区的大小及文件分配单元的大小决定。关于FAT的格式历来有很多选择,Microsoft 的DOS及Windows采用我们所熟悉的FAT12、FAT16和FAT32格式,但除此以外并非没有其它格式的FAT,像Windows NT、OS/2、UNIX/Linux、Novell等都有自己的文件管理方式。
  目录区
  DIR是Directory即根目录区的简写,DIR紧接在第二FAT表之后,只有FAT还不能定位文件在磁盘中的位置,FAT还必须和DIR配合才能准确定位文件的位置。DIR记录着每个文件(目录)的起始单元(这是最重要的)、文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在磁盘的具体位置及大小了。在DIR区之后,才是真正意义上的数据存储区,即DATA区。
  数据区
  DATA虽然占据了硬盘的绝大部分空间,但没有了前面的各部分,它对于我们来说,也只能是一些枯燥的二进制代码,没有任何意义。在这里有一点要说明的是,我们通常所说的格式化程序(指高级格式化,例如DOS下的Format程序),并没有把DATA区的数据清除,只是重写了FAT表而已,至于分区硬盘,也只是修改了MBR和OBR,绝大部分的DATA区的数据并没有被改变,这也是许多硬盘数据能够得以修复的原因。但即便如此,如MBR/OBR/FAT/DIR之一被破坏的话,也足够咱们那些所谓的DIY老鸟们忙乎半天了,需要提醒大家的是,如果你经常整理磁盘,那么你的数据区的数据可能是连续的,这样即使MBR/FAT/DIR全部坏了,我们也可以使用磁盘编辑软件(比如DOS下的DiskEdit),只要找到一个文件的起始保存位置,那么这个文件就有可能被恢复(当然了,这需要一个前提,那就是你没有覆盖这个文件)。
  硬盘分区方式
  我们平时说到的分区概念,不外乎三种:主分区、扩展分区和逻辑分区。
  主分区是一个比较单纯的分区,通常位于硬盘的最前面一块区域中,构成逻辑C磁盘。在主分区中,不允许再建立其它逻辑磁盘。
  扩展分区的概念则比较复杂,也是造成分区和逻辑磁盘混淆的主要原因。由于硬盘仅仅为分区表保留了64个字节的存储空间,而每个分区的参数占据16个字节,故主引导扇区中总计可以存储4个分区的数据。操作系统只允许存储4个分区的数据,如果说逻辑磁盘就是分区,则系统最多只允许4个逻辑磁盘。对于具体的应用,4个逻辑磁盘往往不能满足实际需求。为了建立更多的逻辑磁盘供操作系统使用,系统引入了扩展分区的概念。
  所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。
  需要特别注意的是,由于主分区之后的各个分区是通过一种单向链表的结构来实现链接的,因此,若单向链表发生问题,将导致逻辑磁盘的丢失。
  数据存储原理
  既然要进行数据的恢复,当然数据的存储原理我们不能不提,在这之中,我们还要介绍一下数据的删除和硬盘的格式化相关问题
  文件的读取
  操作系统从目录区中读取文件信息(包括文件名、后缀名、文件大小、修改日期和文件在数据区保存的第一个簇的簇号),我们这里假设第一个簇号是0023。
  操作系统从0023簇读取相应的数据,然后再找到FAT的0023单元,如果内容是文件结束标志(FF),则表示文件结束,否则内容保存数据的下一个簇的簇号,这样重复下去直到遇到文件结束标志。
  文件的写入
  当我们要保存文件时,操作系统首先在DIR区中找到空区写入文件名、大小和创建时间等相应信息,然后在Data区找到闲置空间将文件保存,并将Data区的第一个簇写入DIR区,其余的动作和上边的读取动作差不多。
  文件的删除
  看了前面的文件的读取和写入,你可能没有往下边继续看的信心了,不过放心,Win9x的文件删除工作却是很简单的,简单到只在目录区做了一点小改动――将目录区的文件的第一个字符改成了E5就表示将改文件删除了。
  Fdisk和Format的一点小说明
  和文件的删除类似,利用Fdisk删除再建立分区和利用Format格式化逻辑磁盘(假设你格式化的时候并没有使用/U这个无条件格式化参数)都没有将数据从DATA区直接删除,前者只是改变了分区表,后者只是修改了FAT表,因此被误删除的分区和误格式化的硬盘完全有可能恢复。

虽然但是发现还是在一部分弄不懂,于是我选择了diskgenius,比较老但是特别好用。然后恢复了MRB。(其实一开始我并没有抱有信心的,因为之前我也用过一些,不过并没有卵用。)所以很感谢组织专用U盘,在最后关键时刻发现了好东西。
贴一下组织专用U盘图

技术分享

【总结】这次事故虽然玩的比较大,但是也从中收获了不错的经验和实践。恩就是这样……

关于今下午惊魂的电脑崩溃经历