何 維, 李 亮, 田增山, 周 牧, 張 毅
(重慶郵電大學(xué) 重慶市移動通信技術(shù)重點(diǎn)實(shí)驗(yàn)室, 重慶 400065)
?
一種新的教學(xué)用輕量級網(wǎng)絡(luò)數(shù)據(jù)包抓取方法
何維, 李亮, 田增山, 周牧, 張毅
(重慶郵電大學(xué) 重慶市移動通信技術(shù)重點(diǎn)實(shí)驗(yàn)室, 重慶400065)
用API攔截和函數(shù)入口指令替換的方法,能夠?qū)W(wǎng)絡(luò)數(shù)據(jù)包方便、快捷地抓取。該方法通過HOOK遠(yuǎn)程注入技術(shù),修改系統(tǒng)程序的運(yùn)行邏輯,使程序跳轉(zhuǎn)到自定義的函數(shù)中運(yùn)行,調(diào)用Windows 部分API實(shí)現(xiàn)網(wǎng)路數(shù)據(jù)包的抓取,不涉及Windows驅(qū)動開發(fā)等專業(yè)知識。該方法主要應(yīng)用于計(jì)算機(jī)相關(guān)專業(yè)的教學(xué)演示,具有技術(shù)實(shí)現(xiàn)簡單、無需驅(qū)動編程的知識、代碼量小、易于學(xué)生理解等特點(diǎn)。
數(shù)據(jù)包抓取; API攔截; 網(wǎng)絡(luò)實(shí)驗(yàn)教學(xué); 互聯(lián)網(wǎng)
由于互聯(lián)網(wǎng)技術(shù)的普及,尤其是近年來移動互聯(lián)網(wǎng)技術(shù)的突起,網(wǎng)絡(luò)通信技術(shù)成為學(xué)生學(xué)習(xí)、研究的熱點(diǎn)。而在網(wǎng)絡(luò)通信技術(shù)中,網(wǎng)絡(luò)協(xié)議起著十分重要的作用,學(xué)習(xí)、分析、研究網(wǎng)絡(luò)協(xié)議成為掌握網(wǎng)絡(luò)通信技術(shù)的重要途徑[1-2]。
在不開源的Windows平臺下,要分析網(wǎng)絡(luò)協(xié)議,首先要解決如何抓取本機(jī)的網(wǎng)絡(luò)通信數(shù)據(jù)包的問題。目前比較成熟的此類商業(yè)軟件有Winpacp和Wireshark等[3],這些軟件產(chǎn)品穩(wěn)定可靠、使用方法簡單,但缺點(diǎn)是不開源,學(xué)生只能知曉如何使用這些軟件抓取網(wǎng)絡(luò)數(shù)據(jù)包,卻無法知曉抓取數(shù)據(jù)包的內(nèi)在方法。在Windows平臺下,要實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的抓取,開源的做法有以下兩種。
其一是采用Windows提供的原始套接字(RAW SOCKET),通過把網(wǎng)卡設(shè)置為混雜模式,抓取經(jīng)過本機(jī)網(wǎng)卡的IP數(shù)據(jù)包[4]。這個(gè)方法的缺點(diǎn)是只能用于Windows 2000及以前的平臺,并不支持后續(xù)平臺。
其二是通過編寫網(wǎng)絡(luò)過濾驅(qū)動(filter driver),通過在套接字接口層與TCP/IP設(shè)備對象層之間或網(wǎng)絡(luò)協(xié)議棧和物理網(wǎng)卡之間加入一層過濾驅(qū)動,來實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的攔截[5]。這個(gè)方法的優(yōu)點(diǎn)是適用所有的Windows平臺,通用性非常好,缺點(diǎn)是需要有Windows驅(qū)動編程的知識和驅(qū)動開發(fā)包。編寫代碼對學(xué)生知識層次要求過高、代碼量大,且稍有不慎,驅(qū)動的不穩(wěn)定即會引起操作系統(tǒng)崩潰。
因此,開發(fā)一個(gè)簡單實(shí)用的網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,在高校關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議的教學(xué)中具有比較重要的實(shí)際意義。對于教學(xué)而言,只有理論是不夠的,在講解理論知識的基礎(chǔ)上,給出一個(gè)可編程實(shí)現(xiàn)的、簡捷的抓包方法,對學(xué)生更有吸引力,更能激發(fā)學(xué)生的創(chuàng)造性。
1.1現(xiàn)有數(shù)據(jù)包抓取模型
由于現(xiàn)有計(jì)算機(jī)大多已不再運(yùn)行Windows 2000及以前的操作系統(tǒng),所以現(xiàn)有主流數(shù)據(jù)包抓取方法多采用過濾驅(qū)動法[6]。過濾驅(qū)動分為傳輸層過濾驅(qū)動和中間層過濾驅(qū)動兩種形式(見圖1)。

