无忧启动论坛

标题: 一个历史问题(写给熟悉DOS引导以及熟悉汇编程序的朋友) [打印本页]

作者: 滑头    时间: 2008-3-27 22:05
标题: 一个历史问题(写给熟悉DOS引导以及熟悉汇编程序的朋友)
本人以前是做自控的,DOS时代写过一些汉字的显示驱动和打印驱动。1992年曾经写过这样一个启动程序,命名为WIPE。这是个仿病毒程序,在486及其以前的时代,可用来“锁住”硬盘。非机器主人只能在这台机器上使用软盘和光盘来运行,而硬盘不见了。用FDISK来看,似乎是个尚未分区的硬盘,因为硬盘上没有分区表,连55AA的标记都不存在,主引导扇区已被全部清零。但机器主人只要用那张钥匙软盘开机启动,就会发现,实现引导的不是软盘而是硬盘,启动以后所有功能照旧。这张钥匙软盘可以是5寸的,也可以是3寸的,以你可引导的软驱来定。钥匙软盘可当作普通软盘来使用,其容量也没有任何变化。即便删掉软盘上的所有文件,钥匙软盘仍然使用依旧。钥匙软盘可以简单复制,配出另外一把钥匙。

其原理是,把硬盘的分区表放到了软盘的首扇区,并在这个扇区中写了一段代替主引导记录的程序,这个仅有410个字节的程序和分区表一起驻留内存,任何程序要调用分区表的时候都从内存中直接给出。

而钥匙软盘的制作及其方便,在这种启动方式下只要“传染”开着(有专用的软件来控制),只要软驱一转动,哪怕仅仅一个“A:”的操作,哪怕是在A驱中一个没有任何内容的回车,类似病毒,内存中的WIPE程序就会把软驱中任何一张没有写保护的软盘“传染”成WIPE软盘。当初就是打算用这样的方法“吃掉”所有软盘上可能存在的引导区病毒。

用任何一张没贴写保护的WIPE软盘去启动未“加锁”的机器,启动过程看不出区别,但硬盘已被锁——主引导区被清零,分区表被转移到软盘上,软盘也成为这个硬盘的钥匙。如果启动的WIPE软盘贴有写保护,硬盘就会被“传染”成一个WIPE硬盘,分区表还在硬盘的主引导扇区,硬盘使用照旧,但同样是WIPE以驻留方式在起作用,因此同样会“传染”出WIPE软盘。WIPE硬盘同样可在软盘启动时被WIPE软盘实现“锁住”,成为必须要钥匙软盘才能开启的机器。

不同机器的钥匙盘有各自的随机密码,启动时自动核对,不同机器不同的钥匙。由于在软盘上仅仅读一个扇区,启动机器的速度比正常的硬盘启动还要快一些。WIPE程序适用于486及以下档次的机器,操作系统从DOS3.3到WINDOWS95,98以上的系统没在486级的机器上试运行过,也就没证实是否可以使用WIPE。

在486以后的BIOS中,都加入了防止开机时更改硬盘主引导扇区的功能,所以这个程序就不能再直接使用。由于种种原因,如何解决WIPE在档次较高机器上的使用问题也被搁置起来,没有继续钻研下去。

[ 本帖最后由 滑头 于 2008-3-27 10:23 PM 编辑 ]
作者: netwinxp    时间: 2008-3-27 23:11
随着BIOS内可选择启动方式的增多、对引导型病毒的防范、对硬盘工作原理的深度认识。MBR搞秘钥这套方法不好用了(用软件来恢复被清空的MBR现在也不是一个很难的工作),当前比较有前景和已经开始用上的就是增加启动指纹认证硬件那种"根正苗红"的办法。而且以前防止非法使用电脑的比较有效的办法是制造分区表项死循环(也就是后来的臭名昭著的硬盘锁),并不是空白MBR。现在的系统也已经避开了硬盘锁的限制。

[ 本帖最后由 netwinxp 于 2008-3-27 11:19 PM 编辑 ]
作者: wangfec    时间: 2008-3-28 07:22
比江民炸弹还要早?够牛的,只是可惜流传不如江民炸弹。
作者: netwinxp    时间: 2008-3-28 12:32
原帖由 wangfec 于 2008-3-28 07:22 发表
比江民炸弹还要早?够牛的,只是可惜流传不如江民炸弹。

