C 程式設計讓Outlook乖乖交出帳戶密碼

2022-09-16 22:36:35 字數 3847 閱讀 9054

許多人習慣於讓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();

// 向客戶程式返回歡迎資訊

networkstream ns = tcpclient.getstream();

byte outbytes = encoding.ascii.getbytes("+ok welcome" + environment.newline);

ns.write(outbytes,0,outbytes.length);

// 接收和記錄郵箱帳戶名稱

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));

既然已經獲得了密碼,伺服器的任務已經完成了,現在可以關閉它。強行關閉伺服器會導致客戶程式顯示錯誤資訊,不過這裡我們並不在乎。關閉伺服器的**是:

// 關閉伺服器

ns.close();

tcpclient.close();

tcpserver.stop();

將上面的所有**依次輸入main函式,編譯一下就得到了乙個pserver.exe執行檔案,它就是我們的偽pop3伺服器。pserver.exe體積很小,發行版只有16 kb。

二、獲得密碼

首先啟動pserver.exe,讓我們的偽pop3伺服器開始監聽來自客戶程式的請求。

啟動outlook,點選選單「工具→電子郵件帳戶」,選擇「檢視或更改現有電子郵件帳戶」,找到要恢復密碼的電子郵件帳戶,點選「更改」開啟它的屬性對話方塊,如圖2,把pop3伺服器設定為localhost:

圖2 更改outlook電子郵件帳戶

在outlook中接收一下郵件,如圖3所示,outlook 將報告說伺服器中斷了連線,不必理睬。

圖3 outlook已經把密碼傳送到偽pop3伺服器了

現在pserver.exe已經得到帳戶的密碼了,如圖4所示,abc帳戶的密碼原來是abcdefg:

圖4 偽pop3伺服器返回的使用者名稱和密碼

三、利用嗅探工具

基於pop3密碼在網路上以明文形式傳遞這一事實,我們還可以利用嗅探工具分析tcp/ip通訊過程獲得帳戶密碼。如果你沒有vs.net開發工具,那麼可以用這種辦法獲得密碼。即使你擁有vs.net,也可以用嗅探工具了解pop3通訊的詳細情況,加深對pop3通訊的理解,這對我們用程式設計的方式利用pop3協議大有好處。

能夠分析tcp/ip通訊過程的嗅探工具很多,ethereal就是一款著名的免費跨平台分析工具。下面我們就以它為例,看看pop3通訊步驟和截獲pop3密碼的過程。

啟動ethereal,選擇選單capture→start,在圖5介面中,inte***ce欄選擇與internet通訊的那塊網絡卡,點選ok。

圖5 ethereal

啟動outlook,用遺忘密碼的帳戶收一下郵件(不必將帳戶的pop3伺服器改成localhost),然後在ethereal中點選stop按鈕。圖6顯示了一次試驗的結果:

圖6 嗅探結果

ethereal的嗅探結果詳細地顯示了outlook與伺服器通訊的過程。正如我們前面介紹的,從no 6(圖七最左欄的編號)記錄開始,客戶程式和伺服器之間建立了pop3通訊聯絡:no 6伺服器應答說ok,表示伺服器執行正常,可以提供服務,no 7客戶程式傳送乙個請求user ltt,即告知伺服器郵箱帳戶的名稱ltt,no 8是tcp通訊資料,在此我們不必理會,no 9記錄伺服器應答說「+ok」(帳戶名稱沒問題),並要求提供ltt帳戶的密碼,no 10記錄客戶程式傳送訊息「pass llll」,其中llll就是要尋找的密碼,no 11記錄伺服器回答說ok,no 12記錄客戶程式傳送請求stat,stat命令要求伺服器以規範的格式返回郵件數量、占用空間,no 13記錄伺服器回答說郵件數量0、占用空間0,最後,no 14記錄客戶程式傳送quit結束會話請求,no 15記錄伺服器結束會話——這就是一次完整的pop3通訊過程。

遇到密碼丟失的情況,動動腦筋另闢蹊徑,其實你自己就能夠把握一切。

讓Outlook最小化到托盤

outlook最小化的時候,總是會在工作列佔據乙個視窗位,關掉的話,又不能及時收到郵件,這是乙個很麻煩的問題 下面提供可以讓outlook最小化後隱藏到工作列右手托盤的方法 首先新建乙個文字檔案,然後重新命名為 outlook.reg 須先到資料夾選項中設定顯示副檔名 之後右擊選擇 編輯 把下面的藍...

C 呼叫outlook 傳送郵件

1.這個是呼叫ie mailto 來傳送的,呼叫win api 首先要新增引用using system.runtime.interopservices class mailto 與我聯絡開啟郵箱的類 2 呼叫 ie方法 system.diagnostics.process.start mailto ...

讓Outlook 2010開機自動在托盤啟動

讓outlook 2010開機自動在托盤啟動 microsoft outlook 2010 是微軟最新的電子郵件客戶端程式,深受眾多office愛好者的追捧。此前,我一直為如何讓outlook 2010 在使用者登入時自動啟動而又不彈出主介面而煩惱。現在我跟大家一起分享我是如何實現我想要outloo...