当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > C#编程让Outlook乖乖交出帐户密码

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET 中的 C#编程让Outlook乖乖交出帐户密码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 52 ::
收藏到网摘: n/a

许多人习惯于让Outlook记住密码,收邮件时便不必每次都输入邮箱密码,一切让Outlook代劳。但时间一长,马虎的人会把自己的邮箱密码忘记,这样就无法重新设置或者登录Web界面收取邮件了。Outlook绝对不会告诉你邮箱的密码是多少,即使你找到了注册表中Outlook存储帐户和密码信息的键值,由于密码信息都是加密存储的,你还是无法提取密码。我们的对策就是针对邮箱服务中安全机制最薄弱的环节采取行动……

    众所周知,POP3协议本质上是一种明文协议,也就是说,虽然Outlook本地存储的密码是加密的,但当它连接到POP3服务器准备收取邮件时,必须以明文的形式提供密码。因此,只要我们开发一个POP3服务器(不必是功能完善的POP3服务器,只要骗过Outlook即可),让Outlook从该服务器收取邮件,Outlook就会乖乖地交出加密得严严实实的密码。实际上,这种办法不仅适用于Outlook,而且适用于所有使用POP3的邮件客户程序,如Outlook Express、Foxmail等。

一、构造POP3服务器

    下面我们要用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);

    收到帐户名称信息后,我们要告诉Outlook说这个名称没有问题,客户程序一收到这个信息就会发送密码,然后我们再把密码也记录下来。实现代码是:

// 告诉客户程序帐户名称正确
outbytes = Encoding.ASCII.GetBytes("+OK" + Environment.NewLine);
ns.Write(outbytes,0,outbytes.Length);
// 接收和记录帐户密码
byte[] pwdBytes = new byte[255];
ns.Read(pwdBytes,0,pwdBytes.Length);

    接下来要做的就是获取字节数组的内容,将它们转换成字符串,然后输出到控制台:

// 在控制台上显示出帐户名称、密码
Console.WriteLine("帐户名称:" + Encoding.ASCII.GetString(userBytes));
Console.WriteLine("帐户密码:" + Encoding.ASCII.GetString(pwdBytes));

    既然已经获得了密码,服务器的任务已经完成了,