利用dos/windows9x的隐含扇区保护数据
关键词:主引导记录(mbr),引导记录(dbr),chs寻址,分区表 【程序编程相关:QT使用中的其他3个问题及解决。】摘要:本文介绍如何利用视窗系统(windows)所不能管理的硬盘空间来达到特殊的数据保护要求,与如何编写mbr程序来完成特殊的系统服务 【推荐阅读:Windows下的字幕平滑滚屏】
一谈到数据保护,大家就会想到用加密.磁盘阵列(数据备份系统).硬盘保护卡等方法进行数据保护.不错,这些方法都很好,但对于普通个人用户来说是不实际的.而本文探讨另外一些可行的系统数据保护方法. 【扩展信息:QT使用中的2个问题及解决】一. 引言
什么数据需要保护呢?一些你不想被别人知道的数据,如你的银行密码;一些你不想被别人盗取的数据,如你的论文;一些容易被破坏的数据,如公共机房的电脑中系统文件.二. dos/windows9x不能管理的硬盘空间现今,个人微机机的高速发展使得视窗操作系统无处不在.存储技术的发展也使得硬盘的容量不断增大.但视窗系统不能完全利用所有的硬盘空间,我不是说视窗系统不能支持这些大容量的硬盘,而是视窗系统无法利用这些硬盘空间----这就是所谓的隐含扇区.硬盘上有几块的空间是视窗系统所不能读写的.众所周知,使用硬盘之前一定要分区,硬盘的0磁头0柱面1扇区保存了第一张分区表(主分区表),分区表所在的磁道(0磁头0柱面的第一个磁道63个扇区),与其他逻辑驱动器的分区表(分区链表)所在的磁道.而且一般硬盘用lba模式管理硬盘空间,硬盘最后的两个柱面dos/widows系统也没有使用.例如:2.1g的硬盘使用lba模式有1023柱面.64个磁头/柱面与63个扇区/磁道,共1023柱面x64磁头/柱面x63扇区/磁道x512字节/扇区,若2014mb;而视窗系统的分区程序分出来的最后一个扇区的位置(也就是操作系统所管辖的硬盘空间)是255柱面,253磁头,63扇区(柱面与磁头是通过换算出来的逻辑数据),共(254柱面x255磁头/柱面+1柱面x253 磁头/柱面)x63扇区/磁道x512字节/扇区,若2000mb.很明显有14mb的空间没有用上,这是因为不同的硬盘寻址模式的转换而造成的部分空间不能使用(丢失).系统的int 13h api允许程序读写这些视窗系统不能管理的空间,这些没用上的额外空间就可以用来保存一些秘密的信息,例如:某些软件的加密数据就保存在硬盘的0磁道.这些额外的空间上没有fat,簇等概念,要读写这些空间,只有通过chs寻址定位扇区,用13号中断进行扇区读写.当然,这需要有一定的编程能力与对硬盘有一定的了解!三.mbr(master boot record)扇区 这些额外空间中最有魅力的是mbr扇区,这个扇区位于硬盘的0磁头0柱面1扇区.mbr扇区是系统启动时自检后int 19h首先读取mbr扇区的512bytes内容到内存0:7c00,然后把控制权交给mbr扇区.它的魅力就在与此,这时操作系统还没有加载,反而操作系统还需要mbr程序来引导,所以mbr扇区又叫主引导扇区,相对于视窗系统的引导记录叫dbr(dos boot record).一些主引导扇区的病毒就利用了mbr扇区的特点,操作系统还没引导就执行了病毒代码,进行破坏!这是一把双刃的剑,利用好了它同样能为大家提供优质的服务.最常见的例子就是多操作系统的引导.mbr扇区虽然只有512bytes,这对于引导程序来说是足够的.但它所在的0磁道的其他扇区没有用上,视窗系统的分区表形成一个链表,有多少个逻辑驱动器就会有多少个分区表,也就是有相应多的磁道没有使用.在视窗系统下,不能对这些磁道直接读写.只有用程序读出分区链表,得到分区情况与这些磁道的地址,再用int 13加以利用.例如,编写一个增强的主引导记录(mbr),但程序大小超过512bytes,可以把程序的二进制代码分成多个512bytes,分别存在0磁道上,但首先执行的代码必须放在mbr扇区里,而且要保留好主分区表(共64bytes)与magic id(2bytes);mbr执行时,mbr把程序的其他部分从0磁道读到内存里再执行.理论上,主引导程序只受隐含磁道的多少限制,一个磁道时31.5kbytes,主引导程序与分区表必须保证不被破坏(防止某些软件运用隐含磁道,而破坏主引导记录),所以程序必须高效.精练与短小,最好用汇编语言编写.还有一点,主引导程序必须保存在隐含扇区里,这是视窗系统的文件管理子系统所不能做到的.所以,必须用一个安装程序把主引导程序的程序代码与数据(mbr)当作安装程序的数据通过int 13h的写扇区操作把mbr写到0磁道0扇区扇区里.这样的操作有一定的危险,因为原来的主引导记录与主分区表会被破坏,所以千万要备份原来的mbr与主分区表,并完全复制主分区表到新的主引导记录里.四.利用硬盘额外空间 干才提到,用int 13h 可以把数据写到硬盘的隐含磁道里.同样,也可以把数据读出来.怎样才能把一些想要藏起来的数据好好的藏起来?其实,13号中断对硬盘的访问是以扇区为单位的,而扇区又以字节为最小的单位.事实上所有的数据都可以当作字节流看待,忽略其实际的数据结构,运用int 13h的02h号读扇区子功能与03h号写扇区子功能,就可以轻易的从硬盘读写数据.至于13号中断的用法,很多汇编的书上都有介绍,这不是本文探讨的内容!有一个问题,怎么知道硬盘上哪些地方操作系统没有用上?前面已介绍了视窗系统没有使用硬盘的大概哪一处,现在介绍怎么通过计算来得知具体的位置.先来介绍一些硬盘存储结构的知识.一个硬盘设计时就有定好了硬件参数,有多少个物理磁头,物理柱面,每磁道有多少个扇区,buffer有多大等,必须清楚现今的硬盘是一个三维的立体结构(chs--cylinder,head,sector).硬盘在出厂时就已经进行低级格式化,每一个扇区都标明了寻找地址,标记了坏扇区,并给出实际容量.这时的硬盘就象一张有小格的纸,操作系统的分区程序把硬盘划分为多个区域,再用高级格式化程序格式化每个区域以便于文件系统进行文件存储.前面提及,硬盘分区表也保存再隐含磁道里,而分区表是一个链表结构,得知每所有的隐含磁道的位置.现在简要介绍一下分区表的结构:硬盘分区表(hard disk partition table)是记录硬盘分区信息的数据.一般情况下,硬盘的0磁头0柱面1扇区(即mbr-master boot record 扇区)保存了硬盘第一张分区表(主分区表),分区表位于该扇区位移1beh处,连续40h个字节.一张分区表最多可以容纳四个分区表项,每个表项占用10h个字节,一个分区表项代表一个分区的使用情况.分区表项的数据结构适合int 13h的数据格式.分区表项的结构是这样的:第0字节80h是活动分区的标志,非活动分区为00h;第1,2,3字节表示分区的起始位置,第4字节为是操作系统标志,不同操作系统使用不同的标记;第5,6,7字节表示终止位置,第8,9,10,11字节表示以当前分区为基准相对于本分区首扇区相对号,第12,13,14,15字节指出分区占用扇区总数.起始地址与终止地址是用chs的寻址方式,地址用3个字节表示,分区起始(结束)的柱面及扇区数据合用前两个字节,第一字节的低6位为分区起始扇区值,最大为63(扇区由1开始计数),高字节的高2位与低字节的8位共10位为分区起始柱面值,最大值为1023(第三字节是磁头号,最大值为255柱面与磁头由0开始计数).视窗系统的分区链表结构,主分区表项是活动分区,扩展分区表项表示扩展分区的信息,扩展分区里有可划分逻辑分区(逻辑驱动器);扩展分区表项的第1.2.3字节指示第一个逻辑分区的分区表的位置;如果存在第二个逻辑分区,这个分区表的第二个表项的第1.2.3字节又指示下一个逻辑分区表的位置,如果没有这个表项为0值.这就形成了链表的结构.在缺省的情况下,视窗系统的分区程序把每一张分区表保存在隐含磁道的首扇区,但一个磁道有63个扇区,就是说还有62个扇区共31kb没使用.至于怎样利用这些空间就要看需要了.通过读取分区链表,得到操作系统使用硬盘的情况,对比一下bios(基本输入输出系统)检测到的有关硬盘的信息(保存在cmos数据中),就可以知道操作系统到底有多少空间没有用上(主要是硬盘最后一个柱面的部分扇区).可以通过调用int 13h的08h号子功能返回硬盘的最大柱面号.前面的计算额外硬盘空间的例子,就知道视窗系统有好几mb的空间不用!越大的硬盘额外硬盘空间就越大!把一些秘密的敏感的数据保存在这些视窗系统遗弃的空间里,别人无法通过操作系统读取,至于放在哪里,以什么形式存放,只有你与你的程序知道,有一定的保密效用!五.示范实例 有很多的文章介绍一些使用这些硬盘特殊空间的思想.例如,利用硬盘额外空间存放个人的机密文件,cmos数据或个人软件的加密数据;写一个新的能把某一分区保护起来int 13h服务程序保存在隐含磁道里,用一个特殊的mbr把新的int 13h服务程序驻留内存,达到硬盘软保护卡的功能.现在以一个cmos数据自我保护的mbr程序的编写为例子,具体说明数据怎么保存在隐含扇区里与增强主引导记录的程序编写.cmos数据的保护有多种方法,有人用vxd技术对cmos数据进行写保护;有人用文件保存cmos数据,在自动批处理文件中用程序把cmos数据文件中的数据回写cmos中,这同样达到保护的功效.本文的例子的cmos数据保护的原理是:首先,通过端口70h与71h把cmos数据读取出来;然后,用int 13h的03h子功能把cmos数据写到一个隐含扇区中,例如:0柱面0磁头29扇区;再编写相应的mbr,在每次引导时把隐含扇区中的cmos数据写回cmos.这样也达到cmos数据的保护功能!这里涉及到cmos数据的读写方法与mbr程序的编程技巧.不同公司出品的bios,它们的cmos数据格式有所不同,但都时先把cmos地址(一个cmos地址读写一个字节的数据)送端口70h,再用端口71h读写这个cmos地址的数据.award公司出品的bios头10h字节保存一些动态的cmos数据如时间,后70h字节保存一些硬件信息与用户配置设置,只须把后面70h个字节的比较固定的cmos数据保存起来.mbr--主引导记录,系统自检后由19号中断服务程序把mbr扇区中的数据,也就是mbr程序读到内存地址0:7c00h中,然后把控制权交给mbr.本文的mbr程序按以下流程完成cmos数据回写与读取操作系统引导(dbr)记录到内存,并把控制权交给dbr进行操作系统引导.1. 把mbr从内存0:7c00h搬移到内存0:0600h,共512bytes;2. 跳到从内存0:0600h到0:0700h中的mbr搬移代码后的位置继续执行,把保留cmos数据隐含扇区读到内存0:0800h;3. 设置cmos的地址端口(70h)与读写端口(71h),把内存0:0800中的70h个cmos数据回写cmos中;4. 依次读取主分区表的四个分区表项的的内容,判断是否为可引导分区,如果是转5,否则打印“invalid partition table.”信息并进入死循环;如果四个分区表项都无效则进入rom basic;5. 保存可引导分区表项的起始扇区地址,多次读取引导扇区(dbr)到内存0:7c00h,如果读取dbr成功并通过macic id(魔数aa55)判断是否为引导记录,如果是控制权转移到0:7c00h,继续进行操作系统的引导,否则打印“missing operating system.”信息并进入死循环;如果读取dbr不成功,打印“error loading operating system.”信息并进入死循环;(文后附汇编源程序并有编译方法与程序说明)有了mbr,怎么把它写到mbr扇区里面呢?先把文后的程序编译成exe文件,再用debug把程序的代码与数据提取到一个文件里(方法程序中附有).你可以用程序把这个512bytes的文件读到内存字节数组中,再把数组用int 13h写到0柱面0磁头1扇区中.又可以用程序把mbr文件的二进制数据转化成你所用编程语言可以接受的数据表示形式加到你的安装程序中,把这些数据写到硬盘中.安装程序用c语言或汇编语言写都可以,但mbr程序一定要用汇编语言写!文后也附有一个安装程序(cmbootld.asm)与数据转化程序(bintodat.c).同样,还可以想出更多更实用的想法来,如,加密分区表,设密码授权访问硬盘,用两个同样大小的分区模拟备份系统等.模拟备份系统在公共机房中快速恢复系统是比较实用的.利用现在大硬盘的优势,分出两个同样大小的分区a.b,在其中a分区中安装操作系统与应用软件,并编写一个管理程序把a分区的内容完整复制到b分区上,并隐藏b分区;写一个主引导记录,每次引导时可以用热键管理选择把b分区的内容恢复(复制)到a分区或正常启动.mbr能实现的功能还有很多,你可以充分发挥你的想象力去设计这样的mbr!六.结束语 由上面的文字看来,充分使用硬盘的空间似乎很简单,但这需要对硬盘有比较深的了解,能自如运用c/c++或汇编语言.总的来说,有扎实的功底一切会更好.现在存储技术的高速发展,硬盘的容量与速度大大的提高,是否有需要象文中所述的那样想尽办法利用硬盘空间?其实答案是,你是否有一些特别的需要,而本文所述的方法能确切的解决你的问题!希望本文能给大家一些帮助.参考文献
〈〈硬盘保护技术手册〉〉 人民邮电出版社 1996年三月版〈〈计算机组织与设计:硬件/软件接口〉〉机械工业出版社
... 下一页