圖1 網(wǎng)絡(luò)過濾驅(qū)動模型
傳輸層過濾驅(qū)動使用NDIS(network driver interface specification)技術(shù),又稱為TDI(tran-sport driver interface)編程[7]。Windows 2000和Windows XP操作系統(tǒng)中的TCP/IP協(xié)議作為系統(tǒng)驅(qū)動程序,在系統(tǒng)啟動時(shí)載入系統(tǒng)內(nèi)存,以TCP/IP設(shè)備對象的形式供應(yīng)用程序或其他系統(tǒng)程序調(diào)用。傳輸層過濾驅(qū)動程序創(chuàng)建一個(gè)或多個(gè)設(shè)備對象,并直接掛接到TCP/IP設(shè)備對象之上。
掛接成功后,當(dāng)其他程序使用網(wǎng)絡(luò)傳輸功能,調(diào)用TCP/IP設(shè)備對象時(shí),操作系統(tǒng)首先將該調(diào)用映射到TCP/IP設(shè)備對象所掛接的傳輸層過濾驅(qū)動程序。通過傳輸層過濾驅(qū)動程序,再調(diào)用下層的TCP/IP設(shè)備對象,從而完成網(wǎng)絡(luò)訪問功能。同樣,從TCP/IP層上傳至應(yīng)用程序的網(wǎng)絡(luò)封包,也要經(jīng)傳輸層過濾驅(qū)動程序后,再轉(zhuǎn)發(fā)至目標(biāo)應(yīng)用程序端口。基于此工作原理,可以在傳輸層過濾驅(qū)動程序中實(shí)現(xiàn)網(wǎng)絡(luò)封包截獲。
中間層過濾驅(qū)動與傳輸層過濾驅(qū)動的基本原理一致,也是使用NDIS技術(shù)。主要差別在于,中間層驅(qū)動程序掛接在協(xié)議設(shè)備對象(包括TCP/IP設(shè)備)和網(wǎng)卡設(shè)備對象之間,任何進(jìn)出網(wǎng)卡的網(wǎng)絡(luò)封包均須先經(jīng)過中間層驅(qū)動程序的處理。中間層驅(qū)動程序更像一個(gè)虛擬網(wǎng)卡,該虛擬網(wǎng)卡封裝了物理網(wǎng)卡,對物理網(wǎng)卡的一切網(wǎng)絡(luò)訪問操作,均須先經(jīng)虛擬網(wǎng)卡處理。
1.2新的數(shù)據(jù)包抓取模型
由于現(xiàn)有的數(shù)據(jù)包抓取方法對于學(xué)生的學(xué)習(xí)和實(shí)踐都過于復(fù)雜,本文設(shè)計(jì)了一種輕量級的計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其流程如圖2所示。