大概在94年(具体时间不太记得了)就有人发了一篇有关分区表循环可能导致硬盘死锁的论文,然后有不少人用它来加密硬盘。只不过“逻辑锁”事件才凸显这个BUG而已。
比如前段时间MGF指出了windows没有保护NTLDR、HAL.DLL,可以从里面读取GDT进去RING0权限的BUG,也没有引起微软的重视。
病毒通常会利用BUG,但BUG的报告一般都早于病毒相当长一段时间。

[ 本帖最后由 netwinxp 于 2008-3-28 12:35 PM 编辑 ]
作者: lvyanan    时间: 2008-3-28 12:56
原帖由 netwinxp 于 2008-3-28 12:32 PM 发表

大概在94年(具体时间不太记得了)就有人发了一篇有关分区表循环可能导致硬盘死锁的论文,然后有不少人用它来加密硬盘。只不过“逻辑锁”事件才凸显这个BUG而已。
比如前段时间MGF指出了windows没有保护NTLDR、 ...

没错,在94年计算机世界杂志上发表的,好像叫《dos操作系统的一个缺陷》,我也实验过,结果硬盘果真锁死了,惹下个大麻烦,怕领导批评,搞得我满世界找DOS v2.X,居然给我找到了,解了燃眉之急,好惊险哪!有了DOS v2.x我就有恃无恐了,95年我写出了自己的逻辑锁程序,没放出去故意害人,只是在硬盘有坏道经销商又不肯退换时使用,到现在我还保存了几个版本呢,江民那个逻辑锁是后来的事了。96年我还写了一个分区写保护程序,用上它机房管理轻松多了,windows9X出现后,一切都过时了,windows的直接磁盘IO,很难拦截其对磁盘的操作,所有的努力就此放弃至今。

[ 本帖最后由 lvyanan 于 2008-3-28 01:43 PM 编辑 ]
作者: netwinxp    时间: 2008-3-28 15:44
标题: 回复 #5 lvyanan 的帖子
电脑1994年10期始料未及—高版本DOS的一个缺陷”作者:周志方
=============================
9x对硬盘锁没招,只有修改过的DOS7.1(好像有缺陷)和NT内核才行。(DOS2.x的也行,不过对大硬盘可能不支持)。
=============================
***这是回复3楼的***
还没有披露的并不表示不存在,比如PCI\VEN_8086&DEV_2925这个hwid,你几乎很难找到它的踪迹,但事实上它已经存在ICH9R中(ICH9R的说明书里面有)。

[ 本帖最后由 netwinxp 于 2008-3-28 04:08 PM 编辑 ]
作者: 滑头    时间: 2008-3-28 19:28
江民炸弹当初就能被WIPE解决掉。WIPE软盘不管三七二十一照样把硬盘主引导扇区清零并拿下分区表,虽然仍不能正常开机,但此后即可用DOS软盘成功引导机器,并进一步运行NDD等软件纠正分区链,也可利用被WIPE捕获的硬盘分区表来手工操作。

捎带提一下:被WIPE锁住的硬盘,是可以用NDD全盘扫描后恢复分区表的。

但这一套已经没什么现实意义了。如今光盘、U盘都能独立启动,能使用的手段又多了很多。

[ 本帖最后由 滑头 于 2008-3-28 07:37 PM 编辑 ]
作者: 滑头    时间: 2008-3-28 19:50
原帖由 lvyanan 于 2008-3-28 12:56 PM 发表

windows9X出现后,一切都过时了,windows的直接磁盘IO,很难拦截其对磁盘的操作, ...

至少95,并非对输入输出口地址和DMA通道直接操作,从WIPE照样可以启动95就能体会到,95仍然是通过BIOS读写硬盘的。

从我的角度考虑,似乎直接对磁盘IO是在吹牛。硬件的发展更快,种类更多,通过BIOS是一种标准化的做法,非标的做法肯定是不可靠的,甚至是危险的。
作者: netwinxp    时间: 2008-3-28 20:10
原帖由 滑头 于 2008-3-28 19:50 发表

至少95,并非对输入输出口地址和DMA通道直接操作,从WIPE照样可以启动95就能体会到,95仍然是通过BIOS读写硬盘的。

