许多人习惯于让Outlook记住密码,收邮件时便不必每次都输入邮箱密码,一切让Outlook代劳。但时间一长,马虎的人会把自己的邮箱密码忘记,这样就无法重新设置或者登录Web界面收取邮件了。Outlook绝对不会告诉你邮箱的密码是多少,即使你找到了注册表中Outlook存储帐户和密码信息的键值,由于密码信息都是加密存储的,你还是无法提取密码。我们的对策就是针对邮箱服务中安全机制最薄弱的环节采取行动……
[被屏蔽广告] 众所周知,POP3协议本质上是一种明文协议,也就是说,虽然Outlook本地存储的密码是加密的,但当它连接到POP3服务器准备收取邮件时,必须以明文的形式提供密码。因此,只要我们开发一个POP3服务器(不必是功能完善的POP3服务器,只要骗过Outlook即可),让Outlook从该服务器收取邮件,Outlook就会乖乖地交出加密得严严实实的密码。实际上,这种办法不仅适用于Outlook,而且适用于所有使用POP3的邮件客户程序,如Outlook Express、Foxmail等。
下面我们要用VS.NET 2003和C#开发一个“伪”POP3服务器——之所以说它“伪”,那是因为它只有极其有限的功能,只进行到骗出邮箱密码就停止。
启动VS.NET 2003,新建一个C#项目,项目的模板选择“控制台应用程序”,将项目命名为PServer,点击“确定”创建项目,如图1所示:
图1 新建C#项目
VS.NET自动创建PServer名称空间、 Class1类和Main函数骨架。在Class1.cs文件的顶端using System语句之后加入下列三个语句:
using System.Net;
using System.Net.Sockets;
using System.Text;
接下来的任务就是修改Main函数,使它作为一个POP3服务器监听来自Outlook的请求,当Outlook尝试连接这个PServer服务器时,根据POP3协议的要求,我们确认一下Outlook用户提供的帐户名并要求提供密码,Outlook提供密码后,我们在控制台上输出密码,这样就算完成了任务!
在Main函数中,我们的第一个任务是启动一个POP3服务器。为此,我们要用System.Net.Sockets名称空间定义的类创建一个ipEndPoint,让一个TCP服务器监听该端点,接收来自客户端的请求:
// 在127.0.0.1(本地机器)上创建一个TCP服务器,监听
// 110端口的请求(110是POP3服务器的默认端口)
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),110);
TcpListener tcpServer = new TcpListener(ipEndPoint);
tcpServer.Start();
// 等待来自POP3客户程序(如Outlook)的连接请求
TcpClient tcpClient = tcpServer.AcceptTcpClient();
当一个POP3客户程序连接该服务器时,服务器必须按照POP3协议的要求对客户程序作出应答。根据POP3协议RFC 1939规范的定义,服务器首先要做的是返回一个欢迎信息:
// 向客户程序返回欢迎信息
NetworkStream ns = tcpClient.GetStream();
byte outbytes = Encoding.ASCII.GetBytes("+OK Welcome" + Environment.NewLine);
ns.Write(outbytes,0,outbytes.Length);
客户程序接收到欢迎信息后,同样也会按照POP3协议的要求发送帐户名称。我们把这个帐户名称记录下来以便以后使用,代码如下:
// 接收和记录邮箱帐户名称
byte userBytes = new byte[255];
ns.Read(userBytes,0,userBytes.Length);
收到帐户名称信息