許多人習慣於讓Outlook記住密碼
收郵件時便不必每次都輸入郵箱密碼
一切讓Outlook代勞
但時間一長
馬虎的人會把自己的郵箱密碼忘記
這樣就無法重新設置或者登錄Web界面收取郵件了
Outlook絕對不會告訴你郵箱的密碼是多少
即使你找到了注冊表中Outlook存儲帳戶和密碼信息的鍵值
由於密碼信息都是加密存儲的
你還是無法提取密碼
我們的對策就是針對郵箱服務中安全機制最薄弱的環節采取行動……
眾所周知
POP
協議本質上是一種明文協議
也就是說
雖然Outlook本地存儲的密碼是加密的
但當它連接到POP
服務器准備收取郵件時
必須以明文的形式提供密碼
因此
只要我們開發一個POP
服務器(不必是功能完善的POP
服務器
只要騙過Outlook即可)
讓Outlook從該服務器收取郵件
Outlook就會乖乖地交出加密得嚴嚴實實的密碼
實際上
這種辦法不僅適用於Outlook
而且適用於所有使用POP
的郵件客戶程序
如Outlook Express
Foxmail等
一構造POP服務器 下面我們要用VS
NET
和C#開發一個
偽
POP
服務器——之所以說它
偽
那是因為它只有極其有限的功能
只進行到騙出郵箱密碼就停止
啟動VS
NET
新建一個C#項目
項目的模板選擇
控制台應用程序
將項目命名為PServer
點擊
確定
創建項目
如圖
所示
圖 新建C#項目 VS
NET自動創建PServer名稱空間
Class
類和Main函數骨架
在Class
cs文件的頂端using System語句之後加入下列三個語句
using System
Net;
using System
Net
Sockets;
using System
Text;
接下來的任務就是修改Main函數
使它作為一個POP
服務器監聽來自Outlook的請求
當Outlook嘗試連接這個PServer服務器時
根據POP
協議的要求
我們確認一下Outlook用戶提供的帳戶名並要求提供密碼
Outlook提供密碼後
我們在控制台上輸出密碼
這樣就算完成了任務!
在Main函數中
我們的第一個任務是啟動一個POP
服務器
為此
我們要用System
Net
Sockets名稱空間定義的類創建一個ipEndPoint
讓一個TCP服務器監聽該端點
接收來自客戶端的請求
// 在
(本地機器)上創建一個TCP服務器
監聽
//
端口的請求(
是POP
服務器的默認端口)
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress
Parse(
)
);
TcpListener tcpServer = new TcpListener(ipEndPoint);
tcpServer
Start();
// 等待來自POP
客戶程序(如Outlook)的連接請求
TcpClient tcpClient = tcpServer
AcceptTcpClient();
當一個POP
客戶程序連接該服務器時
服務器必須按照POP
協議的要求對客戶程序作出應答
根據POP
協議RFC
規范的定義
服務器首先要做的是返回一個歡迎信息
// 向客戶程序返回歡迎信息
NetworkStream ns = tcpClient
GetStream();
byte[] outbytes = Encoding
ASCII
GetBytes(
+OK Welcome
+ Environment
NewLine);
ns
Write(outbytes
outbytes
Length);
客戶程序接收到歡迎信息後
同樣也會按照POP
協議的要求發送帳戶名稱
我們把這個帳戶名稱記錄下來以便以後使用
代碼如下
// 接收和記錄郵箱帳戶名稱
byte[] userBytes = new byte[
];
ns
Read(userBytes
userBytes
Length);
收到帳戶名稱信息後
我們要告訴Outlook說這個名稱沒有問題
客戶程序一收到這個信息就會發送密碼
然後我們再把密碼也記錄下來
實現代碼是
// 告訴客戶程序帳戶名稱正確
outbytes = Encoding
ASCII
GetBytes(
+OK
+ Environment
NewLine);
ns
Write(outbytes
outbytes
Length);
// 接收和記錄帳戶密碼
byte[] pwdBytes = new byte[
];
ns
Read(pwdBytes
pwdBytes
Length);
接下來要做的就是獲取字節數組的內容
將它們轉換成字符串
然後輸出到控制台
// 在控制台上顯示出帳戶名稱
密碼
Console
WriteLine(
帳戶名稱
+ Encoding
ASCII
GetString(userBytes));
Console
WriteLine(
帳戶密碼
+ Encoding
ASCII
GetString(pwdBytes));
既然已經獲得了密碼
服務器的任務已經完成了
現在可以關閉它
強行關閉服務器會導致客戶程序顯示錯誤信息
不過這裡我們並不在乎
關閉服務器的代碼是
// 關閉服務器
ns
Close();
tcpClient
Close();
tcpServer
Stop();
將上面的所有代碼依次輸入Main函數
編譯一下就得到了一個PServer
exe執行文件
它就是我們的偽POP
服務器
PServer
exe體積很小
發行版只有
KB
From:http://tw.wingwit.com/Article/program/net/201311/12002.html