从我的角度考虑,似乎直接对磁盘IO是在吹牛。硬件的发展更快,种类更多,通过BIOS是一种 ...

NT内核除了启动部分仍然用BIOS中断外,NTLDR(或者setupldr)运行转入保护模式后,开始采用标准IDE(IDE磁盘设备)或者兼容SCSI(其它磁盘设备)方式读取并加载设备驱动程序(总线—磁盘控制器—磁盘),从这以后所有的磁盘访问都经过设备驱动程序来完成,设备驱动是由磁盘控制器厂商编写的不存在无法使用的问题(当然磁盘控制器还得兼容IDE标准或SCSI标准)。
总起来说磁盘中断是芯片组厂商在BIOS里面编写的Fireware(主要来完成磁盘的自举),而磁盘驱动程序则是芯片组厂商在操作系统编写的Sofeware。后者的性能和功能比前者强很多。
至于win9x仍然是DOS内核,基本上还是可以认为是居于BIOS中断的,只不过中断服务地址被转移到保护模式下的系统内存区,通过CALL来调用。
另外,现在真正意义上来讲已经不是I/O口操作而是居于总线命令操作,I/O口是桥接片对总线操作的映射。
举个例子——你在CMOS里面把第二硬盘设置为None,DOS、win9x无法找到,但NT内核通过设备驱动仍然可以正确识别和使用。

[ 本帖最后由 netwinxp 于 2008-3-28 08:23 PM 编辑 ]
作者: 滑头    时间: 2008-4-1 13:20
标题: 并不尽然
原帖由 netwinxp 于 2008-3-28 08:10 PM 发表

你在CMOS里面把第二硬盘设置为None,DOS、win9x无法找到,但NT内核通过设备驱动仍然可以正确识别和使用。 ...

这例子忽悠大家十多年了。

虽然对这个过程并无详细的了解,但只要不迷信权威都应该注意到:不能被BIOS识别的硬盘(当然还是None),NT仍然不能识别。说NT能超越BIOS去读写硬盘,在这里被彻底否定。

也可举个例子:公司最早进来300G硬盘时,尚无机器的BIOS能识别,XP照样不能用什么IDE标准来识别和操作。还要用个驱动盘,实际上是打个临时补丁。当然不是给NT打补丁,因为9X也可以用,显然是给BIOS打的补丁。

个人计算机(微型机)其实和单片机都属于总线结构,在汇编中从来没有什么“总线操作”(宏汇编中或许会出现),而必定都是I/O口地址操作,从I/O口最终映射到某个芯片的若干个引脚。我们干自控出身的,关心的就是这些引脚上的电平变化。
作者: netwinxp    时间: 2008-4-1 15:56
作为启动设备,由于PC机传统架构的局限,所以需要BIOS支持,非启动设备则未必。硬盘是挂接总线,它可以挂ISA(早期)、PCI(当前)、USB(移动硬盘)等。把非启动硬盘设置成NONE能不能被XP识别建议你做完试验再作结论不迟。至于大硬盘支持是受南桥(磁盘芯片组)限制的,比如160G的PATA硬盘并不能被早期的南桥所完全识别。至于有没有总线命令,我下面提供一张AMD766南桥手册,建议你到linux那里多看看。计算机是不断发展的,如果仅依靠原来的I/O口已经远远不够了...桥接片I/O口其实就是让你来发送总线命令或读取设备状态和或数值,至于总线上脉冲系列的产生则由这些新片来帮你完成(如果你自己研究的芯片设备,那你就要关注了),挂在总线上的设备通常有自己的设备标志,你可以通过总线命令来完成对非当前I/O口所在的设备控制和访问,如果你不了解命令的话,仅仅知道I/O口地址,那通常啥也干不了。
换句话说,以前的总线说白了就是CPU引脚的延伸,现在呢总线才是主体,CPU只不过是总线上一个非常重要的设备(它通过CPU桥挂到总线上),比如龙芯2同样可以用AMD的CS5536南桥(虽然它的指令和LX?00系列CPU并不兼容)。
I/O口只不过是一个地址而已,并不一定一成不变,它是可以映射的,WINDOWS里面的pnp设备可以修改I/O口资源的。
如果没有CPU,你的设备按总线规范挂接到总线上,并发出特定的有时序的脉冲(对应于总线命令),你同样可以控制挂在总线上的设备,也可以读取它的数据,也就是说总线并不需要特定的CPU,如果你接触过CAN总线就明白我在说些什么。

