一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法
【專利摘要】本發(fā)明公開了一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,步驟一,計(jì)算機(jī)進(jìn)程注入,選擇需要抓包的目標(biāo)進(jìn)程;步驟二,獲取套接字函數(shù)接口SOCKET?API的地址并保存;步驟三,修改進(jìn)程的所述套接子函數(shù)入口的指令;步驟四,轉(zhuǎn)到自己定義的函數(shù)體中,抓取相應(yīng)網(wǎng)絡(luò)數(shù)據(jù)包,恢復(fù)函數(shù)入口指令,然后調(diào)用原API函數(shù),即恢復(fù)原始調(diào)用;步驟五,判斷是否需要繼續(xù)抓包:如果需要繼續(xù)抓包,跳轉(zhuǎn)至步驟三;如果不需要,則跳轉(zhuǎn)至步驟六;步驟六,進(jìn)程結(jié)束,釋放HOOK資源。本發(fā)明簡潔、實(shí)用,其源碼實(shí)現(xiàn)技術(shù)門檻要求低,只需普通windows?API調(diào)用即可實(shí)現(xiàn),無需專業(yè)的驅(qū)動(dòng)開發(fā)知識,適合教學(xué)研究。
【專利說明】一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于涉及機(jī)網(wǎng)絡(luò)通信協(xié)議分析教學(xué)領(lǐng)域,特別涉及一種利用API攔截技術(shù)和函數(shù)入口指令替換技術(shù)實(shí)現(xiàn)計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包的抓取的方法。
【背景技術(shù)】
[0002]眾所周知,windows系統(tǒng)是一個(gè)不開放源代碼、封閉、復(fù)雜的操作系統(tǒng)。由于其簡單的操作方式、美觀的圖形界面、穩(wěn)定的性能、豐富的應(yīng)用軟件,在PC機(jī)上成為當(dāng)之無愧的霸主,甚至在中高端服務(wù)器上也占有相當(dāng)?shù)氖袌觥8咝R矎V泛開設(shè)Windos操作系統(tǒng)方面的課程,比如:計(jì)算機(jī)就文化基礎(chǔ)、office辦公軟件、windows程序設(shè)計(jì)、MFC程序設(shè)計(jì)、COM程序設(shè)計(jì)、網(wǎng)絡(luò)程序設(shè)計(jì)、網(wǎng)絡(luò)協(xié)議分析等不同層次的課程。由于互聯(lián)網(wǎng)技術(shù)的普及,尤其是近年來移動(dòng)互聯(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ù)的重要途徑。在不開源的windows平臺下,分析網(wǎng)絡(luò)協(xié)議,首先要解決的問題就是如何抓取本機(jī)的網(wǎng)絡(luò)通信數(shù)據(jù)包。目前比較成熟的商業(yè)產(chǎn)品有winpacp、wireshark等,這類軟件產(chǎn)品穩(wěn)定可靠,使用方法簡單;但缺點(diǎn)是不開源,學(xué)生只知其然,而無法知其所以然;只能知曉如何使用軟件抓取網(wǎng)絡(luò)數(shù)據(jù)包,卻無法知曉抓取的內(nèi)在方法。在windows平臺下,要實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的抓取,開源的做法有以下兩種:
[0003]一、采用windows提供的原始套接字(RAWS0CKET),通過把網(wǎng)卡設(shè)置為混雜模式,抓取經(jīng)過本機(jī)網(wǎng)卡的IP數(shù)據(jù)包。這個(gè)方法的缺點(diǎn)是只能用于windOWS2000及以前的平臺,后續(xù)平臺不支持。
[0004]二、編寫網(wǎng)絡(luò)過濾驅(qū)動(dòng)(filte driver),通過在套接字接口層與TCP/IP設(shè)備對象層之間或網(wǎng)絡(luò)協(xié)議棧和物理網(wǎng)卡之間加入一層過濾驅(qū)動(dòng)來實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的攔截,其層次結(jié)構(gòu)如圖1所示。這個(gè)方法的優(yōu)點(diǎn)是適用所有的windows平臺,通用性非常高;缺點(diǎn)是需要windows驅(qū)動(dòng)編程的知識(NDIS)和驅(qū)動(dòng)開發(fā)包(DDK),編寫代碼對學(xué)生知識層次要求過高、代碼量大,且稍有不慎,驅(qū)動(dòng)的不穩(wěn)定即會引起操作系統(tǒng)崩潰。
[0005]過濾驅(qū)動(dòng)分為傳輸層過濾驅(qū)動(dòng)和中間層過濾驅(qū)動(dòng)兩種形式。傳輸層過濾驅(qū)動(dòng)使用NDIS (Network Driver Interface Specif ication 網(wǎng)絡(luò)驅(qū)動(dòng)接口 規(guī)范)技術(shù),又稱為 TDI 編程(Transport Driver Interface 傳輸層驅(qū)動(dòng)接 口編程)。Windows2000 和 WindowsXP 操作系統(tǒng)中,TCP/IP協(xié)議作為系統(tǒng)驅(qū)動(dòng)程序(..\system32\TcpIp.sys),在系統(tǒng)啟動(dòng)時(shí)加載入系統(tǒng)內(nèi)存,以TCP/IP設(shè)備對象(DeviceObject)的形式供應(yīng)用程序或其它系統(tǒng)程序調(diào)用。傳輸層過濾驅(qū)動(dòng)程序創(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ū)動(dòng)程序。通過傳輸層過濾驅(qū)動(dòng)程序,再調(diào)用下層的TCP/IP設(shè)備對象,從而完成網(wǎng)絡(luò)訪問功能。同樣,從TCP/IP層上傳至應(yīng)用程序的網(wǎng)絡(luò)封包,也要經(jīng)傳輸層過濾驅(qū)動(dòng)程序后,再轉(zhuǎn)發(fā)至目標(biāo)應(yīng)用程序端口?;诖斯ぷ髟?,可以在傳輸層過濾驅(qū)動(dòng)程序中實(shí)現(xiàn)網(wǎng)絡(luò)封包截獲。[0006]中間層過濾驅(qū)動(dòng)與傳輸層過濾驅(qū)動(dòng)實(shí)現(xiàn)基本原理一致,也是使用NDIS技術(shù)。主要差別在于,中間層驅(qū)動(dòng)程序,掛接在協(xié)議設(shè)備對象(包括TCP/IP設(shè)備對象)和網(wǎng)卡設(shè)備對象之間。任何進(jìn)出網(wǎng)卡的網(wǎng)絡(luò)封包,均必須首先經(jīng)過中間層驅(qū)動(dòng)程序的處理。從某種意義上分析,中間層驅(qū)動(dòng)程序更象一個(gè)虛擬網(wǎng)卡。該虛擬卡封裝了物理網(wǎng)卡,對物理網(wǎng)卡的一切網(wǎng)絡(luò)訪問操作,均必須先經(jīng)虛擬卡處理。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的是提供一種簡潔、實(shí)用的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法。
[0008]本發(fā)明的技術(shù)方案是:
[0009]一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,包括:
[0010]步驟一,計(jì)算機(jī)進(jìn)程注入,選擇需要抓包的目標(biāo)進(jìn)程;
[0011]步驟二,獲取套接字函數(shù)接口 SOCKET API的地址并保存;
[0012]步驟三,修改進(jìn)程的所述套接子函數(shù)入口的指令;
[0013]步驟四,轉(zhuǎn)到自己定義的函數(shù)體中,抓取相應(yīng)網(wǎng)絡(luò)數(shù)據(jù)包,恢復(fù)函數(shù)入口指令,然后調(diào)用原API函數(shù),即恢復(fù)原始調(diào)用;
[0014]步驟五,判斷是否需要繼續(xù)抓包:如果需要繼續(xù)抓包,跳轉(zhuǎn)至步驟三;如果不需要,則跳轉(zhuǎn)至步驟六;
[0015]步驟六,進(jìn)程結(jié)束。
[0016]優(yōu)選的,所述步驟一中是利用windows的HOOK技術(shù)來進(jìn)行的計(jì)算機(jī)進(jìn)程注入。
[0017]優(yōu)選的,所述步驟一是通過枚舉系統(tǒng)的全部進(jìn)程,來選擇需要抓包的目標(biāo)進(jìn)程。
[0018]優(yōu)選的,所述步驟二中,所述套接字函數(shù)接口 SOCKET API的地址是利用windows運(yùn)行時(shí)的動(dòng)態(tài)裝載技術(shù)來獲取的。
[0019]優(yōu)選的,所述步驟四中,所述網(wǎng)絡(luò)數(shù)據(jù)包是按照如下過程進(jìn)行抓取的:當(dāng)進(jìn)程調(diào)用正常的套接字函數(shù)接口時(shí),自動(dòng)轉(zhuǎn)入到自定義的函數(shù)體中執(zhí)行,直接拷貝函數(shù)的接收/發(fā)送緩沖區(qū)參數(shù),由此得到相應(yīng)的網(wǎng)絡(luò)數(shù)據(jù)包。
[0020]優(yōu)選的,所述步驟六中還包括釋放HOOK資源。
[0021]本發(fā)明的有益效果有:
[0022](I)本發(fā)明提供一個(gè)簡單、簡潔的網(wǎng)路數(shù)據(jù)包抓取方法。該方法的源碼實(shí)現(xiàn)技術(shù)門檻要求低,只需普通windows API調(diào)用即可實(shí)現(xiàn),無需專業(yè)的驅(qū)動(dòng)開發(fā)知識,適合教學(xué)研究。
[0023](2)本發(fā)明改變了計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議教學(xué)中,只能使用專業(yè)不開源軟件抓取網(wǎng)絡(luò)數(shù)據(jù)包這個(gè)方法的限制,學(xué)生可以深入到程序內(nèi)部,甚至自己編碼實(shí)現(xiàn)抓包程序,關(guān)鍵代碼不超過50行即可實(shí)現(xiàn)。
[0024](3)本發(fā)明所述的方法配合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ù)荷。通過本發(fā)明方法,攔截到目標(biāo)進(jìn)程通信的目的地址,然后在windows的路由表中添加該目的地址的輸出路由表,即可將不同的進(jìn)程的原IP地址綁定到不同的網(wǎng)卡上,從而實(shí)現(xiàn)多網(wǎng)卡之間的負(fù)載均衡調(diào)度。【專利附圖】
【附圖說明】
[0025]圖1本發(fā)明一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法的過濾驅(qū)動(dòng)層次結(jié)構(gòu)圖;
[0026]圖2本發(fā)明的一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法實(shí)現(xiàn)流程圖。
【具體實(shí)施方式】
[0027]下面通過實(shí)施例對本發(fā)明做進(jìn)一步詳細(xì)說明。
[0028]如圖1和2所示本發(fā)明所揭示的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,包括:
[0029]步驟一,利用windows的HOOK(鉤子)技術(shù),把編寫的抓取網(wǎng)絡(luò)數(shù)據(jù)包功能的DLL(動(dòng)態(tài)鏈接庫)程序模塊注入到計(jì)算機(jī)上的每一個(gè)進(jìn)程,通過枚舉系統(tǒng)的全部進(jìn)程,可以選擇需要抓包的目標(biāo)進(jìn)程。
[0030]步驟二,利用windows運(yùn)行時(shí)動(dòng)態(tài)裝載技術(shù),獲取套接字函數(shù)接口的地址。
[0031]示例代碼如下:
[0032]//動(dòng)態(tài)裝載windows套接字接口 32位API庫模塊
[0033]HMODULE hWsock = LoadLibrary(L"Ws2_32.dll");
[0034]//獲取套接字接口中的bind (綁定)函數(shù)接口的地址
[0035]g_pBind = (DWORD)GetProcAddress(hWsock, "bind");
[0036]//獲取套接字接口中connect (連接)函數(shù)接口的地址,這個(gè)函數(shù)用于建//立客戶端和服務(wù)器端的TCP協(xié)議邏輯連接
[0037]g_pConnect = (DWORD)GetProcAddress(hWsock, "connect");
[0038]//獲取套接字接口中send(發(fā)送)函數(shù)接口的地址,這個(gè)函數(shù)用于發(fā)送//TCP協(xié)議數(shù)據(jù)包
[0039]g_Send = (DWORD)GetProcAddress(hWsock, "send");
[0040]Il根據(jù)協(xié)議分析的需求,可以獲取需要攔截的每一個(gè)套接字函數(shù)的接口 Il地址
[0041]讀取函數(shù)接口地址的指令,為后面恢復(fù)原始調(diào)用做準(zhǔn)備。
[0042]步驟三,在待攔截套接字截函數(shù)地址入口處寫入自己構(gòu)造的匯編指令。其中,步驟二和步驟三是在DLL中,攔截進(jìn)程對操作系統(tǒng)套接字函數(shù)接口(SOCKET API)的調(diào)用。
[0043]構(gòu)造的匯編指令:MOV EAX,自定義函數(shù)地址
[0044]JMP EAX
[0045]查找X86架構(gòu)CPU的匯編手冊,可以很容易得到如上兩條匯編語句的機(jī)器指令十六進(jìn)制代碼:
[0046]0xB8 OxO 0x0 0x40 0x0 OxFF OxEO 0x5F
[0047]其中0x0 0x0 0x40 0x0部分所在地址用自定義函數(shù)接口地址替代即可。如此,當(dāng)進(jìn)程調(diào)用正常的套接字函數(shù)接口時(shí),會自動(dòng)轉(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)備。
[0048]在自定義函數(shù)中,攔截到進(jìn)程對套接字函數(shù)接口的調(diào)用,截獲這些函數(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ù)包。
[0049]步驟四,轉(zhuǎn)到自己定義的函數(shù)體中,抓取相應(yīng)網(wǎng)絡(luò)數(shù)據(jù)包,恢復(fù)函數(shù)入口指令,然后調(diào)用原API函數(shù),即恢復(fù)原始調(diào)用;
[0050]步驟五,判斷是否繼續(xù)進(jìn)行數(shù)據(jù)抓包,如果是,則跳轉(zhuǎn)至步驟三;如果不是,則跳轉(zhuǎn)至步驟六。
[0051]步驟六,進(jìn)程結(jié)束,釋放HOOK資源。
[0052]本發(fā)明方法配合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ù)荷。通過本發(fā)明方法,攔截到目標(biāo)進(jìn)程通信的目的地址,然后在windows的路由表中添加該目的地址的輸出路由表,即可將不同的進(jìn)程的原IP地址綁定到不同的網(wǎng)卡上,從而實(shí)現(xiàn)多網(wǎng)卡之間的負(fù)載均衡調(diào)度。
[0053]以上所述實(shí)施例僅表達(dá)了本發(fā)明的實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對本發(fā)明專利范圍的限制,但凡采用等同替換或等效變換的形式所獲得的技術(shù)方案,均應(yīng)落在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1.一種教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其特征在于,包括: 步驟一,計(jì)算機(jī)進(jìn)程注入,選擇需要抓包的目標(biāo)進(jìn)程; 步驟二,獲取套接字函數(shù)接口 SOCKET API的地址并保存; 步驟三,修改進(jìn)程的所述套接子函數(shù)入口的指令; 步驟四,轉(zhuǎn)到自己定義的函數(shù)體中,抓取相應(yīng)網(wǎng)絡(luò)數(shù)據(jù)包,恢復(fù)函數(shù)入口指令,然后調(diào)用原API函數(shù),即恢復(fù)原始調(diào)用; 步驟五,判斷是否需要繼續(xù)抓包:如果需要繼續(xù)抓包,跳轉(zhuǎn)至步驟三;如果不需要,則跳轉(zhuǎn)至步驟六; 步驟六,進(jìn)程結(jié)束。
2.根據(jù)權(quán)利要求1所述的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其特征在于,所述步驟一中是利用windows的HOOK技術(shù)來進(jìn)行的計(jì)算機(jī)進(jìn)程注入。
3.根據(jù)權(quán)利要求1所述的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其特征在于,所述步驟一是通過枚舉系統(tǒng)的全部進(jìn)程,來選擇需要抓包的目標(biāo)進(jìn)程。
4.根據(jù)權(quán)利要求1所述的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其特征在于,所述步驟二中,所述套接字函數(shù)接口 S0CKETAPI的地址是利用windows運(yùn)行時(shí)的動(dòng)態(tài)裝載技術(shù)來獲取的。
5.根據(jù)權(quán)利要求1所述的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其特征在于,所述步驟四中,所述網(wǎng)絡(luò)數(shù)據(jù)包是按照如下過程進(jìn)行抓取的:當(dāng)進(jìn)程調(diào)用正常的套接字函數(shù)接口時(shí),自動(dòng)轉(zhuǎn)入到自定義的函數(shù)體中執(zhí)行,直接拷貝函數(shù)的接收/發(fā)送緩沖區(qū)參數(shù),由此得到相應(yīng)的網(wǎng)絡(luò)數(shù)據(jù)包。
6.根據(jù)權(quán)利要求2所述的教學(xué)用計(jì)算機(jī)網(wǎng)絡(luò)數(shù)據(jù)包抓取方法,其特征在于,所述步驟六中還包括釋放HOOK資源。
【文檔編號】H04L12/803GK103957214SQ201410188336
【公開日】2014年7月30日 申請日期:2014年5月6日 優(yōu)先權(quán)日:2014年5月6日
【發(fā)明者】何維, 田增山, 張毅 申請人:重慶郵電大學(xué)