圖2 網(wǎng)絡(luò)數(shù)據(jù)包抓取實(shí)現(xiàn)流程
輕量級網(wǎng)絡(luò)數(shù)據(jù)包抓取方法是通過HOOK遠(yuǎn)程注入技術(shù)[8],修改系統(tǒng)程序的運(yùn)行邏輯,使得程序跳轉(zhuǎn)到自定義的函數(shù)中運(yùn)行,實(shí)現(xiàn)需要的功能。采用上述方式只需要調(diào)用Windows 部分API即可實(shí)現(xiàn)網(wǎng)路數(shù)據(jù)包的抓取,不涉及Windows驅(qū)動開發(fā)等專業(yè)知識,適合教學(xué)研究。
數(shù)據(jù)包抓取流程的具體實(shí)現(xiàn)方法如下。
首先,利用Windows的HOOK技術(shù),把編寫的抓取網(wǎng)絡(luò)數(shù)據(jù)包功能的動態(tài)鏈接庫(dynamic link library,DLL)程序模塊注入到計(jì)算機(jī)上的每一個(gè)進(jìn)程中[9],并通過枚舉系統(tǒng)的全部進(jìn)程,選擇需要抓包的目標(biāo)進(jìn)程。
然后,在DLL中通過攔截進(jìn)程對操作系統(tǒng)套接字函數(shù)接口(SOCKET API)的調(diào)用,并利用Windows運(yùn)行時(shí)動態(tài)裝載技術(shù)[10],獲取套接字函數(shù)接口的地址。主要代碼如下:
(1) HMODULE hWsock = LoadLibrary(L“Ws2_32.dll” );
(2) g_pBind = ( DWORD )GetProcAddress( hWsock, “bind” );
(3) g_pConnect = ( DWORD )GetProcAddress( hWsock, “connect” );
(4) g_Send = ( DWORD )GetProcAddress( hWsock, “send” );
執(zhí)行以上第一行代碼,實(shí)現(xiàn)動態(tài)裝載Windows套接字接口32位API庫模塊[11]的功能;執(zhí)行第二行代碼,獲取套接字接口中的Bind函數(shù)接口的地址[12];執(zhí)行第三行代碼,獲取套接字接口中Connect函數(shù)接口的地址,這個(gè)函數(shù)用于建立客戶端和服務(wù)器端的TCP協(xié)議邏輯連接;執(zhí)行第四行代碼,可獲取套接字接口中Send函數(shù)接口的地址,這個(gè)函數(shù)用于發(fā)送TCP協(xié)議數(shù)據(jù)包,根據(jù)協(xié)議分析的需求,可以獲取需要攔截的每一個(gè)套接字函數(shù)的接口地址。
經(jīng)過上述的過程后,還需讀取函數(shù)接口地址的指令,為以后恢復(fù)原始調(diào)用做準(zhǔn)備,并且在待攔截套接字函數(shù)地址入口處寫入自己構(gòu)造的匯編指令。構(gòu)造的匯編指令為MOV EAX, JMP EAX。查找X86架構(gòu)CPU的匯編手冊[13],可以很容易得到如上兩條匯編語句的機(jī)器指令,其十六進(jìn)制代碼為:0xB8 0x00 0x00 0x40 0x00 0xFF 0xE0 0x5F,其中斜體部分地址用自定義函數(shù)接口地址替代即可。
如此,當(dāng)進(jìn)程調(diào)用正常的套接字函數(shù)接口時(shí),會自動轉(zhuǎn)到自定義的函數(shù)體中執(zhí)行,直接拷貝函數(shù)的接收/發(fā)送緩沖區(qū)參數(shù)即可得到相應(yīng)的網(wǎng)絡(luò)數(shù)據(jù)包;然后利用前面所保存的信息恢復(fù)原套接字函數(shù)入口指令,并調(diào)用該套接字函數(shù),執(zhí)行正常的函數(shù)功能,并再次修改該套接字函數(shù)的入口指令,為下次攔截做好準(zhǔn)備。
在自定義函數(shù)中,當(dāng)攔截到進(jìn)程對套接字函數(shù)接口的調(diào)用時(shí),截獲這些函數(shù)參數(shù)中緩沖區(qū)字段參數(shù),即可獲得網(wǎng)絡(luò)數(shù)據(jù)包。例如攔截到對Send函數(shù)的調(diào)用,即可抓取出本機(jī)通過網(wǎng)卡發(fā)出的TCP協(xié)議網(wǎng)絡(luò)數(shù)據(jù)包;攔截到Recv函數(shù)調(diào)用,即可抓取到本機(jī)通過網(wǎng)卡接收到的TCP協(xié)議網(wǎng)絡(luò)數(shù)據(jù)包;攔截到Sendto函數(shù)的調(diào)用,即可抓取到本機(jī)通過網(wǎng)卡發(fā)出的UDP協(xié)議的網(wǎng)絡(luò)數(shù)據(jù)包;攔截到Recvfrom函數(shù)調(diào)用,即可抓取到本機(jī)通過網(wǎng)卡接收到的UDP協(xié)議的網(wǎng)絡(luò)數(shù)據(jù)包。
在抓取相應(yīng)網(wǎng)絡(luò)數(shù)據(jù)包之后,恢復(fù)函數(shù)入口指令,然后調(diào)用原API函數(shù),即恢復(fù)原始調(diào)用。最后在待攔截套接字函數(shù)地址入口處再次寫入自己構(gòu)造的匯編指令,即可為下次攔截做好準(zhǔn)備。
筆者所設(shè)計(jì)的計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,是一個(gè)簡單、簡捷的網(wǎng)絡(luò)數(shù)據(jù)包抓取方法。該方法的技術(shù)實(shí)現(xiàn)門檻低,只需普通Windows API調(diào)用,無需專業(yè)的驅(qū)動開發(fā)知識,適合教學(xué)研究。該方法改變了計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議教學(xué)中只能使用專業(yè)不開源軟件抓取網(wǎng)絡(luò)數(shù)據(jù)包的限制,學(xué)生可以深入到程序內(nèi)部,甚至自己編寫抓包程序,關(guān)鍵代碼甚至不超過50行。
此方法還可以配合Windows路由表設(shè)置,用于多網(wǎng)卡主機(jī)平臺上的網(wǎng)卡負(fù)載均衡調(diào)度,即實(shí)現(xiàn)進(jìn)程與不同網(wǎng)卡的綁定。目前,在多網(wǎng)卡Windows主機(jī)環(huán)境下,不依賴三方軟件無法控制網(wǎng)卡之間的負(fù)載均衡,即:假設(shè)某張網(wǎng)卡上即使在負(fù)載過大、而其他網(wǎng)卡閑置的情況下,Windows也不會主動去調(diào)度其他網(wǎng)卡分擔(dān)負(fù)荷;而用輕量級網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,攔截到目標(biāo)進(jìn)程通信的目的地址后,在Windows的路由表中添加該目的地址的輸出路由表,即可將不同的進(jìn)程的原IP地址綁定到不同的網(wǎng)卡上,從而實(shí)現(xiàn)多網(wǎng)卡之間的負(fù)載均衡調(diào)度。
本文所設(shè)計(jì)的輕量級計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,在教學(xué)領(lǐng)域具有普遍意義。本方法利用API攔截和函數(shù)入口指令替換實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包的抓取,技術(shù)實(shí)現(xiàn)簡單,完全克服了現(xiàn)有網(wǎng)絡(luò)數(shù)據(jù)包抓取方法不開源的缺點(diǎn),學(xué)生可深入程序內(nèi)部,了解其抓包原理。本方法還可以實(shí)現(xiàn)多網(wǎng)卡之間的負(fù)載均衡調(diào)度,從而提高計(jì)算機(jī)網(wǎng)絡(luò)通信效率。
References)
[1] 廖敏,吳文慶.Windows平臺下網(wǎng)絡(luò)數(shù)據(jù)包捕獲的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識與技術(shù),2008(4):28-30.
[2] 王維頎.局域網(wǎng)數(shù)據(jù)包抓取與分析器的設(shè)計(jì)[J].科技資訊,2011(32):15.
[3] 張昊.計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包捕獲技術(shù)淺析[J].合肥學(xué)院學(xué)報(bào):自然科學(xué)版,2009,19(2):46-48.
[4] 李浪,徐雨明,魏書堤.數(shù)據(jù)包截獲仿真實(shí)驗(yàn)平臺研究與實(shí)現(xiàn)[J].衡陽師范學(xué)院學(xué)報(bào),2008,29(3):97-101.
[5] 楊曉勇.計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)管理及信息傳輸環(huán)節(jié)安全性探討[J].信息通信,2013(10):128.
[6] 朱莉,曾慧,代杰.基于Tcpdump命令網(wǎng)絡(luò)抓包腳本工具的設(shè)計(jì)[J].指揮信息系統(tǒng)與技術(shù),2011(3):53-57.
[7] 劉捷,朱程榮,熊齊邦.分布式網(wǎng)絡(luò)自動抓包管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(22):5091-5093.
[8] 何杰惠.網(wǎng)絡(luò)數(shù)據(jù)捕獲技術(shù)的探究[J].電子制作,2013(22):141.
[9] 于杰,朱有忠.簡單實(shí)用的網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)[J].吉林大學(xué)學(xué)報(bào):信息科學(xué)版,2010,28(4):423-427.
[10] 唐小婕.一種網(wǎng)絡(luò)數(shù)據(jù)包分析工具的設(shè)計(jì)與實(shí)現(xiàn)[J].科技信息,2013(26):298-299.
[11] 李延會,岳彩祥,徐金艷,等.基于Winpcap的數(shù)據(jù)包捕獲和協(xié)議分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].中國科技信息,2009(10):123-124.
[12] 翟佩超.網(wǎng)絡(luò)數(shù)據(jù)包的截取及解析[J].太原城市職業(yè)技術(shù)學(xué)院學(xué)報(bào),2013(10):167-168.
[13] 李革新.網(wǎng)絡(luò)數(shù)據(jù)包捕獲工具的開發(fā)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(8):1834-1836.
A new teaching method for data packet capture based on lightweight computer network
He Wei, Li Liang, Tian Zengshan, Zhou Mu, Zhang Yi
(Chongqing Key Laboratory of Mobile Communications Technology, Chongqing University of Posts and Telecommunications, Chongqing 400065, China)
This paper uses API interception technology and function entry instruction replacement technology to achieve computer network data packet capture. This method through the HOOK remote injection technology modifies the system running logic, so that the program can jump to a custom function to operate. Calling part of the Windows API to achieve the capture of network data packets does not involve Windows driver development and other professional knowledge. This method is mainly used in teaching demonstration in the field of computer teaching. It features simple technology, it is not necessary to drive programming knowledge, its code amount is small and it is easy to understand for students.
data packet capture; API interception; network experimental teaching; Internet
DOI:10.16791/j.cnki.sjg.2016.04.037
2015- 09- 04
重慶市教改項(xiàng)目“運(yùn)用計(jì)算機(jī)虛擬技術(shù)構(gòu)建通信系統(tǒng)實(shí)踐教學(xué)新模式”(133017);重慶郵電大學(xué)教改項(xiàng)目“移動通信系統(tǒng)仿真平臺的設(shè)計(jì)與實(shí)現(xiàn)”(XJG1302)
何維(1980—),男,重慶,碩士,講師,主要從事移動通信、通信軟件等領(lǐng)域的研究開發(fā).
E-mail:380624653@qq.com
TP393
A
1002-4956(2016)4- 0135- 03