[ 本帖最后由 netwinxp 于 2008-4-1 04:45 PM 编辑 ]

AMD766.PNG (50.32 KB, 下载次数: 66)

AMD766截图

AMD766截图

作者: netwinxp    时间: 2008-4-1 16:15
现在的很多设备并不是都受电平触发,有些是靠脉冲边缘触发,有的甚至是靠一串特定脉冲波形来触发(用数字化的角度来说就是一串数值)。其实硬盘上其实也没有真正意义上的扇区,它通过一长串的同步标志然后接着地址标志——数据等等...当然,现在这些具体细节通常已经由集成在硬盘上的芯片、芯片上和或硬盘上的FireWare来完成,所以我们就不必关心这些了。
作者: 滑头    时间: 2008-4-1 21:20
标题: 很受启发,确实有很多知识需要再学习
不过,那300G硬盘的例子恰恰就是在非启动硬盘上出现的,否则又怎么能知道NT没有经受住考验呢!

其次,并非“现在的很多设备并不是都受电平触发”,自古以来就是如此,高电平低电平、上升沿下降沿,从来就没变过。所以说“关心的是电平的变化”,而不是高电平的是否出现。

磁盘扇区的存在就是以磁信号呈现的,就是在物理格式化(低格)时以同步、地址等信号来划分的。物理的东西,怎么可以说“没有真正意义”?使用硬盘或其他存储设备的人不需要知道其中的详细过程,但必定要有人来关心,一般说来既不是你,也不是我。

[ 本帖最后由 滑头 于 2008-4-1 09:39 PM 编辑 ]
作者: 滑头    时间: 2008-4-1 21:34
标题: 还想请教一事
我们知道,只读存储器从ROM,到PROM,到EPROM,到如今的EEPROM,即是FLASHROM,就是所谓的“闪存”。这么说对不对?

对如今的U盘没有更多的了解。对于一般芯片来说,PROM是一次性写入的,EPROM是可用紫外线擦除的,E方PROM是电擦除的,但都是整个芯片统一擦除和写入。那么U盘的过程呢?是整个芯片的操作,还是其中以相当于“扇区”的容量划分,按单元来操作呢?

有个软件,号称是“把U盘当内存用”,很让人疑惑,顶多是当虚拟内存用。速度快慢是另外一回事,而内存是能够以字节为单位改写的,U盘显然做不到。

[ 本帖最后由 滑头 于 2008-4-1 09:38 PM 编辑 ]
作者: netwinxp    时间: 2008-4-1 22:19
现在的BIOS芯片大多数已经是闪存芯片了,区分它和EEPROM的方法可以看写入电压,12V的是EEPROM,5V的是闪存。作为BIOS芯片的闪存通常是NOR闪存,它具有完整的地址线,CPU对其访问时和ROM区别并不大,程序可以直接在里面运行。作为U盘的闪存通常是NAND闪存,大部分的这种闪存不具有完整的地址线,所以CPU不能直接运行这种闪存里面的程序,对U盘数据的访问需要通过U盘主控芯片来完成。另外,闪存和内存存储方法非常接近,每个单元存储一个位的数据,和硬盘完全不一样,只不过主控芯片把它转换成类似硬盘的访问方式。SLC的NAND闪存可以单独修改一个单元的数据,MLC一次会修改4个,不改动的主控芯片会对它进行屏蔽(这也就是MLC的寿命远短于SLC的缘故)。
不过现在CPU对内存的存取不再是直接存取,而是通过内存控制器(CPU集成或北桥集成)来访问,随着技术的发展,USB的带宽越来越大,闪存的速度也越来越快,也许有一天CPU(或北桥)直接集成USB控制器,那么U盘和内存对于CPU来说就没有太大的区别,反正他们的作用都是储存数据。
作者: 七彩云南    时间: 2008-4-3 00:57
看的晕乎晕乎的。

LZ到底想说什么?

还是仅仅是讨论现在系统引导的最底层的技术。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3