邮件监控SMTP POP3系统设计与实现(含源文件)
更新时间:2024-04-13 08:44:01 阅读量: 综合文库 文档下载
- 邮件监控可以监控到内容吗推荐度:
- 相关推荐
摘 要
本论文主要研究了使用LIBNIDS网络安全开发包对邮件客户端收发的邮件的还原。邮件客户端收发邮件时涉及到的协议是SMTP协议和POP3协议。利用LIBNIDS网络安全开发包对邮件的数据包进行捕获,实现了邮件发件人、收件人、抄送人、收发日期、邮件主题、邮件内容和邮件的附件名称信息的提取。
在对邮件的各字段进行还原的过程中,对SMTP和POP3进行协议分析,使用捕获到的SMTP协议和POP3协议邮件的数据包中的内容,分析了邮件的发送和接收时各字段所在的位置和对应的格式。对于含有汉字的字段,如发件人、收件人、抄送人、主题、内容和附件名的还原,也利用分析出的邮件各字段数据格式,设计出汉字还原的方法。
在此基础上,实现了邮件监视端软件的编写,利用互联网信息服务(IIS)浏览被监视计算机中的邮件日志文件,实现了邮件监控子系统中监视邮件收发情况的功能。
关键词 网络监控;邮件监控;邮件还原;SMTP;POP3
- I -
Abstract
This thesis mainly focused on the restoration for the e-mail client to send or receive e-mails using the development package of network security LIBNIDS. E-mail client to send and received e-mails related to SMTP and POP3 protocol. Making use of LIBNIDS to capture the packets of e-mails, it’s achieved the restoration of main information in e-mails, including the sender, recipient, carbon copy (cc), date, subject, content and attachment name.
In the process of restoring e-mails, it carried out on the SMTP and POP3 protocol analysis. With the content of e-mails captured based on SMTP and POP3 protocol, we have analyzed the format for corresponding field in e-mail. While the field contains characters, such as sender, recipient, cc, subject, content and attachment name we also analyzed the format for corresponding field and designed the means to restore Chinese characters.
Using of the Internet Information Services (IIS) on this basis, it’s achieved the function of monitoring the situation to send and receive e-mails in the subsystem of e-mail monitoring.
Key words
network monitoring e-mail monitoring e-mail restoration SMTP POP3
- II -
目 录
摘 要 ..................................................................................................................... I Abstract .................................................................................................................. II
第1章 绪论 ........................................................................................................... 1 1.1 课题背景 ...................................................................................................... 1 1.2 课题来源、目的和意义 .............................................................................. 1 1.2.1 国外研究现状 ....................................................................................... 1 1.2.2 国内研究现状 ....................................................................................... 2 1.3 主要研究内容 .............................................................................................. 2 1.3.1 邮件监控 ............................................................................................... 2 1.3.2 监控端软件 ........................................................................................... 3 1.4 本文结构 ...................................................................................................... 3 第2章 理论基础 ................................................................................................... 4 2.1 引言 .............................................................................................................. 4 2.2 SMTP协议和POP3协议 ............................................................................ 4 2.2.1 SMTP协议简介 ..................................................................................... 4 2.2.2 POP3协议简介 ...................................................................................... 6 2.3 LIBNIDS开发包 .......................................................................................... 7 2.3.1 LIBNIDS简介 ....................................................................................... 7 2.3.2 LIBNIDS数据结构 ............................................................................... 9 2.3.3 LIBNIDS基本函数 ............................................................................. 11 2.3.4 LIBNIDS的使用 ................................................................................. 12 2.4 BASE64简介 .............................................................................................. 13 2.5 本章小结 .................................................................................................... 13 第3章 邮件监控子系统构成和框架 ................................................................. 15 3.1 引言 ............................................................................................................ 15 3.2 模块组成 .................................................................................................... 15 3.3 运行框架 .................................................................................................... 18 3.4 本章小结 .................................................................................................... 19 第4章 基于SMTP和POP3协议的邮件还原.................................................. 20
- III -
4.1 引言 ............................................................................................................ 20 4.2 总流程 ........................................................................................................ 20 4.3 具体实现 .................................................................................................... 23 4.3.1 提取发件人 ......................................................................................... 23 4.3.2 提取收件人 ......................................................................................... 24 4.3.3 提取抄送人 ......................................................................................... 26 4.3.4 提取主题 ............................................................................................. 28 4.3.5 提取日期 ............................................................................................. 30 4.3.6 提取内容 ............................................................................................. 31 4.3.7 提取附件名 ......................................................................................... 33 4.4 邮件还原中的问题及解决办法 ................................................................ 36 4.5 本章小结 .................................................................................................... 37 第5章 监视端的实现 ......................................................................................... 38 5.1 引言 ............................................................................................................ 38 5.2 监视端框架 ................................................................................................ 38 5.3 具体实现 .................................................................................................... 39 5.3.1 数据库 ................................................................................................. 39 5.3.2 IIS设置 ................................................................................................ 40 5.3.3 日志浏览、刷新和保存 ..................................................................... 40 5.3.4 添加和删除监视计算机 ..................................................................... 42 5.4 软件编写中的问题及解决办法 ................................................................ 43 5.5 本章小结 .................................................................................................... 43 第6章 综合测试 ................................................................................................. 44 6.1 引言 ............................................................................................................ 44 6.2 准备工作 .................................................................................................... 44 6.3 测试 ............................................................................................................ 45 6.3.1 收件人、抄送人、主题、内容是英文情况 ..................................... 45 6.3.2 收件人、抄送人、主题、内容是汉字情况 ..................................... 46 6.3.3 多收件人或抄送人情况 ..................................................................... 46 6.3.4 含有多附件情况 ................................................................................. 47 6.3.5 邮件内容超量情况 ............................................................................. 47 6.3.6 被监视计算机未启动情况 ................................................................. 49 6.4 本章小结 .................................................................................................... 49
- IV -
结 论 ................................................................................................................... 50 致 谢 ................................................................................................................... 51 参考文献 ............................................................................................................... 52
- V -
第1章 绪论
1.1 课题背景
随着企业内部局域网络和办公自动化的普及,企业的办公及业务环境得到很大的改善,同时,网络的安全问题也越来越受到关注。由于企业内部网中存有与企业相关的机密信息,而这些信息关乎到企业的利益,甚至生存,因此,企业内部局域网中的核心机密数据的安全性越来越为人们所关注,对文件数据的安全管理系统的研究有着非常重要的现实意义[1]。
电子邮件作为互联网高速发展的一个标志,它的使用越来越普遍,不仅成为企业内部的沟通桥梁,也是企业和外部进行各类业务往来的重要管道,为保护商业秘密不通过邮件外泄,成为企业的一件大事,邮件监控也就越来越重要[2]。
不仅对于企业,对于校园内的各个实验室,计算机中文件的安全问题仍然是不可忽视的。作为实验室内部人员发送邮件的监视系统,不仅要监视收件人、主题和内容等信息,邮件的附件名称等也需要获取,因此邮件监控尤为重要。
文中主要研究了基于SMTP协议和POP3协议的邮件主要信息的还原,使用LIBNIDS网络安全开发包,捕获使用邮件客户端收发的邮件的数据包,并对邮件的发件人、收件人、抄送人、邮件日期、主题、内容和附件名称进行还原。能够在监视端浏览被监视计算机中的邮件日志文件,达到了监视的效果。
1.2 课题来源、目的和意义
本课题来自于计算机网络与信息安全技术研究中心。通过对邮件监控子系统的研究与实现,达到对企业内部网和实验室局域网中收发邮件的监视,发现泄露信息的人员,实现企业和实验室的保密工作。
1.2.1 国外研究现状
国外有一些邮件监控的共享软件[3]。比如:Email Monitoring,是一款
- 1 -
可以监控多个电子邮件账户的软件。它不仅仅实现了电子邮件的监控,还可以过滤垃圾邮件。另如SOFTX电子邮件监视器,可以监控所有向外发送的邮件,可以提醒未经批准或未知的程序正试图发送电子邮件,可以阻止电子邮件发送到未知的收件人以及电子邮件中包含可能不安全的附件等[4]。
1.2.2 国内研究现状
目前国内已经有不少网络监控软件[3]。比如:Work Win管理专家、“清扬”网络综合管理系统、网路岗、ANYVIEW(网络警)网络监控软件、百络邮件监控系统等等。这些软件实现了局域网内用户的监控,有的侧重于为企业服务,监视员工的行为,包括游戏、聊天、上网、发送邮件等;有的侧重于一方面的监视,像邮件的监视,网络访问的监视等等[4]。
其中的易风邮件监控系统,基于MAC地址进行监控;监控网络内所有收发邮件的内容及附件,(outlook、fox mail等邮件客户端,包括WEB发送);可对所有收发邮件进行拦截、阻挡,禁止发送或者接收某些邮件;可监控收发邮件的邮箱地址及抄送、密送邮箱地址;可设置报警信息,对监控、拦截或者过滤的邮件进行报警提示,自动弹出;可监控邮件内容中某些带敏感字符的邮件或者有指定名称的附件;可指定监控某个邮箱或者某些邮箱,包括抄送、密送邮件地址;可对收发邮件内容进行审查过滤,有敏感字符的邮件不能外发;可指定某个邮箱发信,指定发送到某个邮箱,禁止抄送、密送或者禁止某些邮箱不能发信;可对收发邮件内容大小进行控制;可对收发邮件附件大小、附件名称进行控制;可将系统日志和监控日志进行备份导出;可按时间、组别或者部门、机器名、IP、MAC地址、发件人、收件人、主题、关键词、发送类型等方式对监控邮件进行查询;可以按组别或者部门进行监控,可以按用户权限进行管理查询;该系统品质优秀,操作简单,功能强大。
1.3 主要研究内容
1.3.1 邮件监控
邮件监控包括监控Outlook、Fox mail等邮件客户端工具和Web Mail(浏览器通过Web方式来收发电子邮件)。本文中只对使用邮件客户端收发
- 2 -
的邮件进行监视,邮件客户端使用SMTP协议发送邮件,使用POP3协议接收邮件。记录发送邮件的各种信息,包括发送和接收方的邮件账号、抄送的邮件账号、邮件主题、邮件正文、邮件附件名字、邮件服务器的IP地址等,并写入日志文件。
1.3.2 监控端软件
为了在监视端浏览被监视者的日志,要编写一个具有浏览被监视者计算机上的邮件日志文件的软件。该软件可以添加需要监控的计算机,删除监控的计算机,浏览日志,保存日志的功能。如果被监视的计算机未启动,则显示指定内容。
1.4 本文结构
本文主要内容如下:
第2章中,介绍了邮件监控子系统研究与实现的理论基础,简单介绍了SMTP和POP3协议、 LIBNIDS开发包、BASE64编码。
第3章中,介绍了邮件监控子系统的系统构成和框架。
第4章中,介绍了基于SMTP协议和POP3协议的邮件还原。 第5章中,介绍了监视端软件的具体实现。
第6章中,测试邮件监控子系统,对不同类型的邮件收发情况进行了测试。
- 3 -
第2章 理论基础
2.1 引言
邮件客户端收发邮件使用的是POP3协议和SMTP协议,在进行邮件还原之前有必要了解这两种协议的工作原理和原始命令码。在对这两种协议的数据包进行捕捉的时候,使用到了LIBNIDS网络安全开发包,所以本章中会对各种网络开发包进行一下对比,说明为什么要选择LIBNIDS网络安全开发包,并对LIBNIDS进行介绍,提及LIBNIDS的一些重要结构体和函数,以及LIBNIDS的基本运行框架。
在对邮件中的中文进行还原的过程中,使用到了Base64编码。本章中也对其进行了简单的介绍。
2.2 SMTP协议和POP3协议
2.2.1 SMTP协议简介
SMTP称为简单Mail传输协议(Simple Mail Transfer Protocol),是一组用于由源地址到目的地址传送邮件的协议,用以控制信件的中转方式。目标是向用户提供高效、可靠的邮件传输。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,可以把电子邮件寄到收信人的服务器上[1]。SMTP工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP提供了一种邮件传输机制,当收件方和发件方都在同一个网络上时,可以把邮件直接传给对方。当对方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP简历双向的通信渠道。收件方可以是最终收件人,也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双方就可以开始通信。SMTP是个请求/响应协议,它监听25号端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接[1]。本文使用的SMTP协议工作在第一种情况下。
- 4 -
SMTP协议的基本流程如下:首先,建立连接;其次,客户端发送命令,以标识发件人自己的身份,然后发送邮件命令,服务器端做出响应,表明是否准备接收;再次,客户端发送邮件,以标识该电子邮件的计划接收人,服务器端则表示是否愿意为收件人接收邮件,如果写上成功,则发送邮件;最后,结束此次发送,退出连接[2]。
在SMTP协议中,最重要的内容是SMTP命令和响应状态,这是SMTP运行的基础。SMTP命令都已回车换行作为结束标识,下面对他们做详细描述[3]。
HELLO:参数
MAIL FROM:参数为
RCPT TO:参数为
DATA:无参数,接收SMTP将把其后的行为看作邮件数据去处理,以“回车换行.回车换行”标识数据的结尾。
REST:无参数,表示重置会话,当前传输被取消。 NOOP:无参数,表示无操作,服务器应响应OK。 QUIT:无参数,表示要求接收SMTP返回一个OK应答并关闭传输。 VRFY:参数
EXPN:参数
SMTP客户端向SMTP服务器发送命令之后,SMTP服务器就会返回一个应答码。应答码的每一个数字都有特定含义,第一位数字为2时表示命令成功,为5时表示失败,3时表示没有完成。下面详细描述应答码的含义。
501:表示参数格式错误; 502:表示命令不可实现;
503:表示错误的命令序列; 504:表示命令参数不可实现;
211:表示系统状态或系统帮助响应; 214:表示帮助信息; 220:表示服务就绪; 221:表示服务关闭;
- 5 -
421:表示服务未就绪,关闭传输信道; 250:表示要求的邮件操作完成; 251:表示用户非本地;
450:表示要求的邮件操作未完成,邮箱不可用; 550:表示要求的邮件操作未完成,邮箱不可用; 451:表示放弃要求的操作; 551:表示用户非本地;
452:表示系统存储不足,要求的操作未执行; 552:表示过量的存储分配,要求的操作未执行; 553:表示邮箱名不可用,要求的操作未执行; 354:表示开始邮件输入,以“.”结束; 554:表示操作失败[4]。
2.2.2 POP3协议简介
POP3(Post Office Protocol 3)是适用于客户-服务器结构的脱机模型的电子邮件协议。它规定了怎样将个人计算机连接到Internet邮件服务器和下载电子邮件的电子协议,允许用户从服务器上把邮件存储到本地主机上,同时删除保存在邮件服务器上的邮件[5]。POP3服务器是遵循POP3协议的接收邮件服务器,用来接收电子邮件。
在POP3协议中有三种状态:认可状态,处理状态和更新状态。
当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态,在完成相应的操作后客户机发出QUIT命令,则进入更新状态,更新之后重返认可状态。大多数现有的POP3客户机与服务器执行采用ASCII明文发送用户名和口令,在认可状态等待客户连接的情况下,客户发出连接,并由命令user/pass对在网络上发送明文用户名和口令给服务器进行身份验证,一旦确认成功,边转入处理状态。
POP3命令由命令和参数组成。所有命令以一个回车换行CRLF结束。命令和参数由可打印的ASCII字符组成,他们之间由空格隔开。命令一般是三到四个字母,每个参数却可达四十个字符长。POP3响应是有一个状态码和一个可能跟有附加信息的命令组成。所有响应也是有回车换行CRLF结束的。有两种状态码,状态码“+OK”表示成功,状态码“-ERR”表示失败。
- 6 -
下面对POP3命令进行详细介绍。
USER:参数username,在认可状态下有效,表示用户名;
PASS:参数password,在认可状态下有效,表示用户密码,与命令USER一起使用,如果操作成功,就导致状态转换;
APOP:参数为Name和Digest,在认可状态下有效,其中Digest是MD5消息摘要;
STAT:无参数,在处理状态下有效,它请求服务器返回关于邮箱的统计资料;
UIDL:参数为[Msg#],在处理状态下有效,它返回邮件的惟一标识符;
LIST:参数为[Msg#],在处理状态下有效,他返回邮件数量和每个邮件的大小;
RETR:参数为[Msg#],在处理状态下有效,它返回由参数标识的邮件的全部文本;
DELE:参数为[Msg#],在处理状态下有效,它表示服务器将有参数标识的邮件标记为删除。执行QUIT命令后,邮件将删除;
RSET:无参数,在处理状态下有效,服务器取消所有标记为删除的邮件,用于撤销DELE参数;
TOP:参数为[Msg#],在处理状态下有效,服务器将返回由参数标识的邮件前n行内容,n必须是正整数;
NOOP:无参数,在处理状态下有效,服务器返回一个肯定的响应; QUIT:无参数,在更新状态下有效,退出。
2.3 LIBNIDS开发包
2.3.1 LIBNIDS简介
LIBNIDS是网络安全开发包的一种,网络安全开发包是指用于网络安全研究和开发的一些专业开发函数库。它的主要作用是提供用于网络安全研究和开发的基本功能的实现,为了研究者和开发者进一步研究和开发网络安全提供编程接口,为了网络安全功能的实现提供方便[6]。
网络安全开发包的最大作用适用于设计网络安全系统,其直接功能是实现了某些网络安全技术,如网络数据包捕获技术、网络数据包生成技术等。
- 7 -
利用它们可以很快地实现某些网络安全系统的基本功能。例如,使用网络数据包捕获技术可以实现网络监视系统的最基本功能,而使用网络数据包生成技术可以构造网络安全扫描系统的基本功能。网络安全开发包在实际的系统中得到了广泛的应用,一些比较著名的网络安全系统都使用了一些网络安全开发包。
网络安全开发包的种类非常多,其实现的功能也干差万别。新的网络安全开发包不断涌现,很多不成熟的网络安全开发包也在不断壮大、成熟。一些在实际的使用中用得比较多的
网络安全开发包如下:
(1)网络数据包捕获开发包Libpcap;
(2)Windows平台专业数据包捕获开发包WinPcap; (3)网络数据包构造和发送开发包Libnet; (4)网络入侵检测开发包Libnids; (5)通用网络安全开发包Libdnet。
网络入侵检测开发包Libnids(Library Network Intrusion Detection System)是一个用于网络入侵检测系统设计的专业开发包,提供了一个网络入侵检测系统的基本框架和基本功能。它可以进行IP碎片重组和TCP流重组,还提供了监测网络扫描的功能[7]。利用Libnids可以快速地实现网络入侵检测的基本功能。本文中使用的并非是Libnids的网络入侵检测,而是它的IP碎片重组和TCP流重组,使用它们进行数据包的捕获,进而实现邮件信息的还原。
Libnids是基于Libpcap和Libnet而开发的,所以具有它们的优点,以及跨平台、可移植、稳定、方便等特点。利用Libnids可以进行数据包的捕获,并对捕获到的数据包进行协议分析,当然也可以对数据包进行过滤,只不过感兴趣的数据包。利用Libnids可以进行协议分析,如分析IP、TCP、UDP、等协议。本文中只需要对SMTP和POP3协议的数据包进行过滤,只分析这些数据包。
Libnids提供的TCP数据流重组功能是非常强大的,它可以对基于任何TCP协议的应用层协议进行TCP数据流重组,显示他们的连接过程,并对它们传输的数据进行分析。利用Libnids提供的TCP数据流重组功能,可以
- 8 -
实现对敏感数据的分析,如对用户、密码、账号进行嗅探。
利用Libnids提供的TCP数据流重组功能,还可以对网络传输的内容进行还原,重现网络数据。例如,可以利用Libnids的TCP数据流功能来分析HTTP协议,同时,对所传输的内容(如网页)进行分析。网络实际传输的是HTML文件内容,对其进行分析,就可以对网页进行重现。例如,可以对POP3和SMTP协议传输的邮件内容进行重现。
Libnids是仿照Linux操作系统内核的网络协议栈来实现的,所以它提供的功能非常稳定、可靠,通过了很多测试过程。IP碎片重组是Libnids提供的另外一个重要功能,利用它可以捕获所有的IP碎片数据包(包括异常数据包),当然也可以捕获正常的IP数据包。Libnids不仅可以捕获异常IP数据包,也可以检测异常TCP数据包和异常UDP数据包。LIbnids还提供了端口扫描检测功能,能够检测TCP端口扫描攻击,并检测出TCP端口扫描类型[3]。
2.3.2 LIBNIDS数据结构
2.3.2.1 基本常量
在Libnids中定义了一些基本的常量,这些常量都有特定的含义。下面对他们进行介绍。
1.报警类型
Libnids提供了对IP数据包异常、TCP数据包异常、UDP数据包异常以及扫描攻击的检测,对于不同的攻击方式提供不同的报警类型。
2.Libnids状态
在对TCP数据流进行重组时,必须考虑到TCP的连接状态,在Libnids中为了方便开发而定义了Libnids状态,共有如下6种:
#define NIDS_JUST_EST 1 #define NIDS_DATA 2 #define NIDS_CLOSE 3
#define NIDS_RESET 4
#define NIDS_TIMED_OUT 5 #define NIDS_EXITING 6 2.3.2.2 重要结构体
tuple4:
- 9 -
tuple4数据结构是Libnids中最基本的一种数据结构,其定义如下: struct tuple4 {
u_short source; u_short dest; u_int saddr; u_int daddr; };
tuple4数据结构描述的是一个地址端口对,它表示发送方IP和端口以及接收方IP和端口,当它用于TCP连接时,其具体意义描述如下:
成员saddr表示一个TCP连接的一端IP地址,称为源IP地址;
成员daddr表示一个TCP连接的另一端IP地址,成为目的地址,注意此时的源和目的只是相对的;
成员source表示源IP地址的端口号; 成员dest表示目的IP地址的端口号。
tuple4数据结构包括描述TCP连接的四个重要参数信息:源IP地址、目的IP地址、源端口和目的端口。
half_stream: half_stream数据结构用来描述在TCP连接中一端的所有信息,可以使客户端,也可以是服务器端。
half_stream描述的是一个TCP连接的一端的信息。一个TCP连接有两端,任何一端可以用词数据结构来进行描述。其中与开发者密切相关的成员有以下几种,其他的可以都不用考虑。
成员state表示套接字的状态,也就是TCP连接状态。
成员collect可以用来表示有数据达到,此数据存放在data成员中,也可以表示不存储此数据到data中,此数据忽略。如果大于0就存储,否则就忽略。
成员collect_urg可以表示是否有紧急数据到达,此数据存放在urgdata中,也可以表示不存储此数据到urgdata中,此数据忽略。如果大于0就存储,否则就忽略。
成员data用来存储正常接收到的数据。
成员offset表示存储在data中的数据的第一个字节的偏移量。
成员count表示从TCP连接开始已经存储到data中的数据的字节数。
- - 10
成员count_new表示有多少新的数据存储到data中,如果为0表示没有新的数据到达,。
成员urgdata用来存储紧急数据。
成员count_new_urg表示有新的紧急数据到达,如果为0表示没有新的紧急数据。
虽然数据结构half_stream的成员非常多,但需要关注的就这几个。其中成员state非常重要,它表示了当前的TCP连接状态,只有知道了TCP连接状态后,才能进行下一步的动作。成员data用来存储接收到的正常的网络数据信息,而urgdata用来存储接收到的紧急数据。判断是否有新的正常数据到达,是利用成员count_new来进行判断的,判断是否有新的紧急数据到达,是利用成员count_new_urg来进行判断的。如果count_new大于0,就表示有新的紧急数据到达,如果count_new_urg大于0,就表示有新的紧急数据到达。然后就可以输出新到达的数据内容,正常数据存储在data中,紧急数据存储在urgdata中。
tcp_stream:
tcp_stream数据结构描述的是一个TCP连接的所有信息。
2.3.3 LIBNIDS基本函数
(1) int nids_init(void);
函数返回值:函数调用成功就返回1,失败就返回0。
此函数的功能是对Libnids进行初始化,这是所有设计基于Libnids的程序最开始调用函数。它的主要内容包括打开网络接口、打开文件、编译过滤规则、设置过滤规则、判断网络链路层类型、惊醒必要的初始化工作。 (2) void nids_run(void);
函数无返回值。此功能是运行Libnids,进入循环捕获数据包状态。它实际上是调用Libpcap函数pcap_loop()来循环捕获数据包。
(3) void nids_register_tcp(void(*));
此函数是注册一个TCP连接的回调函数。回调函数的类型定义如下: Void tcp_callback(struct tcp_stream *ns, void ** param);
其中ns表示一个TCP连接的所有信息,它的类型是tcp_stream数据结构;参数param表示要传递的连接参数信息,可以指向一个TCP连接的私有数据。次回调函数接收的TCP数据放在half_stream的缓存中,应该马上
- - 11
取出来,一旦次回调函数返回,此数据缓存中的数据就不存在了。
2.3.4 LIBNIDS的使用
2.3.4.1 LIBNIDS安装
本文中的邮件监控子系统是在Windows平台下运行的,所以下面只介绍Windows平台下Libnids的安装。
在Windows平台下,Libnids的Windows版本是Libnids-win32,最新版本为1.19,其安装过程非常简单。
首先从网站上下载其开发包,名称为Libnids-W32-1.19.tar.gz。
然后用解压缩软件对开发包进行解压缩,存储在一个目录下面,如F:\\Libnids-1.19。打开此文件夹可以发现里面有很多文件。其中,子文件夹src下面是Libnids的源代码;doc下面是文档;samples下面是一些很好的参考例子;WIN32-Code下面是与Windows平台相关的源代码;WIN32-Include下面是Libnids开发包的包含的头文件,这个事开发者所要使用到的;WIN32-Libraries是Libnids开发包的静态链接库文件,也是开发者要用到的;WIN32-PRJ是Libnids开发包本书和参考例子的Visual C++项目文件。子文件夹WIN32-Include和WIN32-Libraries是开发者关心的,必须把他们的路径添加到Visual C++开发环境中,此时就可以使用Libnids来开发程序了[8]。
2.3.4.2 LIBNIDS运行框架
使用Libnids最重要的是编写捕获数据包的回调函数,编写完回调函数后经过Libnids的初始化,注册该回调函数,进入循环捕包状态。其运行框架如下:
void main() {
//准备工作
//Libnids初始化 if(!nids_init()) { exit(1); }
//注册分析SMTP协议的回调函数
- - 12
nids_register_tcp(smtp_protocol_callback); //进入循环捕获数据包的状态 nids_run(); }[8]
2.4 BASE64简介
邮件的发件人、收件人、抄送人、主题、内容和附件名中如果含有汉字,那么它们需要经过Base64编码后才进行传输。下面对Base64进行简单介绍。
Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的ASCII字符序列,常用在需用通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下。Base64并不是一种用于安全领域的加密解密算法(这类算法有DES等),尽管有时也听到使用Base64来加密解密的说法,但这里所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其变换是非常简单的,仅仅能够避免信息被直接识别。
Base64采用了一种很简单的编码转换:对于待编码数据,以3个字节为单位,依次取6位数据并在前面补上两个0形成新的8位编码,这样3个字节的输入会变成4个字节的输出,长度上增加了1/3。
上面的处理还不能保证得到的字符都是可见字符,为了达到此目的,Base64制定了一个编码表,进行统一的转换。码表的大小为64,这也是Base64名称的由来。
另外还有一点要注意的地方,前面提到编码是以3个字节为单位,当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用“=”占位,因此编码后输出的文本末尾可能会出现1至2个“=”。
2.5 本章小结
本章中介绍了SMTP协议和POP3协议的基本概念以及他们的原始命令字。在众多的网络安全开发包中,之所以选用LIBNIDS开发包,是因为它
- - 13
提供了TCP数据流的重组,免去了分解数据包以及对数据包重组的工作量,利用LIBNIDS可以直接获取到数据包中内容。本章对编程中用到的LIBNIDS的数据结构和函数进行了介绍,为后边章节奠定了基础。对于将二进制序列转换为可读的ASCII码的Base64编码,在本章中也进行了介绍,以后章节中需要用到Base64编码对含有汉字的邮件字段进行还原。
- 14
- 第3章 邮件监控子系统构成和框架
3.1 引言
邮件监控子系统是网络监控系统的一个子系统,它的目的是监控被监视的计算机收发邮件的内容,这些内容包括邮件的发件人、收件人、抄送人、主题、日期、内容和附件名称。邮件监控子系统是一个综合的系统,该系统由三个模块组成,它们分别是基于SMTP协议的邮件还原程序,基于POP3协议的邮件还原程序和在监视端进行监视的软件。它们的功能,以及它们之间的联系,会在本章中进行详细的介绍。
3.2 模块组成
作为网络监控系统的子系统,邮件监控也具有重要的意义,它监视了计算机中的文件通过邮件附件的形式向外发送的情况,不仅如此,它还记录了使用邮件客户端进行收发邮件的信息,并将收发到的邮件进行相关信息的提取,写入邮件日志文件。
邮件监控子系统基于SMTP协议邮件的还原程序基于POP3协议邮件的还原程序监视端软件
图3-1 邮件监控子系统的模块组成
邮件监控子系统是由多模块组成的系统,如图3-1所示,它的三个模块分别是基于SMTP协议的邮件还原程序,基于POP3协议的邮件还原程序和在监视端进行监视的软件。
它们之间是相互独立的,基于SMTP协议的邮件还原程序、基于POP3
- - 15
协议的邮件还原程序和监视端软件分别完成自己的分工。其中基于SMTP协议的邮件还原程序完成还原客户端发送的邮件的还原,把邮件的发件人、收件人、抄送人、主题、日期、内容和附件名称提取并写入日志文件;基于POP3协议的邮件还原程序完成客户端接收邮件的还原,把邮件的发件人、收件人、抄送人、主题、日期、内容和附件名称提取并写入日志文件;监视端软件主要完成在监视端查看被监视计算机中邮件日志的文件,它还具有添加被监视的计算机、删除被监视的计算机、刷新日志、保存日志的功能。
基于SMTP协议的邮件还原程序名称为“SMTPCap.exe”,它是使用VC++ 6.0编写的控制台程序,运行时隐藏了控制台,只能在进程列表中找到它的进程。它把邮件的发件人、收件人、抄送人、主题、日期、内容和附件名称提取并写入日志文件,它产生的日志文件的格式如图3-2所示。
图3-2 SMTPCap.exe产生日志文件的格式
基于POP3协议的邮件还原程序名称为“POP3Cap.exe”,它也是使用VC++ 6.0编写的控制台程序,运行时也隐藏了控制台,只能在进程列表中找到它的进程。它把邮件的发件人、收件人、抄送人、主题、日期、内容和附件名称提取并写入日志文件,它产生的日志文件的格式如图3-3所示。 监视端软件使用Microsoft Visual Studio 2008环境开发,使用C#编写。它的运行效果如图3-4所示。它主要有五个控件组成,包括显示邮件日志的webBrowser控件、显示被监视计算机列表的treeView控件、显示连接状态的label控件、菜单menu控件和计时器timer控件。其中的menu控件与菜单关联,实现相应的功能,timer控件用来计时刷新邮件日志。
显示被监视者列表的treeView控件在程序启动时动态加载数据库中的
- - 16
监视者数据而显示到控件中;显示邮件日志的webBrowser控件访问被监视计算机中的邮件日志文件达到监视效果;文件菜单中包括日志保存和退出菜单,管理菜单中有添加监视计算机和删除监视计算机啊菜单刷新菜单实现了监视列表和邮件日志的刷新功能,帮助中是版权信息。
图3-3 POP3Cap.exe产生日志文件的格式
图3-4 监视端软件设计界面
- - 17
3.3 运行框架
邮件监控子系统,它能够完成被监视计算机中邮件信息的提取还原,并能在监视端浏览被监视计算机中的邮件收发日志,工作在不同的计算机中,而且在监视端具有监视功能,在被监视端具有邮件还原的功能,它必然是一个多模块综合的系统。而且在监视端运行监视端软件,在被监视端运行邮件的还原程序。
图3-3是邮件监控子系统的运行框架。邮件监控子系统在监视端和被监视端运行不同的程序,它们共同组成邮件监控子系统。
SMTP协议邮件的还原程序被监视端运行POP3协议邮件的还原程序写入写入被监视机器中的日志文件读取监视端软件图3-3 邮件监控子系统运行框架
在被监视的计算机中运行基于SMTP协议的邮件还原程序SMTPCap.exe和基于POP3协议的邮件还原程序POP3Cap.exe,而在监视端只需要运行监视端软件Monitor.exe。当然,被监视的计算机如果有多个,那么,在每一个被监视的计算机中都要运行SMTPCap.exe和POP3Cap.exe。
基于SMTP协议邮件的还原程序SMTPCap.exe和基于POP3协议的邮件还原程序POP3Cap.exe运行在被监视的计算机上,当被监视计算机中有邮件发送和接收时,这两个程序捕获邮件的数据包,并提取邮件的发件人、收件人、抄送人、日期、主题、内容和附件名称,保存到被本地特定目录下的日志文件中(日志文件名为maillog.txt)。在监视端,运行监视端软件可以查看已经启动的被监视计算机中的日志文件,如果日志文件有更新,监视端软件也可以实现刷新浏览;如果被监视的计算机没有启动,那么会在邮件日志栏中显示指定的错误提示。这就是整个邮件监控子系统各个模块之间的
- - 18
关系,虽然它们相互独立,但它们通过日志文件产生联系。
3.4 本章小结
本章中介绍了邮件监控子系统的三个模块,它们的功能以及它们之间的关系。它们分别是基于SMTP协议邮件的还原程序SMTPCap.exe、基于POP3协议邮件的还原程序POP3Cap.exe和监视端软件Monitor.exe,这三部分组成了邮件监控子系统。其中SMTPCap.exe和POP3Cap.exe安装在被监视的计算机中,监视端软件Monitor.exe安装在监视计算机。
基于SMTP协议的邮件还原程序和基于POP3协议的邮件还原程序通过捕获客户端收发邮件的数据包并提取邮件的发件人、收件人、抄送人、主题、日期、内容和附件名称,将其写入到本地日志文件中,同时在监视端可以使用监视端软件浏览被监视计算机中的日志文件,实现监视收发邮件内容的功能。
- - 19
第4章 基于SMTP和POP3协议的邮件还原
4.1 引言
使用客户端软件进行发送和收取邮件的过程中使用的应用层协议是SMTP和POP3协议,在第二章中给出了SMTP和POP3协议的原始命令字,那么如何通过解析协议来分析邮件的详细信息的呢?基于SMTP和POP3协议的邮件的发件人、收件人、抄送人、日期、主题、内容和附件名称是如何还原的呢?邮件中的汉字是通过Base64编码[9],编码后的字符串是如何获取进而又是如何还原成为汉字的呢?本章中首先给出基于SMTP协议的邮件还原程序的总流程图,然后对上述提及的问题进行详细的介绍。
4.2 总流程
基于SMTP和POP3协议的邮件还原程序代码使用VC++控制台编写,它的主函数流程图如图4-1所示。
开始选择网卡nids初始化成功Y注册分析回调函数Nnids_run()循环捕包结束
图4-1邮件还原程序的主流程图
- - 20
当主函数开始运行的时候,首先手动选择网卡,因为LIBNIDS默认的是计算机中的虚拟网卡,然后初始化nids,如果初始化成功就开始注册SMTP或者POP3协议分析的回调函数并进入循环捕获数据包的状态,否则结束程序。其中最重要的是协议分析的回调函数。
SMTP协议分析的回调函数流程如图4-2所示。
开始事件处理打开文件server紧急数据Nclient紧急数据Nclient数据NY提取From,To,Cc,Subject,Date,Content,AttachmentYYYYNIDS_JUST_ESTNYNIDS_CLOSENYNIDS_RESETNNIDS_DATANDefaultYserver数据N关闭文件结束
图4-2 SMTP协议分析的回调函数流程图
POP3协议分析的回调函数流程如图4-3所示。
分析SMTP和POP3协议的回调函数首先打开日志文件maillog.txt,准备写入。然后进入switch-case进行协议的分析。
- - 21
NISD_JUST_EST表示客户端和服务器建立连接,在该case语句中,实现了记录邮件服务器的IP地址。
NIDS_CLOSE表示客户端与服务器连接正常关闭,在该case语句中,实现了记录客户端与服务器连接正常关闭的时间,以及把发送邮件或者接收邮件的操作写入日志文件。
NIDS_RESET表示客户端与服务器连接被非重置,在该case语句中,实现了记录客户端与服务器连接被重置的时间,以及把发送邮件失败或者接收邮件失败的信息写入日志文件。
NIDS_DATA表示客户端接收到新的数据,在该case语句中,实现了邮件的发件人、收件人、抄送人、日期、主题、内容和附件名称的还原。
开始事件处理打开文件NIDS_JUST_ESTNNIDS_CLOSENNIDS_RESETNYserver紧急数据NYYclient紧急数据NYYclient数据NYserver数据NY提取From,To,Cc,Date,Subject,Content,AttachmentYNIDS_DATANDefault关闭文件结束
图4-3 POP3协议分析的回调函数流程图
SMTP和POP3协议分析不同的是邮件中字段的提取是在不同的TCP连接端,SMTP协议中数据字段DATA的获取是在TCP连接的服务器端,而POP3协议中数据字段DATA的获取是在TCP连接的客户端[8]。
- - 22
4.3 具体实现
4.3.1 提取发件人
提取发件人的流程图如图4-4所示。
LIBNIDS捕获到的数据存放到了data中,使用char content[65535]来存放data中的拷贝,然后在content中寻找发件人的标识。
通过LIBNIDS抓取的邮件数据包的内容发件人字段如下,可以根据下面的字符串来分析如何提取发件人。
(1)没有姓名的发件人信息如下,此时发件人是hitgym@sina.com,发件人姓名为空:
From:
From: “yaming”
From: =?gb2312?B? 0cfD9w==?=
提取发件人信息需要选“From:”作为标识关键字,在content中寻找“From:”并返回它出现的位置,并把“From”(含有“From:”)以后的字符串拷贝到char content_temp[65535]中,然后判断“From”后的第三个字符(第一个字符是“:”,第二个是空格)是否是“=”,如果是,则读取“=?gb2312?B?”到“?=”之间的字符串,放到char gbstring[1000]中,然后进行Base64解码,把解码后的汉字写入日志文件,然后输出发件人的地址,因为地址结束符以“>”结束,所以当content_temp[j-1] == 62(“>”的Ascii码为62)时,停止写入日志文件;如果“From:”后不是“=”,说明发件人中不含有汉字,则可以直接输出“From:”和“>”之间的字符串,就是发件人了。
- - 23
开始N找到\Y拷贝到content_tempFrom:后是\Y截取\和\之间字符串NFrom:后的字符串写入日志文件Base64解码写入日志文件邮件地址写入日志文件结束
图4-4提取发件人流程图
4.3.2 提取收件人
提取收件人的流程图如图4-5所示。
- - 24
开始N找到\Y拷贝到content_tempTo:后是\Y截取\和\之间字符串NTo:后的字符串写入日志文件Base64解码写入日志文件邮件地址写入日志文件结束
图4-5 提取收件人流程图
收件人分为单个收件人和多个收件人的情况,其中又包括是否含有汉语名字和非汉语名字(即英文名字和无名字),下面对比不同的情况,并给出提取收件人的方法。
- - 25
(1)没有姓名的收件人信息如下,此时收件人是hitgym@sina.com,收件人姓名为空:
To:
To: “yaming”
To: =?gb2312?B? 0cfD9w==?=
To:
在content中寻找“To:”,找到后把“To:”(包括“To:”)后面的所有字符复制到content_temp中,然后判断“To:”后的第三个字符(第一个字符是“:”,第二个是空格)是否是“=”,如果是,则读取“=?gb2312?B?”到“?=”之间的字符串,放到char gbstring[1000]中,然后进行Base64解码,把解码后的汉字(即收件人姓名)写入日志文件,然后输出收件人的地址,因为地址结束符以“>\\r\\n”结束,所以判断收件人结束条件为:content_temp[j-1]==62 && content_temp[j]==13 && content_temp[j+1]==10,其中62是“>”的ASCII码,13是“\\r”的ASCII码,10是“\\n”的ASCII码;如果“To:”后不是“=”,说明收件人中不含有汉字,则可以直接输出“To:”和“>\\r\\n”之间的字符串,就是收件人地址了。
4.3.3 提取抄送人
提取抄送人流程图如图4-6所示。
SMTP和POP3协议的邮件抄送人的格式同收件人的格式完全相同,也分为如下几种情况:
- - 26
(1)没有姓名的抄送人信息如下,此时抄送人是hitgym@sina.com,抄送人姓名为空:
Cc:
开始N找到\Y拷贝到content_tempCc:后是\Y截取\和\之间字符串NCc后的字符串写入日志文件Base64解码写入日志文件邮件地址写入日志文件结束
图4-6 提取抄送人流程图
(2)含有英文的抄送人信息如下,此时抄送人是hitgym@sina.com,抄送人姓名是“yaming”:
Cc: “yaming”
- - 27
(3)含有汉字的抄送人信息如下,此时抄送人是hitgym@sina.com,收抄送的姓名是“亚明”:
Cc: =?gb2312?B? 0cfD9w==?=
Cc:
提取抄送人信息也同提取收件人信息类似,在content中寻找“Cc:”,找到后把“Cc:”(包括“Cc:”)后面的所有字符复制到content_temp中,然后判断“Cc:”后的第三个字符(第一个字符是“:”,第二个是空格)是否是“=”,如果是,则读取“=?gb2312?B?”到“?=”之间的字符串,放到char gbstring[1000]中,然后进行Base64解码,把解码后的汉字(即收件人姓名)写入日志文件,然后输出抄送人的地址,因为地址结束符以“>\\r\\n”结束,所以判断抄送人结束条件为:content_temp[j-1]==62 && content_temp[j]==13 && content_temp[j+1]==10,其中62是“>”的ASCII码,13是“\\r”的ASCII码,10是“\\n”的ASCII码;如果“To:”后不是“=”,说明抄送人中不含有汉字,则可以直接输出“Cc:”和“>\\r\\n”之间的字符串,就是收件人地址了。
4.3.4 提取主题
SMTP和POP3协议的邮件提取主题字段的流程图如图4-7所示。
主题中如果只有英文或数字,则以明文的形式传输,如果含有汉字,会先经过Base64编码后传输,具体如下两种情况:
(1)只有英文或者数字的情况下,截获的邮件数据包内容中的部分字符串如下,邮件的主题是“test”:
Subject: test
(2)含有汉字的情况下,截获的邮件数据包内容中的主题部分字符串如下,邮件的主题是“测试”,其中“suLK1A==”是“测试”经Base64编码后的字符串:
Subject: =?gb2312?B? suLK1A==?= 判断邮件的主题是否经过了Base64编码,就看“Subject: ”后是不是“=”,如果是“=”,则是经Base64编码后的字符串,否则就是英文或者数
- - 28
字,那样直接输出“Subject: ”之后,“\\r\\n”之前的字符串就可以提取到邮件的主题。
开始N找到\Y拷贝到content_temp\后是\NSubject:后的字符串写入日志文件Y截取\和\之间字符串Base64解码写入日志文件邮件主题写入日志文件结束
图4-7 SMTP协议邮件主题提取流程图
提取含有汉字的邮件主题首先在content中找到“Subject:”字符串,然后将包含“Subject:”在内的其后全部字符拷贝到content_temp中,判读
- - 29
content_temp[9]是否等于“61”(61是“=”的ASCII码值)。如果为“=”,则从content_temp[20](因为“Subject: =?bg2312?B?”占了20个字符)开始截取字符,直到“?=”结束,把截取的字符串经过Base64解码,就可以得到邮件的主题,并把它写到日志文件中。
4.3.5 提取日期
开始N找到\Y拷贝到content_temp截取\和\之间字符串把日期写入日志文件结束
图4-8 件提取日期流程图
提取邮件日期的流程图如图4-8所示。
SMTP和POP3协议邮件中日期的格式很固定,例如: Date: Tue, 19 May 2009 10:17:14 +0800
只要在content中找到“Date:”,直接把“Date:”以及其后,“\\r\\n”之前的字符截取,就是邮件的发送日期。找到“Date:”后,char *pdate指针
- - 30
会指向“Date:”所在的位置,把它和它之后的字符串拷贝到content_temp中,使用while循环便可实现日期的提取,while的条件是while(!(content_temp[i] == 13 && content_temp[i+1] == 10))。
4.3.6 提取内容
开始N找到\text/plain;\和\Y拷贝到content_gbN找到\拷贝到content_temp\后是\N截取\和\之间字符串Y邮件内容为空Base64解码写入日志文件结束
- - 31
图4-9 SMTP协议邮件内容提取流程图
SMTP和POP3协议邮件内容提取的流程图如图4-9所示。
SMTP和POP3发送的邮件的内容可以是空,也可以非空。不论邮件的内容是汉字,英文或者数字,它都会经过Base64编码。当邮件内容为空时,邮件内容的格式如下:
------=_NextPart_000_0067_01C9E5C7.C18B3C30 Content-Type: text/plain; .charset=\Content-Transfer-Encoding: base64
------=_NextPart_000_0067_01C9E5C7.C18B3C30 Content-Type: text/html; .charset=\
Content-Transfer-Encoding: base64
PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu
dD0idGV4dC9odG1sOyBjaGFyc2V0PWdiMjMxMiI+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4w
MC4yOTAwLjM1MjciIG5hbWU9R0VORVJBVE9SPg0KPFNUWUxFPjwvU1RZTEU+DQo8L0hFQUQ+DQo8
Qk9EWSBiZ0NvbG9yPSNmZmZmZmY+DQo8RElWPiZuYnNwOzwvRElWPjwvQk9EWT48L0hUTUw+DQo=
------=_NextPart_000_0067_01C9E5C7.C18B3C30-- .
可以看到邮件的内容有两种形式,一类是text/plain形式,即纯文本形式;一类是text/html形式,即网页形式。邮件内容结束符是“\\r\\n\\r\\n.”。本
- - 32
研究中,只需要知道邮件的纯文本格式的内容即可。不需要对邮件内容的格式进行还原。本文只解决了邮件内容少量的情况,“少量”是指邮件的内容在第一个数据包中就全部封装完毕了。当邮件的内容需要多个数据包进行封装而发送的时候,不能对邮件内容还原。
提取邮件内容的方法是在content中查找“Content-Type: text/plain;”,如果在邮件正式数据的数据包中找到了该字符串,则说明接下来就是邮件的内容了,再定位到“Base64”,如果“Base64\\r\\n\\r\\n”后是“\\r\\n”,说明邮件内容为空,否则,就把“Base64\\r\\n\\r\\n”和“\\r\\n------=”之间的字符放到char gbstring[1600]中,并进行Base64解码,解码后的就是邮件的内容了。
4.3.7 提取附件名
SMTP协议邮件提取附件名称的流程图如图4-10所示。
SMTP和POP3协议邮件的附件名可以是英文或者数字,也可以是汉字。和其它一样,含有汉字时,要经过Base64编码。下面对比不需要Base64编码和经过Base64编码的两种情况。
(1)附件名称为“fujian.txt”的情况:
------=_NextPart_000_003A_01C9CE2B.B44CD6E0
Content-Type: text/plain; .name=\
Content-Transfer-Encoding: 7bit Content-Disposition: attachment; .filename=\
(附件内容)
------=_NextPart_000_003A_01C9CE2B.B44CD6E0-- .
(2)附件名称为“附件.txt”的情况:
------=_NextPart_000_0007_01C9D86A.FB2097C0 Content-Type: text/plain;
.name=\
- - 33
Content-Transfer-Encoding: base64 Content-Disposition: attachment;
.filename=\
(附件内容)
------=_NextPart_000_0007_01C9D86A.FB2097C0--
- - 34
开始N找到\attachment\YN找到\Y找到\N\与\字符串写入日志拷贝到content_temp截取\和\之间字符串Base64解码写入日志文件结束
图4-10提取附件名流程图
这两类的相同点都有“Content-Disposition: attachment”,这个字符串可以用来标识邮件有附件。在content中寻找“Content-Disposition: attachment”,如果找到说明这就是邮件的附件了,然后定位到“filename=”,判断其后如果有“=?gb2312?B?”,则说明是经Base64编码了,需要截取“=?gb2312?B?”到“?=”之间的字符,再经Base64解码,得到邮件的附件名称。如果没有找到“=?gb2312?B?”说明是英文或者数字名称,直接把“filename=”之后,“\\r\\n”之前的字符串写入日志文件,便是
- - 35
邮件附件的名称了。
4.4 邮件还原中的问题及解决办法
(1)汉字还原的问题:邮件的发件人、收件人、抄送人、主题、内容和附件名如果含有汉字,如何将其中的汉字提出出来?如何确定汉字的开始和结束为止。它们是通过什么编码的,要怎么才能还原?
解决办法:经过查找资料,发现邮件的发件人、收件人、抄送人、主题、内容和附件中的汉字是经过Base64编码的。知道了这一点后,需要把经Base64编码后的字符准确找出,然后进行Base64解码。除了邮件内容的格式外,其它需要提取的信息中的格式均为:“=?gb2312?B?”+“Base64编码后的字符串”+“?=”。所以把“=?gb2312?B?”与“?=”之间的字符串使用Base64解码,就可以得到原汉字了。邮件的内容比较特殊,内容不论是英文、数字还是汉字,其都会使用Base64编码传输,因为其格式如下:
------=_NextPart_000_0067_01C9E5C7.C18B3C30 Content-Type: text/plain; .charset=\
Content-Transfer-Encoding: base64
(内容)
------=_NextPart_000_0067_01C9E5C7.C18B3C30
经Base64编码后的内容的字符串在“base64\\r\\n\\r\\n”与“\\r\\n------=”之间,准确获取了这段字符串,经Base64解码后便还原了邮件内容。
(2)多收件人的问题:当邮件中含有多个收件人或者多个抄送人时,按照原来的提取收件人的方法,只能提取出第一个收件人或者抄送人的地址,如何才能把全部收件人或抄送人全部提取出来呢?
解决办法:多个地址之间是使用“,\\r\\n.”隔开的,例如: To:
.
原方法当读到“>”符号时便判断地址结束了,如果“>”后是“,”时,显然邮件的收件人的全部信息还没结束,把判断条件改为当读到“>\\r\\n”时结束。这样便把多个收件人全部提取出来了。提取多个抄送人的方法也通提取多个收件人的方法相同。
- - 36
4.5 本章小结
本章中对基于SMTP协议和POP3协议的邮件如何进行关键信息还原做了详细的介绍。给出了协议分析程序的总流程图,以及协议分析回调函数的流程图,提取发件人、收件人、抄送人、主题、日期、内容和附件名的流程图,并对他们进行了比较详细的分析。
在本章的最后,提到了邮件还原过程中遇到的几个棘手的问题,以及相应的解决办法。
- - 37
第5章 监视端的实现
5.1 引言
邮件监控子系统的构成中不仅要有在被监视计算机中的邮件还原程序,还应该有监视端软件。所谓的监视端软件,就是在监视者的计算机中安装,用来查看被监视计算机中邮件收发日志文件的软件。作为邮件监控子系统的一个构成部分,本章中将对其进行详细介绍,包括框架组成和各功能的具体实现。
5.2 监视端框架
监视端的框架组成如图5-1所示,它的功能有:浏览被监视者计算机中的邮件日志文件,浏览日志文件的刷新,添加被监视的计算机,删除被监视的计算机,邮件日志文件的保存。
监视端软件浏览日志日志刷新添加监视计算机删除监视计算机日志保存
图5-1 监视端软件功能图
监视端软件界面设计如图5-2所示,显示被监视者列表的是treeView控件,它在程序启动时动态加载数据库中的监视者数据而显示到控件中;显示邮件日志的控件是webBrowser控件,它访问被监视计算机中的邮件日志文件达到监视效果;文件菜单中包括日志保存和退出菜单,管理菜单中有添加监视计算机和删除监视计算机啊菜单刷新菜单实现了监视列表和邮件日志的刷新功能,帮助中是版权信息。
- - 38
图5-2 监视端软件界面设计图
5.3 具体实现
5.3.1 数据库
监视端软件使用Microsoft Visual Studio 2008编写,使用的语言是C#,数据库选择了Microsoft Access。被监视的计算机的信息保存在数据库表USERINF中。USERINF结构如表5-1所示。
表5-1 数据库USERINF表 字段名称 数据类型 长度(字节) IP 16 文本 USERNAME 50 文本
- - 39
IP表示被监视计算机的IP地址,USRENAME表示被监视计算机的使用者姓名。
5.3.2 IIS设置
监控端软件的日志浏览功能是使用webBrowser控件实现的,前提是要在被监视计算机上安装IIS(Internet Information Server,互联网信息服务),为了防止局域网内恶意用户的访问,安装完毕后设置默认网站的端口为:5566。如图5-3所示。
图5-3 修改后的默认网站属性
5.3.3 日志浏览、刷新和保存
日志浏览的流程图如图5-4所示。
- - 40
开始分离选中结点的IP地址isconnected(ip)?YwebBrowser1.Navigate(myurl)N更新LabelwebBrowser1.Navigate(errurl)更新Label结束
图5-4 日志浏览的流程图
当选中treeView控件的某一个结点时,会调用treeView1_AfterSelect()函数,在该函数中首先获取选中的结点的名字,其形式是“IP”+“空格”+“姓名”,将IP和姓名分离开,调用isconnected(string ipaddr)判断该IP地址的计算机是否启动,如果启动则把webBrowser1转向地址myurl=\+ ip + \,然后更新Label为“客户端已连接!”,“浏览XX的数据”;否则,更新Label为“客户端尚未连接!”,“XX没有连接网络.”,然后转向本机的help.html网页。 日志刷新功能是使用timer控件实现的,把timer的Interval属性设置为10000,即表示事件的频率为10秒。在timer1_Tick(object sender, EventArgs e)函数中添加代码“webBrowser1.Refresh();”便实现了每隔10秒日志内容自动刷新的功能。
日志的保存功能是调用webBrowser控件的ShowSaveAsDialog()方法实现的。不需要自己编写额外的代码。
- - 41
5.3.4 添加和删除监视计算机
添加监视计算机的界面如图5-5所示。
图5-5 添加监视计算机界面
当单击“添加”按钮后,把IP和姓名作为一条新纪录插入到USERINF表中,如果记录添加成功,操作状态中显示“添加成功!”的提示,否则提示“操作失败!”。
删除监视计算机的界面如图5-6所示。
图5-6 删除监视计算机界面
当选中一个结点后,分离出选中结点名字中的“IP”,当单击“删除”按钮后,在USERINF表中删除该条记录,如果删除成功,在操作状态中提示“操作成功!”,然后移除该结点;否则提示“操作失败!”。
- - 42
5.4 软件编写中的问题及解决办法
(1)为什么没有选用C/S模型的监视软件?起初设想的就是客户端/服务器模型的监视软件,当监视端需要查看被监视者的日志文件时,被监视者就开始向监视端传输日志文件。这时被监视端作为服务器,监视端作为客户端请求连接。而且如果采用了C/S模型,需要编写两端的软件,也由于时间的限制和自己能力的有限,一直试图寻找另一个方法来实现监视功能。终于,想到了IIS,利用它便可以很轻松的实现,不用关心它是如何传输文件,也不用关心监视端和被监视端如何连接。只需要在计算机中安装IIS,更改HTTP端口号,便实现了监视功能。
(2)刷新被监视计算机列表的问题:当添加或者删除被监视计算机后,主界面的被监视计算机列表不能实现自动刷新。解决办法是添加了一个“刷新”菜单,当单击该菜单后,实现刷新列表的功能,原理是删除treeView控件的所有节点,从数据库中重新读取数据。
5.5 本章小结
本章中介绍了监视端软件的功能模块和个功能的实现方法。监视端软件具有添加被监视计算机、删除被监视计算机、查看被监视计算机的日志文件的功能。最基本的功能是查看被监视者的日志文件,需要在被监视计算机中安装互联网信息服务,即IIS。编写软件使用的是Microsoft Visual Studio 2008,使用开发环境提供的webBrowser控件和treeView控件便可以轻松实现了上述功能。
- - 43
第6章 综合测试
6.1 引言
上述章节中完成了基于SMTP协议邮件的还原、基于POP3协议邮件的还原和监视端软件。邮件监控子系统是由这三个模块组成,它们最终要最为一个整体运行。本章中将对它们整合,并进行测试,并对一些出现问题的地方进行分析。
6.2 准备工作
图6-1 Outlook Express配置
- - 44
配置Outlook Express[11],账户的姓名为“yaming”,电子邮件地址为“hitgym@sina.com”,服务器配置如图6-1所示。
将基于SMTP协议邮件的还原程序SMTPCap.exe,基于POP3协议邮件的还原程序POP3Cap.exe拷贝到网站的目录中,因为安装好IIS,并没有修改网站的默认目录,所以它们的路径为:C:\\Inetpub\\wwwroot。
运行SMTPCap.exe和POP3.exe,在监视端运行监视端软件Monitor.exe。
6.3 测试
6.3.1 收件人、抄送人、主题、内容是英文情况
邮件的发件人是“hitgym@sina.com”,收件人是“hitgym@sina.com”,抄送人是“hitgym@foxmail.com”,主题是“test”,内容是“test.”。
发送完毕后,再接收该邮件,邮件的还原效果如图6-2所示。
图6-2 邮件还原后效果
- - 45
正在阅读:
邮件监控SMTP POP3系统设计与实现(含源文件)04-13
红庆梁110kV铁塔基础施工方案10-23
体育理论考试-羽毛球理论考试04-28
临床实验室管理中存在的问题与对策05-31
2001年中央、国家公务员录用考试《公共基础知识》试题及答案11-14
Java复习参考题03-06
漫步寻春作文500字07-09
EPZ3047F-122中文资料08-10
财务管理试卷10-30
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 源文件
- 监控
- 邮件
- 实现
- 设计
- 系统
- SMTP
- POP3
- 高考作文:怀念蒲扇轻摇的时光
- 2011-2012学年度综合测评 先进集体和先进个人名单
- 高考语文语言文字运用新题训练100套(附答案详解)
- 合肥市《业主大会业主委员会工作指导文书》(示范文本) -
- 党员政治生日心得体会4篇
- 通风、防排烟风管附件技术标准HBJZ-005
- 红楼梦研究复习题
- 2010-2011先进集体、先进个人公示通知
- 某银行PBOC2.0改造POS部分需求书 - 融金教育
- 基坑支护换撑及内支撑梁拆除施工方案
- 房价明年可能见底
- 县委书记工作讲坛领导讲话6篇和市区县委书记发言54篇
- 全新版大学英语快速阅读第三册课文
- 开题报告模板
- 很全abap入门知识
- SQLserverke课程设计《学生选课系统》包含源程序
- 关于金融行业劳动关系发展的几点思考
- 八年级组会议纪要
- 第9章《电磁感应》章末检测题A卷
- 2007年专升本《综合英语》考纲、样卷及答案(襄樊学院)