标题: 黑客技术(一) [打印本页] 作者: 清风客 时间: 2003-9-17 23:25 标题: 黑客技术(一) 1999年7月6日《参考消息》:
【英国〈星期日电讯报〉7月4日文章】题:克林顿下令通过“电脑破坏行动”来推翻塞尔维亚领导人(记者 菲力普·舍卫尔 萨沙·尼科利茨 朱利叶斯·斯特劳斯)
克林顿总统已经命令美国政府的电脑黑客冲破障碍,查到米洛舍维奇在外国银行里的存款,并抽走他隐藏的财富,这是美国中央情报局旨在推翻南斯拉夫总统秘密计划的一部分。
这一有争议的行动计划是克林顿上周批准的共有6点内容的一揽子秘密计划的部分内容。华盛顿政界和情报界一些高级人士反对这一行动计划。
虽说2日晚上有5000多人在诺维萨德举行反米洛舍维奇的最新一次集会,但是,贝尔格莱德的反对派内部四分五裂促使华盛顿亲自出马,发起旨在推翻米洛舍维奇的“电脑破坏”
行动。去年,五角大楼为海、陆、空增添了电脑空间,作为第四战区,并建立了一个主管情报战事务的机构。
美国中央情报局认为,米洛舍维奇在其执政的10年期间向希腊、塞普路斯和俄罗斯银行转移了数以百万计英镑的钱财,因此得在这些银行进行调查。但是,一些情报官员担心,对塞尔维亚领导人米洛舍维奇数以百万计钱财采取这样的行动会对美国产生不利的后果,一些独立的黑客会向华盛顿的敌人出售他们的技术,从而使华盛顿的计算机系统成为他们进行破坏和非法抽取钱款的目标。
另外,此举在政治上也引起人们的关切和担心,这会影响到希腊和俄罗斯的主权,美国的外交官们在美俄两国就科索沃问题发生争执后刚刚在两国之间重新架起桥梁。
单是这条新闻,或许并没有给你太多的感想。但如果同时,把中国驻南斯拉夫大使馆被轰炸的事件联系在一起,或许会促使你更深层次地来分析这条新闻。
南斯拉夫无奈地从科索沃撤军,是因为军事力量,特别是当代高科技军事力量的薄弱,所以受到了欺负。同样,由于信息技术的落后,南斯拉夫又受到了欺负。随着信息时代的到来,信息技术越来越显得重要,信息技术也能影响一个国家的安全。入侵总统银行帐号只是信息战争的小手段,如果利用各种技术,破坏一个国家的各种计算机网络,绝对会使这个国家的商业经济,国家安全受到影响。信息技术为军事战争开辟了另外一个战场。如果一个国家的信息技术落后,同样会受到侵略。
我国驻南斯拉夫大使馆被轰炸,里面或多或少有点我国的军事力量不是很强大的因素在里面。那么如果,信息技术也大大落后与别国,是不是也存在国家安全问题。
回想一下5-60年代,我国自行研制两弹一星时的情形。这些巨大成就为当时我国立足于世界提供了什么样的支持。从那时侯起,没有哪一个国家敢小看我们中国的力量。
民族信息产业应该放到一个很重要的战略地位。过去是原子弹,氢弹,现在应该是高速计算能力,应该是现代化信息生产能力。
如果我们的各种计算机系统用的是进口的CPU,进口的操作系统,进口的办公软件,是不是到时候会被别人牵着鼻子走呢。
我们要象那些为两弹一星做出贡献的老科学家们一样,努力创造,发展民族信息产业。也希望民族信息产业能实现现代化,面向世界,大踏步走出去,屹立于世界。
(作者以前工作在一个高科技军事单位,为有幸能和这些为祖国争光的老前辈们同处一室而感到高兴。这些前辈的默默无闻的奉献精神,关心爱护年轻人的成长的胸怀,一直深深地印在我的脑海里。)
另外一个结论就是,我们应该正视黑客技术。
由于媒体的炒作,有关黑客的新闻给大众造成了一种对黑客技术不屑一顾,认为黑客是一类卑鄙下流的人的情况。有的商业公司甚至抓住大多数人不懂计算机技术这一特点,歪曲这些技术,误导大众,从而大赚其钱。
其实,黑客技术并不下流,也并不深奥。相反,黑客技术是网络安全技术的一部分。或者就可以认为就是网络安全技术。从反面说就是黑客技术,从正面说就是网络安全技术。
这种技术被不法之人用了,当然要遭到谴责。但如果因为这种技术会引来犯罪而不准研究和介绍,也是不正确的。我们应该推广介绍这些技术,这样才能使我们对网络安全有更深的理解,从更深层次地提高网络安全。
我们要善用这种技术,加强这些技术的研究。
本书试图对各种网络安全技术(黑客技术)进行介绍,分析原理和提供基本实现方法。
要想对网络安全技术有一个很深的研究,必须具备一些必要的知识。本书的前三章提供了一些操作系统,编程方法,网络协议和网络编程等基本概念。为以后各章打下良好的基础。在操作系统一章中介绍了Linux上的编程。因为Linux操作系统对网络通信做了很好的支持,而且带了gcc编译器和gdb调试器,是最佳选择。在Linux上编写的C程序可以很短小,代码执行效率也很高。第二章介绍了TCP/IP协议。对IP和TCP的数据包格式作了简单的介绍。另外将了TCP连接的三次握手。许多威胁网络安全的技术都是对协议的弱点的攻击。第三章介绍了网络编程。因为,在测试一个网络是否安全的时候,通常需要编个程序来完成一个特殊的测试工作。
接下来是介绍根据TCP/IP协议进行的攻击。IP地址欺骗和TCP/IP协议攻击都是根据协议的弱点进行。
接下来的几章介绍了进行攻击的方法。Sniffer一章介绍了Sniffer的工作原理,通过利用sniffer,能收集到许多有用的信息。端口扫描一章除了介绍一些常用的网络命令外,还介绍了端口扫描的几种技术。通过端口扫描也能收集到相当丰富和有用的信息。口令破解一章讲解了口令破解器的工作机理。口令破解是侵入一个系统的比较常用的方法。特洛伊木马是侵入系统后留下的后门,为以后能再进入目标系统做准备。随后,介绍了缓冲区溢出攻击方法。这通常也很常用,很重要的攻击方法。书中对它的原理作了较为详细地介绍。
再下来对攻击步骤作了一个总结,并介绍了怎样入侵Windows NT。对前面介绍的方法的综合利用做了介绍。
最后,介绍了计算机病毒的原理和防范以及Perl语言。
在每章,为了对某个原理进行介绍,在原理介绍后,基本上还提供一些简单的源代码程序。这里的程序大多数是由C写的Linux程序。
由于作者不是专业人士,水平有限,同时成书仓促,书中错误相当多。希望能得到批评指正,以便将来整理得更好。书中所有内容都来自Internet,只是略微加工整理。本书的最终目的是想让大家正确看待黑客技术,说明黑客技术并不是象许多媒体描述的那样高深莫测。
此书仅作抛砖引玉之用。
作者电子邮件地址:jxcai@iname.com ICQ#:27771117
第一章
操作系统简介
本章主要介绍几个目前常见的操作系统。首先介绍Linux系统,一个自由软件。Linux对网络通信有很好的支持,在介绍网络安全技术时,对网络技术进行实例时,没有Linux是不可能。
随后对Windows 9x的Msdos.sys的设置以及Windows NT中的注册表作了介绍。在理解安全技术时,这些也是最基本的。
第一节 Linux
一 Linux下的C++编程
ELF和a.out
在Linux下,有两种可执行文件:ELF和a.out。有可能你的Linux只支持一种,有可能两种都支持。运行一下命令file,如果命令输出包含ELF,则支持ELF,如果包含Linux/i386,则支持a.out。
GCC版本
使用下面命令,可以知道它的版本:
gcc -v
GCC安装后目录结构
/usr/lib/gcc-lib/target/version/ (及子目录) 编译器就在这个目录下。
/usr/bin/gcc可以从命令行执行的二进制程序在这个目录下。
/usr/target/(bin|lib|include)/ 库和头文件在这个目录下。
/lib/,/usr/lib和其他目录,系统的库在这些目录下。
符号定义
使用-V开关,就能看到GCC定义的符号。参见下列实例:
$ echo 'main(){printf("hello world");}' | gcc -E -v -
Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs
gcc version 2.7.2
/usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp -lang-c -v -undef
-D__GNUC__=2 -D__GNUC_MINOR__=7 -D__ELF__ -Dunix -Di386 -Dlinux
-D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__i386
-D__linux -Asystem(unix) -Asystem(posix) -Acpu(i386)
-Amachine(i386) -D__i486__ -
GCC编译器使用简介
通常后跟一些选项和文件名来使用 GCC 编译器。gcc 命令的基本用法如下:
gcc [options] [filenames]
选项指定编译器怎样进行编译。
GCC选项
GCC 有100个编译选项。这些选项中的许多可能永远都不会用到,但一些主要的选项会经常遇到。很多的 GCC
选项包括一个以上的字符,因此必须为每个选项指定各自的连字符。例如, 下面的两个命令是不同的:
gcc -p -g test.c
gcc -pg test.c
第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里。 第二条命令只告诉 GCC
为 gprof 命令建立剖析信息。
没有选项时,GCC 会生成一个名为 a.out 的可执行文件。
用 -o 编译选项来为将产生的可执行文件用指定的文件名来命名。例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件,
要这样输入命令:
gcc -o count count.c
-c 选项告诉 GCC 仅把源代码编译为目标代码。缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名。
-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译。 GCC 产生的汇编语言文件的缺省扩展名是 .s 。
-E 选项指示编译器仅对输入文件进行预处理。当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.
用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试。
易于调试意味着编译后的代码没有经过优化。必要时,需要让编译器对代码进行优化。
-O 选项告诉 GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码。 -O2
选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
GCC 支持数种调试和剖析选项,常用到的是 -g 和 -pg 。
-g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序。GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使
-g 和 -O (产生优化代码)联用。
-pg 选项告诉 GCC 在编译好的程序里加入额外的代码。运行程序时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况。
用 gdb 调试 GCC 程序
Linux 包含了一个叫 gdb 的 GNU 调试程序。在程序运行时能观察程序的内部结构和内存的使用情况。 以下是 gdb 所提供的一些功能:
监视程序中变量的值
设置断点,使程序在指定的代码行上停止执行。
一行行的执行代码
为了用GDB调试程序,在编译是必须指定调试选项。在命令行上键入 gdb 并按回车键就可以运行 gdb 了。如果一切正常的话, gdb
将被启动并在屏幕上显示:
GDB is free software and you are welcome to distribute copies of it under
certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc.
(gdb)
可以在启动GDB时,加入许多选项。也可以在这个命令后面直接指定要调试的程序。
gdb < fname>
gdb 基本命令
gdb 支持很多的命令,这些命令从简单的文件装入到允许检查所调用的堆栈内容的复杂命令。下表列出了你在用 gdb 调试时会用到的一些命令。
命令 描 述
file 装入想要调试的可执行文件
kill 终止正在调试的程序
list 列出产生执行文件的源代码的一部分
next 执行一行源代码但不进入函数内部
step 执行一行源代码而且进入函数内部
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变
break 在代码里设置断点, 这将使程序执行到这里时被挂起
make 使你能不退出 gdb 就可以重新产生可执行文件
shell 使你能不离开 gdb 就执行 UNIX shell 命令
gdb 应用举例
下面列出了将被调试的程序,这个程序被称为 greeting ,显示一个简单的问候, 再用反序将它列出。
#include < stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
void my_print (char *string)
{
printf ("The string is %s", string);
}
void my_print2 (char *string)
{
char *string2;
int size, i;
size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string;
string2[size+1] = `0';
printf ("The string printed backward is %s", string2);
}
用下面的命令编译这个程序:
gcc -o -g test test.c
运行编译好的程序,显示如下:
The string is hello there
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的。我们所设想的输出应该是:
The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作。用 gdb 看看问题究竟出在哪儿, 先键入如下命令:
gdb greeting
如果在输入命令时忘了把要调试的程序作为参数传给 gdb ,可以在 gdb 提示符下用 file 命令来载入它:
(gdb) file greeting
这个命令载入 greeting 可执行文件,就象在 gdb 命令行里指定启动gdb装入它一样。
这时就能用 gdb 的 run 命令来运行 greeting 了。 当它在 gdb 里被运行后结果大约会象这样:
(gdb) run
Starting program: /root/greeting
The string is hello there
The string printed backward is
Program exited with code 041
这个输出和在 gdb 外面运行的结果一样。问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for
语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:
(gdb) list
(gdb) list
(gdb) list
第一次键入 list 命令的输出如下:
1 #include < stdio.h>
2
3 main ()
4 {
5 char my_string[] = "hello there";
6
7 my_print (my_string);
8 my_print2 (my_string);
9 }
10
如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:
11 my_print (char *string)
12 {
13 printf ("The string is %s", string);
14 }
15
16 my_print2 (char *string)
17 {
18 char *string2;
19 int size, i;
20
再按一次回车将列出 greeting 程序的剩余部分:
21 size = strlen (string);
22 string2 = (char *) malloc (size + 1);
23 for (i = 0; i < size; i++)
24 string2[size - i] = string;
25 string2[size+1] = `0';
26 printf ("The string printed backward is %s", string2);
27 }
根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:
(gdb) break 24
该命令的执行结果如下:
Breakpoint 1 at 0x139: file greeting.c, line 24
(gdb)
现在再键入 run 命令, 将产生如下的输出:
Starting program: /root/greeting
The string is hello there
Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :24
24 string2[size-i]=string
你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入:
(gdb) watch string2[size - i]
执行结果如下:
Watchpoint 2: string2[size - i]
现在可以用 next 命令来一步步的执行 for 循环了:
(gdb) next
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 `h`。这是执行next命令后的结果:
Watchpoint 2, string2[size - i]
Old value = 0 `000'
New value = 104 `h'
my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23
23 for (i=0; i< size; i++)
这个值正是期望的。后来的数次循环的结果都是正确的。当 i=10 时, 表达式 string2[size - i] 的值等于 `e`, size - i
的值等于 1, 最后一个字符已经拷到新串里了。
如果再把循环执行下去,会看到已经没有值分配给 string2[0] 了, 而它是新串的第一个字符, 因为 malloc
函数在分配内存时把它们初始化为空(null)字符。所以 string2 的第一个字符是空字符。于是就发现了为什么在打印 string2 时没有任何输出了.
找出了问题出在哪里后, 修正这个错误是很容易的。把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size。这是因为
string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到 偏移量 10, 偏移量 11 为空字符保留。
为了使代码正常工作有很多种修改办法. 。一种是另设一个比串的实际大小小 1 的变量,下面是这种办法的程序。
#include < stdio.h>
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
my_print (char *string)
{
printf ("The string is %s", string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string;
string2[size] = `0';
printf ("The string printed backward is %s", string2);
}
二 Linux SHELL编程
SHELL编程是指写一个包含一系列UNIX命令的程序,这个程序可以在命令行运行。用下面的命令何以执行一个SHELL程序:
方式一
$ sh cmd.file
方式二
$ . cmd.file;
方式三
$ chmod u+x cmd.file
$ cmd.file
怎样创建和运行一个SHELL脚本
在一个编辑器里,写入一系列UNIX命令,举个例子:
echo This is a shell program
echo Today I am going to
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
保存这个文件,命名为ex1。然后用下列命令“chmod 700
ex1”,将该文件变为可执行文件。做完上述个步骤之后,就好了。如果要看运行这个文件会出现什么结果,可以在命令行状态下键入:ex1 coffee bar in
hangzhou。
上述程序中最后一行就是将ex1命令中的单词读入内存,同样将第二个等等。$1代表第一个单词,$2代表第二个。
可见,SHELL程序的目的是能批量处理命令,从而完成一些比较复杂的工作。
不同的SHELL有不同的启动文件,比如:
bash: .profile
sh: .profile
csh: .cshrc
tcsh: .cshrc
zsh: $ZDOTDIR/.zprofile and/or $ZDOTDIR/.zshrc
所有的这些启动文件都要读入.login和.logout文件。
SHELL程序设计
注释
操作符“#"引入注释。
if 操作符
语法
if [ 条件表达式 ]
then
命令序列
fi
或
if [ 条件表达式 ]
then
命令序列
else
命令序列
fi
数值操作符
= 等于
-n 不等于
-gt 大于
-lt 小于
-le 小于等于
exit 命令
用于结束SHELL脚本。可以带一个返回值。
expr 命令
以数值和算术运算符作为参数,计算结果,将其返回标准输出。
$ expr 4 + 5
9
$
合法算术运算符有+、-、*、/和%。在*和/之前必须冠以反斜线,已防被SHELL先行解释。
for 操作符
循环语句。
语法:
for $环境变量 in 字符串表
do
语句序列
done
while 操作符
循环语句。
语法:
while [ 条件表达式 ]
do
语句序列
done
case 操作符
条件控制语句。
语法:
case $环境变量 in
常量1)
语句序列1
;;
常量2)
语句序列2
;;
... ...
常量n)
语句系列n
;;
esac
命令行变元
$# 传入脚本的命令行变元数;
$* 所有命令行变元值;
位置变元
$0 命令本身
$1 第一个命令行变元;
$2 第二个命令行变元
SHELL函数
shell函数由以下形式定义
funcname () {
命令序列
}
调用时
funcname arg1 arg2
第二节 Windows 98
Windows 98 MSDOS.SYS的设置和编辑
Windows 98 的安装程序会在根目录中建立一个叫MSDOS.SYS
的文件,并且设定其属性为只读,系统和隐藏。这个文件不像MS-DOS的开机文件MSDOS.SYS。这个文件只是一个普通文本文件。包含了两个段落——[Paths]和[Options]。可以修改这个文件,来改变系统的一些属性。
[Paths]段列出了Windows 95其它文件的位置(如注册文件等)。[Options]段则使你可以用来设定自己的喜欢的开机模式。
简介如下:
1. [Paths] 段的设置
----------------------------------------------------------------------
HostWinBootDrv=< 开机驱动器>
预设值: C
目的: 指定所要开机的驱动器
----------------------------------------------------------------------
WinBootDir=< Windows所在目录>
预设值: 安装时所指定的目录(例如C:)
目的: 列出开机时所需要的文件位置
----------------------------------------------------------------------
WinDir=< Windows 所在目录>
预设值: 安装时所指定的目录(例如 C:)
目的: 列出安装时所指定的Windows 95目录位置
2. [Options]段包含下列设置,必须手动加入
----------------------------------------------------------------------
BootDelay=< 秒数>
预设值: 2
目的: 设定Windows 95开机前显示“Starting Windows 95"这个信息的时间长度
----------------------------------------------------------------------
BootFailSafe=< Boolean>
预设值: 0
目的: 设为1时,使电脑开机时进入安全模式
----------------------------------------------------------------------
BootGUI=< Boolean>
预设值: 1
目的: 设为1时,系统自动进入GUI界面(就是进Windows 95)
设为0时,系统自动进入DOS界面(也就是进到C:>)
----------------------------------------------------------------------
BootKeys=< Boolean>
预设值: 1
目的: 设为1时,开机时可使用功能键(如F4、F5、F6和F8)
设为0时,则禁止使用
注意: 当设BootKeys=0时,BootDelay=n无效
----------------------------------------------------------------------
BootMenu=< Boolean>
预设值: 0
目的: 设为1时,开机时自动进入startup menu
设为0时,必须在开机显示“Starting Windows 95"时按F8,才能进入startup menu
----------------------------------------------------------------------
BootMenuDefault=< Number>
预设值: 1 如果系统正常运作的话
4 如果系统在前一次运行时发生硬关机的话
目的: 预设系统启动时进入startup menu时,默认要继续的那一项
----------------------------------------------------------------------
BootMenuDelay=< Number>
预设值: 30
目的: 设定系统启动时,startup menu的等待秒数,如果这个值减到0,你没有
选择菜单时,系统按照 BootMenuDefault的值启动系统
----------------------------------------------------------------------
BootMulti=< Boolean>
预设值: 0
目的: 设为0时,关掉多重开机的功能(例如:设定为0时不能用前一个操作系统开机)
设为1时,允许使用F4和F8来选择使用前一个操作系统开机
注意: 预设值设为0,是为了避免文件错误。因为使用者会无意中使用MS-DOS开机,并使用不认识长文件名的DOS工具程序
----------------------------------------------------------------------
BootWarn=< Boolean>
预设值: 1
目的: 设为0时,关掉安全模式开机时的警告讯息和startup menu
----------------------------------------------------------------------
BootWin=< Boolean>
预设值: 1
目的: 设为1时,开机后马上执行Win95
设为0时,不会在开机后马上执行Win95。当然你的系统必须有MS-DOS 5.x 或 6.x
注意: 当BootMulti=1时,按F4则会使这里的设定变成相反的作用。例如BootWin=0时,如果BootMulti=1,则按F4就会强迫开机后执行Win95
----------------------------------------------------------------------
DoubleBuffer=< Boolean>
预设值: 0
目的: 设为1时,提供Double-buffer功能。如果你的controller需要的话,如SCSI Controller
设为2时,则是无条件使用double-buffer功能,不管你的controller 是否需要
----------------------------------------------------------------------
DBLSpace=< Boolean>
预设值: 1
目的: 设为1时,自动载入DBLSPACE.BIN
设为0时,不会自动载入
----------------------------------------------------------------------
DRVSpace=< Boolean>
预设值: 1
目的: 设为1时,自动载入DRVSPACE.BIN
设为0时,不会自动载入
----------------------------------------------------------------------
LoadTop=< Boolean>
预设值: 1
目的: 设为0时,要求Win95不要将COMMAND.COM、DRVSAPCE.BIN和DBLSPACE.BIN载入UMB。如果你使用的软件有兼容问题时,可以考虑将此设为0
----------------------------------------------------------------------
Logo=< Boolean>
预设值: 1
目的: 设为1时,强迫Win95显示预设的启动画面
设为0时,避免显示Win95启动画面
3. MSDOS.SYS的重要性
MSDOS.SYS文件包含一些表面上看起来没有用的信息。其实,这些信息对某些软件是必需的。这些软件认为这个文件大小至少需1024
bytes。例如,如果防毒软体检测到MSDOS.SYS这个文件小于1024 bytes,则
它会认为这个文件已经遭到破坏。因此在这个文件后面一段说明文字:“;The following lines are required for
compatibility with other programs. ;Do not remove them (MSDOS.SYS needs to be
>1024 bytes)."。“ ;"是说明的意思,系统不会读取这段文字。在这段文字下就出现一堆 "X"。
4. 如何编辑MSDOS.SYS
编辑MSDOS.SYS的步骤如下:
(1)修改MSDOS.SYS的文件属性:attrib -s -h -r c:.sys。
(2)用Notepad编辑这个文件,并保存。
(3)再将文件属性改回去:attrib +s +h +r c:.sys。
第三节 Windows NT
Windows NT注册表
注册表提供了一个安全,统一的数据库,用来以一个层次结构来保存配置信息。注册表中的每一个主键和一个.INI文件中的用方括号括住的条目一样。
.INI文件的一个缺点就是不支持条目的嵌套,以及包含非纯文本信息。注册表的主键能包含嵌套的付键。这些付键为配置系统提供了进一步详细的信息。注册表的值可以包含可执行代码,并同时为在同一计算机上的多个用户提供配置。
有两个版本的注册表编辑器,可以用来修改注册表。
.:Regedt32.exe 包含了大多数菜单项和它们的选择。可以在注册表里查找主键和付键。
.:Regedit.exe 可以查找字符串,值,主键和付键。
为了便于使用,注册表分成了五个独立的部分。这些都叫做主键。
HKEY_CURRENT_USER
这里包含了当前登录的用户的一些配置信息。用户的文件夹,屏幕颜色,控制面板设置都保存在这里。这些都是用户相关信息。
HKEY_USERS
在NT 3.5版本,用户相关信息存在systemroot目录。在NT
4.0,它们存在systemroot目录。用户特有信息和系统用户共有的信息都存在那里。
这里的改变是为了和Windows
95处理用户信息方法保持并行。在新版本的NT里,单个用户的信息被分成几个部分,放在的不同的子目录下。这样做的一个原因是,Win95和NT操作系统使用地层的目录结构形成他们新用户界面。
一个用户信息包含在NTUser.dat(和NTUser.dat.log)文件和下面的目录里:
* Application Data:保存这个用户的应用程序信息。
* Desktop:放一个文件的图标或快捷方式,使得这些东西能在用户桌面上显示。
* Favorites:提供给用户放置他个人的一些保存内容,如文件,快捷方式和其他信息。
* NetHood::保存个人的有关网络连接的信息。
* Personal:为一个指定用户保存个人文档的跟踪。
* PrintHood:保存的是打印机的使用。
* Recent:最近使用的东西
* SendTo:提供一个对输出设备的统一存储。
* Start Menu:用户菜单的设置。
* Templates:放置文档的模板。
HKEY_LOCAL_MACHINE
这个主键包含有关计算机的特殊信息。这些信息存放在systemroot目录下,作为操作系统的永久文件,除了一些易变的硬件主键。
应用程序,设备驱动程序和NT操作系统从这些配置文件里读入信息。操作系统用这些信息来决定系统的配置,而不管是哪个用户在使用这个系统。正是因为这个原因,对于系统管理员来讲,HKEY_LOCAL_MACHINE是相当重要的。
HKEY_LOCAL_MACHINE包括五个付键:
* Hardware:描述计算机硬件,硬件驱动程序怎样使用硬件,映象和连接内核模式驱动程序和各种用户模式数据的数据库。所有这些数据在系统启动时重新建立。
* SAM:安全帐号管理。在NT 4服务器域,用户和组帐号的安全管理。
* Security:包括本地安全策略,比如特定用户的权限的数据库。
* Software:应用软件的安装和配置信息数据库。
* System:控制系统启动,驱动程序装入,NT服务和操作系统行为的数据库。
HKEY_LOCAL_MACHINE的有关信息
这个子树包含了本地计算机的SAM数据库中的用户和组帐号。对于NT 4.0,还包含了域的安全信息。SAM注册键包含的信息是User Manager
工具里显示的信息,或者是你使用NT 4 的资源管理器的安全菜单命令所显示的用户和组。
KEY_LOCAL_MACHINE的有关信息
这个子树包含本地计算机的安全信息。包括以下方面:分配用户权限,建立口令策略,本地组的成员,都是由User Manager 配置的。
HKEY_CLASSES_ROOT
保存在这里的信息是在使用资源管理器或者对象联结和嵌入时,打开一个文件时能调用正确的应用程序。
HKEY_CURRENT_CONFIG
这里保存的数据是用来进行配置,比如软件和驱动程序的载入或显示时使用的分辨率。这个主键有两个付键:software和system,他们保持对配置信息的跟踪。
理解Hives
注册表分成叫做hives的部分。这些hives和一个单独的文件及严格lOG文件对应。这些文件在systemroot目录下。
Registry Hive File Name
=================================================================
HKEY_LOCAL_MACHINESAM 和SAM.LOG
HKEY_LOCAL_MACHINESecurity 和 Security.LOG
HKEY_LOCAL_MACHINESoftware 和 Software.LOG
HKEY_LOCAL_MACHINESystem 和 System.ALT
=================================================================
注释
Ownership =
选择ownership菜单项会出现一个对话框,显示所选择的注册键的拥有者的名字。键的拥有者允许另一个用户拥有这个键。管理员可以指定一个用户拥有这个Ownership,或自己直接操作。
REGINI.EXE = 这是一个文本的控制台应用程序,通过她,可以将一个注册表脚本中的键加入到注册表中。
下面的表列出了注册表hives和付键及缺省的存取权限。
表示一个主要hive
表示一个付键
_LOCAL_MACHINE
Admin-Full Control
Everyone-Read Access
System-Full Control
Admin-Full Control
Everyone-Read Access
System-Full Control
Admin-Full Control
Everyone-Read Access
System-Full Control
Admin-Special (Write DAC, Read Control)
System-Full Control
Admin-Full Control
Creator Owner-Full Control
Everyone-Special (Query, Set, Create, Enumerate, Notify, Delete, Read)
System-Full Control
Admin-Special (Query, Set, Create, Enumerate, Notify, Delete, Read)
Everyone-Read Access
System-Full Control
_CURRENT_USER
Admin-Full Control
Current User-Full Control
System-Full Control
_USERS
Admin-Full Control
Current User-Full Control
System-Full Control
_CLASSES_ROOT
Admin-Full Control
Creator Owner-Full Control
Everyone-Special (Query, Set, Create, Enumerate, Notify, Delete, Read)
System-Full Control
_CURRENT CONFIG
Admin-Full Control
Creator Owner-Full Control
Everyone-Read Access
System-Full Control
第二章