摘 要: 隨著互聯(lián)網(wǎng)的普及,SMTP/POP3協(xié)議傳輸方式下的郵件已成為最簡便、最經(jīng)濟的通信方式,但許多有害的郵件信息也隨之而來。針對這些問題,在VC開發(fā)環(huán)境下,研究并實現(xiàn)了基于Winpcap的郵件監(jiān)控及還原系統(tǒng)。該系統(tǒng)設(shè)計了多線程模塊,可以同時處理50個郵件及附件信息,并對網(wǎng)絡(luò)數(shù)據(jù)包的捕獲、過濾與重組、信頭解碼、附件處理、信體內(nèi)容提取等模塊進行了算法優(yōu)化。功能測試和驗證結(jié)果表明,該系統(tǒng)穩(wěn)定、可擴展,達到實時性要求。
關(guān)鍵詞: Winpcap;數(shù)據(jù)包捕獲;郵件重組;多線程;郵件解碼
當前流行的電子郵件收發(fā)主要有兩種方式:第一種是使用Fire-Fox、IE等瀏覽器軟件登錄ISP的Web站點;第二種是使用Foxmail、Outlook等郵件客戶端軟件連接郵件服務(wù)器,通過SMTP/POP3協(xié)議收發(fā)郵件。這里主要討論基于SMTP/POP3協(xié)議郵件信息的獲取與還原技術(shù)。實驗結(jié)果表明,本系統(tǒng)有效實現(xiàn)了郵件信息捕獲和信息還原等功能,具有較高的效率和較好的時實性。
1 網(wǎng)絡(luò)監(jiān)控相關(guān)理論基礎(chǔ)
1.1 Winpcap原理
Winpcap[1-3]為數(shù)據(jù)包捕獲提供了一套標準接口,它是由伯克利分組捕獲庫派生而來的分組捕獲庫,在Win32平臺上實現(xiàn)對底層包的捕獲,其體系結(jié)構(gòu)包括3個模塊:(1)NPF(內(nèi)核級的數(shù)據(jù)報過濾器)核心的包過濾驅(qū)動程序;(2)底層的動態(tài)連接庫Packet.dll(數(shù)據(jù)包低級驅(qū)動程序庫)為Win32平臺提供了一個公共的接口;(3)高層的獨立于操作系統(tǒng)的庫Wpcap.dll(數(shù)據(jù)包高級驅(qū)動程序庫)[4]。
1.2 網(wǎng)絡(luò)監(jiān)控及郵件信息獲取原理
監(jiān)控主體可以分為郵件服務(wù)器端監(jiān)控、郵件客戶端監(jiān)控和第三方網(wǎng)絡(luò)監(jiān)控。本文闡述的是基于第三方網(wǎng)絡(luò)監(jiān)控的郵件安全監(jiān)控系統(tǒng),即將網(wǎng)絡(luò)上的關(guān)于郵件協(xié)議的數(shù)據(jù)包進行截獲,并結(jié)合內(nèi)容檢測技術(shù)和協(xié)議分析技術(shù)對郵件進行有效監(jiān)聽。這種監(jiān)控方式允許在各個組織內(nèi)部靈活配置監(jiān)控規(guī)則,并且響應(yīng)迅速。
網(wǎng)卡具有4種工作模式:直接模式、多播傳送模式、廣播模式和混雜模式[5]。網(wǎng)卡的缺省工作模式包含廣播模式和直接模式,即它只接收廣播幀與發(fā)給對應(yīng)地址的幀。如果采用混雜模式,網(wǎng)卡將接收同一網(wǎng)絡(luò)內(nèi)所有主機所發(fā)送的數(shù)據(jù)包。
1.3 SMTP/POP3協(xié)議的郵件信息獲取
由于系統(tǒng)主要分析SMTP/POP3協(xié)議傳輸方式下的郵件信息獲取,因此主要針對SMTP協(xié)議、POP3協(xié)議網(wǎng)絡(luò)數(shù)據(jù)進行分析。根據(jù)協(xié)議特點只需要對感興趣的網(wǎng)絡(luò)連接進行數(shù)據(jù)重組,其他協(xié)議的網(wǎng)絡(luò)數(shù)據(jù)可以直接丟棄。所以只要獲取端口地址為25和110的數(shù)據(jù)包即可,如圖1所示。
2 監(jiān)控郵件及郵件信息還原的分析與設(shè)計
整個系統(tǒng)的設(shè)計可分為兩個部分:一個郵件監(jiān)控部分,計算機運行在Windows系統(tǒng)下,目的是截獲經(jīng)過網(wǎng)卡的郵件數(shù)據(jù)包;另一個是郵件解析和還原部分,主要目的是對SMTP/POP3文件進行解析,還原成原來的可讀郵件信息,并對還原后的文件進行閱讀查看、刪除等管理操作,系統(tǒng)的總體框架如圖2所示。系統(tǒng)由包捕獲功能模塊、IP協(xié)議數(shù)據(jù)解析模塊、TCP協(xié)議數(shù)據(jù)解析過濾模塊、郵件協(xié)議解析模塊、郵件解碼模塊、郵件保存模塊組成。
下面重點分析系統(tǒng)中郵件重組和解碼等關(guān)鍵問題和算法的設(shè)計。
2.1 SMTP/POP3協(xié)議通信方式
SMTP/POP3協(xié)議采用會話方式工作,通信雙方通過命令請求和命令響應(yīng)進行交互,完成郵件的發(fā)送或接收。提取基于SMTP/POP3協(xié)議傳輸?shù)泥]件信息關(guān)鍵在于郵件會話的識別。下面以POP3為例,說明交互過程[6]。
2.2 POP3/SMTP還原總流程圖及還原算法
基于POP3/SMTP協(xié)議的郵件信息還原涉及四方面的內(nèi)容:數(shù)據(jù)包保存、重要域值提取、郵件內(nèi)容的解析以及附件的解析還原。
下面主要介紹面向傳輸層的數(shù)據(jù)分析還原,總流程如圖3所示。
在對郵件協(xié)議交互過程有很深刻的認識后可對電子郵件數(shù)據(jù)包進行截獲。為了提高運行速度,防止丟包現(xiàn)象,提高還原文件效率,優(yōu)化程序,作者創(chuàng)建3個線程分別執(zhí)行任務(wù):
(1)主線程是Winpcap抓包,整個系統(tǒng)在貫徹主線程的基礎(chǔ)上對網(wǎng)絡(luò)層、傳輸層和應(yīng)用層進行了分析和研究;
(2)線程1是協(xié)議分析,網(wǎng)絡(luò)通信有很多協(xié)議,因此協(xié)議分析是關(guān)鍵,針對不同的協(xié)議有不同的分析方法,因此系統(tǒng)具有良好的可擴展性,可方便地添加對新的網(wǎng)絡(luò)協(xié)議的支持;
(3)線程2是對電子郵件數(shù)據(jù)包的解析并還原,因此當捕獲郵件文件數(shù)據(jù)包時,打開線程組2,可以同時循環(huán)接收和保存50個郵件,不過此時這些線程是休眠狀態(tài),可能客服端只是對SMTP/POP3服務(wù)器的一般交互過程,沒有郵件傳輸,因此要仔細觀察和分析整個郵件服務(wù)器交互過程,如果分析客戶端郵件發(fā)送動作時,觸發(fā)線程2進行郵件信息的重組、保存,直到完整地保存了整個郵件及附件后關(guān)閉線程。
此時作者設(shè)計了SMTP/POP3郵件信息重組子流程圖,如圖4所示。
郵件數(shù)據(jù)包重組的策略也是文件還原系統(tǒng)的核心,下面詳細說明捕獲和重組算法:
(1)根據(jù)SMTP/POP3命令的參數(shù),監(jiān)聽端口號25(或110)來分析服務(wù)器與客服端之間的交互過程;
(2)對經(jīng)過網(wǎng)卡數(shù)據(jù)包的命令進行字符串匹配,當匹配的字符串DATA(Data)成功時;客服端要向SMTP服務(wù)器發(fā)送郵件,創(chuàng)建文件名為EmailFile[file_num/50],這時打開可以同時處理50個郵件的線程2進行監(jiān)聽,跳至(4);
(3)當匹配的字符串RETR成功時,客服端要向POP3客戶端接收郵件,創(chuàng)建文件名為EmailFile1[file1_num/50],這時打開可以同時處理50個郵件的線程2進行監(jiān)聽,跳至(5);
(4)把SMTP數(shù)據(jù)包的當前序列碼為sequence和數(shù)據(jù)偏移量data_len保存,設(shè)置標記位STRAT=1下一個包的序列碼為next_seq_num[file_num/50]。其大小為:next_seq_num[file_num/50]=sequence+data_len;保存發(fā)送郵件;跳至(6);
(5)把當前POP3數(shù)據(jù)包的序列碼為sequence和數(shù)據(jù)偏移量data_len保存,設(shè)置標記位STRAT1=1下一個包的序列碼為next_seq_num[file1_num/50],其大小為:next_seq_
num[file1_num/50]=sequence+data_len;保存接收郵件,跳至(7);
(6)開始重組SMTP郵件數(shù)據(jù)包并把當前序列碼記為sequence和數(shù)據(jù)偏移量 data_len,上次一個包的序列碼為next_seq_num[i]。以大小為50的循環(huán)序列進行一一判斷:當滿足next_seq_num[i]==sequence,則為該文件EmailFile[file_num/50]的數(shù)據(jù),不等則丟棄,這樣的目的是為了在監(jiān)聽多郵件傳輸時確保不會導(dǎo)致捕獲的數(shù)據(jù)混亂,跳至(8);
(7)開始重組POP3郵件數(shù)據(jù)包并把當前序列碼即為sequence和數(shù)據(jù)偏移量 data_len,上次一個包的序列碼為next_seq_num[i]。以周期為50的序列進行判斷:next_
seq_num[i]==sequence,則為該文件EmailFile1[file1_num/50]的數(shù)據(jù),不等則丟棄,這樣的目的是為了在重組多郵件傳輸時確保不會導(dǎo)致捕獲的數(shù)據(jù)混亂;
(8)當數(shù)據(jù)包以一個QUIT命令來結(jié)束數(shù)據(jù)連接,則郵件SMTP/POP3郵件傳輸結(jié)束,設(shè)置標記位STRAT為0,設(shè)置標記位STRAT1為0;
(9)關(guān)閉文件,關(guān)閉線程,停止郵件捕獲和重組子程序。
從算法可以得出,首先識別郵件會話狀態(tài)的方法來確定郵件信息、重組郵件數(shù)據(jù)包,并保存在臨時文件夾,待郵件數(shù)據(jù)包解析和還原時調(diào)用。只需捕獲端口是80、25或110的數(shù)據(jù)包。
2.3 電子郵件內(nèi)容的提取與解碼模塊的設(shè)計與實現(xiàn)
互聯(lián)網(wǎng)上使用的電子郵件基本都遵循MIME規(guī)范,MIME郵件傳遞實際是一個經(jīng)過特殊編碼并以約定格式進行網(wǎng)絡(luò)傳輸?shù)?,因此只需提取存儲在郵件各種域中的位置、格式和編碼信息,根據(jù)這些信息從字符序列中提取出對應(yīng)的字符內(nèi)容對其進行解碼,就可以得到需要的有關(guān)內(nèi)容。下面是帶附件和不帶附件的郵件信息提取和解析模塊設(shè)計。流程圖如圖5所示。
這個部分主要是郵件內(nèi)容的關(guān)鍵字匹配,主要采用精確關(guān)鍵字匹配,它將待檢索的數(shù)據(jù)串和關(guān)鍵詞組成的模式串進行逐字比較,只有在數(shù)據(jù)串中發(fā)現(xiàn)與模式串完全一致的部分之后,關(guān)鍵詞匹配才算成功。把郵件各部分內(nèi)容讀取到字符串數(shù)組中,再根據(jù)MIME規(guī)范進行編寫相應(yīng)的解碼函數(shù),經(jīng)過郵件解析,提取電子郵件各部分(如發(fā)信人、收信人、主題、正文等),并對包含編碼的部分進行解碼(Base64、Quoted-Printable等),還原為可理解的電子郵件。郵件正文數(shù)據(jù)包可能分幾個子段進行傳輸,此時要循環(huán)調(diào)用函數(shù)mult_bodydecode(),當有附件時,先把正文內(nèi)容解碼之后,才進行附件的解碼,這也是調(diào)用附件解碼函數(shù)Email_Attachment()對附件進行還原。直到整個郵件解析完成才關(guān)閉文件和線程,完成郵件的還原。
本系統(tǒng)主要是在編程上優(yōu)化,提高數(shù)據(jù)包的分析和解碼效率和速度,由本文可以看出郵件數(shù)據(jù)分析、過濾、重組、解析、還原算法建立在基于Winpcap基礎(chǔ)之上,因此,該系統(tǒng)保留了Winpcap的抓包特點的同時,也克服了Winpcap部分不足。主要體現(xiàn)在以下兩點:進一步提高了分析的速度,同時大大提高分析的準確性;節(jié)約了協(xié)議分析時間。
文中設(shè)計的網(wǎng)絡(luò)安全監(jiān)控系統(tǒng),選擇Windows2000作系統(tǒng)平臺,利用VC++6.0編寫程序,它是基于系統(tǒng)的底層進行設(shè)計,與操作系統(tǒng)緊密結(jié)合。通過在局域網(wǎng)中的使用和分析,它能實時地、動態(tài)地對局域網(wǎng)內(nèi)的所有上網(wǎng)主機進行監(jiān)視、控制與管理,系統(tǒng)穩(wěn)定、效果好。
參考文獻
[1] 張偉,王韜,潘艷輝,等.基于Winpcap的數(shù)據(jù)包捕獲及應(yīng)用[J].計算機工程與設(shè)計,2008,29(7):1649-
1651.
[2] 循序漸進學(xué)習(xí)使用Winpcap[EB/OL].中國協(xié)議分析網(wǎng).http://www.cnpaf.net/,2005.
[3] 李雪瑩,劉寶旭,許榕生.基于WinPcap的網(wǎng)絡(luò)監(jiān)控系統(tǒng)性能優(yōu)化[J].計算機工程,2004,30(1):8-9.
[4] 趙英男,張秉權(quán).MIME郵件結(jié)構(gòu)格式分析[J].軟件技術(shù),2001,20(2):50-53.
[5] 秦根建,張秉權(quán).網(wǎng)絡(luò)數(shù)據(jù)包截獲機制研究[J].兵工自動化,2003,22(6):2-3.
[6] 唐燕.POP3協(xié)議解析及簡單實現(xiàn)[J].網(wǎng)絡(luò)通訊與安全,2007,16(2):951-952.