📄 656.html
字号:
<TABLE cellSpacing=0 cellPadding=0 width="100%"
background="images/back.gif" tppabs="http://www.linuxhero.com/docs/images/back.gif" border=0>
<TBODY>
<TR>
<TD vAlign=top width="80%">
<DIV align=center>
<FORM action="search.html" tppabs="http://www.linuxhero.com/docs/search.html" method=get>
</FORM>
<TABLE cellSpacing=0 cellPadding=0 width="95%"
border=0><TBODY>
<TR>
<TD background="images/bgi.gif" tppabs="http://www.linuxhero.com/docs/images/bgi.gif"
height=30></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=3 width="95%"
align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width="100%"
border=0>
<TBODY>
<TR>
<TD vAlign=top>
<p><FONT class=normalfont><B><font color=blue>用DOS命令破除UNIX系统管理员口令</font></B></FONT><BR><FONT class=smallfont color=#ff9900>2004-04-23 15:18 pm</FONT><BR><FONT class=normalfont>作者:张雷生<br>来自:Linux知识宝库<br>联系方式:无名<br><br>引言<br>
<br>
对于广大的SCO UNIX操作系统管理员来说,最不可原谅的过失之一就是忘记了管理员口令(即超级用户口令)。这个过失会导致极其严重的后果,对此凡是具备 UNIX操作系统常识的人都应该知道。然而令人遗憾的是,时至今日铸错者依然大有人在。看来,对他们固然要责备,但既然问题客观存在,我们就总还须面对现实,想办法去解决才是。<br>
<br>
长期以来,许多人就超级用户口令被忘记的问题发表了各种看法。一部分人认为,一旦忘记了超级用户口令,只能重装操作系统,此外别无它法。另一部分人则坚决反对这种“重装论”,他们提出了一些经过成功实践的解决方案,使得“重装论”者败下阵来。现在我们可以肯定地说,忘记超级用户口令是有办法解决的。但同时我们也不得不承认,现行的解决方案有很大的局限性,这些局限性决定了现有方案无论怎样变化和发展也不可能成为一种有着强大生命力的最彻底的解决方案。<br>
<br>
传统解决方案的局限性<br>
<br>
上面已经谈到,目前有多种针对超级用户口令被忘记问题的解决方案。为了叙述上的方便,本文将这些方案统称为传统解决方案。传统方案乍看起来似乎各不相同,但经过认真分析和归纳后就会发现,它们实际上大同小异,都有以下共同点:<br>
<br>
1. 必须有一套(两张)Emergency Boot Floppy (紧急启动软盘)。这套软盘均为文件系统格式,必须在SCO UNIX上制作,并且在不同类型机器上制作的紧急启动软盘相互不能通用。<br>
<br>
2. 用紧急启动软盘启动后,将硬盘根文件系统mount到某个目录下(一般为/mnt目录),然后进入该目录(即进入硬盘根文件系统的根目录),修改相关目录下与超级用户口令有关的信息(各种方案的不同之处主要体现于此)。最后回到软盘根目录,拆卸/dev/hd0root,重启机器。<br>
<br>
这些共同点实际上反映了传统方案的局限性:<br>
<br>
一、操作平台局限性:要求自始至终必须在SCO UNIX操作系统平台上实施。<br>
<br>
二、操作工具局限性:对紧急启动软盘的依赖性太大。万一软盘发生损毁,必须找一台类型相同的机器再制作一套,这就是前面所说的“专盘专用”的限制。<br>
<br>
三、操作对象局限性:必须依靠硬盘根文件系统的支持。即操作者与修改对象(指与超级用户口令有关的信息)被文件系统隔开,操作者不能直接修改对象,只能调用文件系统提供的服务修改。这种方式本是信息科学中倡导的层次化思想的一种体现,在正常情况下应予称道;但任何事物都是有两面性的,在非常情况下 —— 诸如解决忘记超级用户口令这一类问题时 —— 该方式反而有可能带来麻烦。<br>
<br>
三大局限性说明了传统解决方案可行性的脆弱和狭窄,也决定了它们作为凌驾于文件系统之上的高层方案所必然具有的弊端。于是,打破这些局限性,探索出一种全新的解决方案,就成为了摆在一切UNIX研究者面前的新课题。<br>
<br>
新课题<br>
<br>
所谓新课题,就是找到一种能够突破传统方案局限性的新方案。究竟从何处下手呢?<br>
<br>
让我们再来看一看三大局限性。<br>
<br>
操作平台局限性似乎不好突破,因为其它操作系统识别不了UNIX的文件系统格式。<br>
<br>
操作工具局限性好象就更难了,因为紧急启动软盘既要在UNIX上制作,又要在UNIX上使用,所以如果操作平台局限性突破不了,它就更突破不了。<br>
<br>
最后看看操作对象局限性。操作对象完全由文件系统管理,操作者必须通过文件系统访问它们。万一文件系统崩溃,那么即使它下面的文件完好无损,操作者也只能认为这些文件已全部丢失 —— 因为文件系统无法访问(例如mount不上来)。其实这个时候还是有办法找到那些文件的,方法就是直接访问物理硬盘。道理很简单:就本质而言,文件系统只不过是一个构筑于物理硬盘之上的逻辑组织,平时我们是通过它来访问物理硬盘的;现在这个组织寿终正寝,不能再为我们服务了,于是我们只好“自己动手,丰衣足食”。直接访问物理硬盘不但可以使文件“失”而复得,而且还有另外一个重要意义 —— 突破了操作对象局限性。<br>
<br>
操作对象局限性一旦突破,我们就会惊奇地发现突破另外两大局限性简直可以说是顺理成章了。因为虽然其它操作系统识别不了UNIX的文件系统格式,但在任何操作系统上,我们都可以访问物理硬盘;而只要是带有访问物理硬盘功能的软件,都可以成为我们的操作工具。<br>
<br>
现在我们要做的仅仅是:找一个大家最熟悉的操作系统和一个最易寻觅的可以访问物理硬盘的软件。<br>
<br>
大家最熟悉的操作系统无疑是DOS。可以访问物理硬盘的软件很多,但最易寻觅的莫过DEBUG.EXE。所谓最易寻觅,是因为DEBUG是DOS本身的一条外部命令,可以说只要是在安装了DOS的机器上都可以找到它。对DEBUG略知一二的人可能会指出该命令并没有提供访问物理硬盘的选项,但请不要忘记 DEBUG是DOS提供给用户的一个汇编语言调试程序,我们完全可以利用它编写、调试和执行一个汇编小程序去访问物理硬盘。应该说,这对一个能够取得系统管理员身份的人并不困难。<br>
<br>
综上所述,在DOS上运行DEBUG来破除UNIX管理员口令,这就是本文提出的解决SCO UNIX超级用户口令被忘记问题的新方案。<br>
<br>
新方案的应用<br>
<br>
新方案已经提出,下面我们来看看它是如何应用于实践的。<br>
<br>
我们假设一台装有SCO OpenServer Release 5的超级用户口令被忘记。<br>
<br>
首先,随便找一台安装了DOS的计算机,制作一张DOS系统盘,并在系统盘上拷贝一个DEBUG.EXE文件。<br>
<br>
C:DOS>format/s a:<br>
<br>
C:DOS>copy debug.exe a:<br>
<br>
然后将该盘插入COMPAQ服务器A驱,开机启动DOS操作系统,执行DEBUG命令。<br>
<br>
A:>debug<br>
<br>
现在我们就编写一段汇编语言程序,来读出硬盘0柱0头1扇区的内容。该扇区存放的是主引导记录,读出它是为了确定SCO UNIX分区的起始位置。该程序是调用中断13H实现的,以后我们还要反复用到它,当然入口参数将随所读内容物理地址的变化而变化。<br>
<br>
-a<br>
2039:0100 MOV AX,0201<br>
2039:0103 MOV BX,1000<br>
2039:0106 MOV CX,0001<br>
2039:0109 MOV DX,0080<br>
2039:010C INT 13<br>
2039:010E INT 20<br>
2039:0110 <br>
-g<br>
Program terminated normally<br>
-d 1180<br>
2039:1180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:11A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:11B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:11C0 01 6E 06 3F 20 96 00 70-03 00 00 48 01 00 00 00 .n.? ..p...H....<br>
2039:11D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:11E0 01 97 05 3F E0 FF 00 B8-04 00 00 C8 1B 00 80 00 ..c?............<br>
2039:11F0 01 01 63 3F 20 6D 00 08-00 00 00 68 03 00 55 AA ..c? m.....h..U.<br>
<br>
<br>
<br>
从分区表中可看出硬盘上共有三个分区,其中类型标志字节为 63H的分区是SCO UNIX分区。该分区起始于1柱面0磁头1扇。<br>
<br>
下面,读出UNIX根文件系统i-node表的第一个扇区,以确定根目录的位置。<br>
<br>
先读 i-node 表。由于UNIX分区始于1柱0头1扇,所以根文件系统必定始于2柱0头1扇。并且,由于2柱0头1扇是引导块,2扇是专用块,3、4扇为间隔,所以 i-node 表必定始于第5扇。<br>
<br>
-a<br>
2039:0100 MOV AX,0201<br>
2039:0103 MOV BX,1000<br>
2039:0106 MOV CX,0205<br>
2039:0109 MOV DX,0080<br>
2039:010C INT 13<br>
2039:010E INT 20<br>
2039:0110 <br>
-g<br>
Program terminated normally<br>
-d 1000<br>
2039:1000 00 80 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ <br>
2039:1010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1030 00 00 00 00 0A 4B 32 33-0A 4B 32 33 0A 4B 32 33 .....K23.K23.K23<br>
2039:1040 ED 41 10 00 00 00 02 00-80 02 00 00 DA 05 00 00 .A..............<br>
2039:1050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1070 00 00 00 00 E1 83 C5 35-46 82 C5 35 46 82 C5 35 .......5F..5F..5<br>
<br>
<br>
<br>
现在我们看到的是 i-node 表的前两项。从偏移1040H至107FH的64个字节是2号i-node ,即根目录的 i-node 。<br>
<br>
下面我们就根据 i-node 计算根目录在硬盘上的物理地址。<br>
<br>
我们从偏移1040H看起:<br>
<br>
ED41H表示文件类型与存取权限为“drwxr-xr-x”;<br>
<br>
1000H表示文件连结数为16;<br>
<br>
0000H表示文件属主ID为 0;<br>
<br>
0200H表示文件组ID为 2;<br>
<br>
80020000H表示文件字节数为 640个;<br>
<br>
DA0500H表示第一个数据块地址。由于其它12个数据块地址均为 0,所以可断定根目录在硬盘上只占了一个数据块。现在我们必须依据DA0500H计算出这个数据块存放在硬盘的第几柱面、第几磁头、第几扇区。如何计算?作者专门总结了一套公式:<br>
<br>
C = TRUNC ( P/(H*S) )<br>
<br>
C1 = C0 + C<br>
<br>
H1 = TRUNC( (P-C*H*S)/S )<br>
<br>
S1 = P - C*H*S - H1*S + 1<br>
<br>
其中:<br>
<br>
C1、H1、S1分别为数据块物理地址柱面号、磁头号、扇区号<br>
<br>
P等于数据块地址翻译成十进制数后再乘以 2<br>
<br>
H为硬盘磁头数<br>
<br>
S为每磁头扇区数<br>
<br>
C0为根文件系统起始柱面<br>
<br>
C只是一个中间量<br>
<br>
将DA0500H代入上述公式,并根据H=64,S=32,C0=2,可算出C1=3,H1=29,S1=21。因此根目录在硬盘上的物理地址为: 3柱面 29头 21扇。<br>
<br>
下面就把它读出来。<br>
<br>
-a<br>
2039:0100 MOV AX,0201<br>
2039:0103 MOV BX,1000<br>
2039:0106 MOV CX,0315<br>
2039:0109 MOV DX,1D80<br>
2039:010C INT 13<br>
2039:010E INT 20<br>
2039:0110 <br>
-g<br>
Program terminated normally<br>
-d 1000<br>
2039:1000 02 00 2E 00 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1010 02 00 2E 2E 00 00 00 00-00 00 00 00 00 00 00 00 ................<br>
2039:1020 03 00 64 65 76 00 00 00-00 00 00 00 00 00 00 00 ..dev...........<br>
2039:1030 0C 00 62 69 6E 00 00 00-00 00 00 00 00 00 00 00 ..bin...........<br>
2039:1040 1F 00 75 73 72 00 00 00-00 00 00 00 00 00 00 00 ..usr...........<br>
2039:1050 22 00 65 74 63 00 00 00-00 00 00 00 00 00 00 00 ".etc...........<br>
2039:1060 4B 00 73 68 6C 69 62 00-00 00 00 00 00 00 00 00 K.shlib.........<br>
2039:1070 4E 01 2E 6C 61 73 74 6C-6F 67 69 6E 00 00 00 00 N..lastlogin....<br>
<br>
<br>
<br>
上面列出的就是根目录的前八项,从中可以看出 /etc 目录的 i-node 号为 22H,即34D。<br>
<br>
因为每个扇区有8个 i-node,所以34号 i-node 必定在2柱面0头9扇。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -