0304節(jié)網(wǎng)絡(luò)信息被動獲取與處理主機(jī)獲取_第1頁
0304節(jié)網(wǎng)絡(luò)信息被動獲取與處理主機(jī)獲取_第2頁
0304節(jié)網(wǎng)絡(luò)信息被動獲取與處理主機(jī)獲取_第3頁
0304節(jié)網(wǎng)絡(luò)信息被動獲取與處理主機(jī)獲取_第4頁
0304節(jié)網(wǎng)絡(luò)信息被動獲取與處理主機(jī)獲取_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

信息內(nèi)容平安技術(shù)

內(nèi)容過濾平臺關(guān)鍵技術(shù)寬帶網(wǎng)絡(luò)內(nèi)容過濾平臺整體架構(gòu)零拷貝技術(shù)Linux系統(tǒng)內(nèi)存映射技術(shù)Linux內(nèi)核模塊加載技術(shù)共享內(nèi)存無鎖訪問技術(shù)Linux網(wǎng)絡(luò)報文處理傳統(tǒng)報文獲取技術(shù)網(wǎng)絡(luò)報文檢測協(xié)議棧網(wǎng)絡(luò)動態(tài)阻斷快速應(yīng)用協(xié)議識別技術(shù)高速串匹配技術(shù)作業(yè)監(jiān)聽WebMail發(fā)信交互過程每個人申請一個WebMail賬戶通過IE登錄WebMail,并撰寫、發(fā)送一封郵件編寫程序監(jiān)測登錄、發(fā)信網(wǎng)絡(luò)流的交互過程詳細(xì)分析獲取用戶名、密碼、收件人、發(fā)件人、發(fā)件時間、郵件主題、郵件內(nèi)容等信息撰寫報告:圖文、代碼注意不能通過Foxmail等客戶端軟件發(fā)送郵件完成報告后,通過該WebMail提交作業(yè)郵件標(biāo)題:學(xué)號+姓名作業(yè)提示W(wǎng)ebMail一般采用HTTP協(xié)議通信方式郵件正文編碼選擇:TXT不要通過HTTPS登錄WebMail不同網(wǎng)站的WebMail通信協(xié)議往往不同切勿抄襲!否那么......一、TCP/IP協(xié)議與以太網(wǎng)通訊二、Linux網(wǎng)絡(luò)數(shù)據(jù)包監(jiān)測技術(shù)

libpcap提供的接口函數(shù)主要實(shí)現(xiàn)和封裝了與數(shù)據(jù)包截獲有關(guān)的過程。三、Linux網(wǎng)絡(luò)數(shù)據(jù)包組裝與發(fā)送技術(shù)

libnet

提供的接口函數(shù)主要實(shí)現(xiàn)和封裝了數(shù)據(jù)包的構(gòu)造和發(fā)送過程。四、Linux網(wǎng)絡(luò)數(shù)據(jù)流解析技術(shù)

libnids

提供的接口函數(shù)主要實(shí)現(xiàn)了開發(fā)網(wǎng)絡(luò)入侵監(jiān)測系統(tǒng)所必須的一些結(jié)構(gòu)框架。課程內(nèi)容TCP/IP體系結(jié)構(gòu)----------------------------------------------------

|SMTP|DNS|HTTP|FTP|TELNET|應(yīng)用層

----------------------------------------------------

|

TCP

|

UDP

|傳輸層

----------------------------------------------------

|

IP

|

ICMP

|ARPRARP|網(wǎng)絡(luò)層

---------------------------------------------------

|IEEE802以太網(wǎng)SLIP/PPPPDNetc

|數(shù)據(jù)鏈路層

---------------------------------------------------

Linux數(shù)據(jù)包接收過程合法MAC地址合法IP地址合法端口YESYESYESNONONO丟棄丟棄丟棄傳輸層網(wǎng)絡(luò)層鏈路層物理層以太網(wǎng)通信以太網(wǎng)最初是由XEROX公司研制,并且在1980年由數(shù)據(jù)設(shè)備公司DEC(DIGIALEQUIPMENTCORPORATION)、INTEL公司和XEROX公司共同使之標(biāo)準(zhǔn)成形。后來它被作為802.3標(biāo)準(zhǔn)為電氣與電子工程師協(xié)會〔IEEE〕所采納。

以太網(wǎng)是最為流行的網(wǎng)絡(luò)傳輸系統(tǒng)之一。以太網(wǎng)的根本特征是采用一種稱為載波監(jiān)聽多路訪問/沖突檢測CSMA/CD(CarrierSenseMultipleAccess/CollisionDetection)的共享訪問方案。TCP/IP與以太網(wǎng)以太網(wǎng)和TCP/IP可以說是相輔相成的。以太網(wǎng)在一二層提供物理上的連線,使用48位的MAC地址TCP/IP工作在上層,使用32位的IP地址兩者間使用ARP和RARP協(xié)議進(jìn)行相互轉(zhuǎn)換。載波監(jiān)聽指在以太網(wǎng)中的每個站點(diǎn)都具有同等的權(quán)利,在傳輸自己的數(shù)據(jù)時,首先監(jiān)聽信道是否空閑,如果空閑,就傳輸自己的數(shù)據(jù),如果信道被占用,就等待信道空閑。沖突檢測為了防止發(fā)生兩個站點(diǎn)同時監(jiān)測到網(wǎng)絡(luò)沒有被使用時而產(chǎn)生沖突。以太網(wǎng)采用播送機(jī)制,所有與網(wǎng)絡(luò)連接的工作站都可以看到網(wǎng)絡(luò)上傳遞的數(shù)據(jù)。CSMA/CD過程以太網(wǎng)的播送通訊在以太網(wǎng)中,所有的通訊都是播送的,通常在同一個網(wǎng)段的所有網(wǎng)絡(luò)接口都可以訪問在物理媒體上傳輸?shù)乃袛?shù)據(jù)網(wǎng)卡的MAC地址每一個網(wǎng)絡(luò)接口都有一個唯一的硬件地址,這個硬件地址也就是網(wǎng)卡的MAC地址。大多數(shù)系統(tǒng)使用48比特的地址,這個地址用來表示網(wǎng)絡(luò)中的每一個設(shè)備一般來說每一塊網(wǎng)卡上的MAC地址都是不同的每個網(wǎng)卡廠家得到一段地址,然后用這段地址分配給其生產(chǎn)的每個網(wǎng)卡一個地址。在正常的情況下,網(wǎng)絡(luò)接口應(yīng)該只響應(yīng)這樣的兩種數(shù)據(jù)幀:1.與自己硬件地址相匹配的數(shù)據(jù)幀。2.發(fā)向所有機(jī)器的播送數(shù)據(jù)幀。以太網(wǎng)的播送通訊數(shù)據(jù)的收發(fā)是由網(wǎng)卡來完成的網(wǎng)卡接收到傳輸來的數(shù)據(jù),網(wǎng)卡內(nèi)的單片程序接收數(shù)據(jù)幀的目的MAC地址,根據(jù)計算機(jī)上的網(wǎng)卡驅(qū)動程序設(shè)置的接收模式判斷該不該接收。認(rèn)為該接收就接收后產(chǎn)生中斷信號通知CPU認(rèn)為不該接收就丟掉不管,所以不該接收的數(shù)據(jù)網(wǎng)卡就截斷了,計算機(jī)根本就不知道.CPU得到中斷信號產(chǎn)生中斷,操作系統(tǒng)就根據(jù)網(wǎng)卡的驅(qū)動程序設(shè)置的網(wǎng)卡中斷程序地址調(diào)用驅(qū)動程序接收數(shù)據(jù)驅(qū)動程序接收數(shù)據(jù)后放入信號堆棧讓操作系統(tǒng)處理。網(wǎng)卡來說一般有四種接收模式:播送方式:該模式下的網(wǎng)卡能夠接收網(wǎng)絡(luò)中的播送信息。組播方式:設(shè)置在該模式下的網(wǎng)卡能夠接收組播數(shù)據(jù)。直接方式:在這種模式下,只有目的網(wǎng)卡才能接收該數(shù)據(jù)?;祀s模式:在這種模式下的網(wǎng)卡能夠接收一切通過它的數(shù)據(jù),而不管該數(shù)據(jù)是否是傳給它的。以太網(wǎng)的播送通訊總結(jié)一下首先,我們知道了在以太網(wǎng)中是基于播送方式傳送數(shù)據(jù)的,也就是說,所有的物理信號都要經(jīng)過我的機(jī)器,其次,播送模式下,網(wǎng)卡的一種模式叫混雜模式〔promiscuous〕,在這種模式下工作的網(wǎng)卡能夠接收到一切通過它的數(shù)據(jù),而不管實(shí)際上數(shù)據(jù)的目的地址是不是它。再次,通過設(shè)置交換機(jī)監(jiān)聽端口。監(jiān)聽端口帶寬要大于所監(jiān)聽的端口帶寬,防止丟包。二、基于Libpcap的網(wǎng)絡(luò)編程技術(shù)libpcap函數(shù)庫介紹Libpcap(PacketCapturelibrary),即數(shù)據(jù)包捕獲函數(shù)庫。該庫提供的C函數(shù)接口可用于捕獲經(jīng)過網(wǎng)絡(luò)接口(只要經(jīng)過該接口,目標(biāo)地址不一定為本機(jī))的數(shù)據(jù)包。它是由洛侖茲伯克利(Berkeley)試驗室的研究人員StevenMcCanne和VanJacobson于1993年在Usenix‘93會議上正式提出的一種用于Unix內(nèi)核數(shù)據(jù)包過濾體制

。該函數(shù)庫支持Linux、Solaris和BSD系統(tǒng)平臺。采用libpcap可以捕獲本地網(wǎng)絡(luò)數(shù)據(jù)鏈路層上的數(shù)據(jù)。廣泛應(yīng)用于:網(wǎng)絡(luò)參數(shù)統(tǒng)計協(xié)議分析防火墻入侵檢測系統(tǒng)網(wǎng)絡(luò)調(diào)試libpcap函數(shù)庫介紹libpcap庫是基于BPF(BerkeleyPacketFilter:BSD包過濾器)系統(tǒng)的。BPF是BSD系統(tǒng)在TCP/IP軟件實(shí)現(xiàn)時所提供的一個接口,通過這個接口,外部程序可以獲取到達(dá)本機(jī)的數(shù)據(jù)鏈路層網(wǎng)絡(luò)數(shù)據(jù),同時也可以設(shè)置過濾器,嵌入到網(wǎng)絡(luò)軟件中,獲得過濾后的數(shù)據(jù)包。BPF工作過程BPF是一種內(nèi)核包捕獲的體系結(jié)構(gòu),它使得UNIX下的應(yīng)用程序通過一個高度優(yōu)化的方法讀取流經(jīng)網(wǎng)絡(luò)適配器的數(shù)據(jù)包。BPF主要由兩局部組成:Networktap和PacketFilter。Networktap是一個回調(diào)函數(shù)〔callbackfunction〕,它實(shí)時監(jiān)視共享網(wǎng)絡(luò)中的所有數(shù)據(jù)包,從網(wǎng)絡(luò)設(shè)備驅(qū)動程序中搜集數(shù)據(jù)拷貝并轉(zhuǎn)發(fā)給包過濾器。包過濾器決定是否接收該數(shù)據(jù)包,以及接收該數(shù)據(jù)包的那些局部〔Slice(分片)技術(shù)〕。BPF的工作原理如圖4所示。BPF過濾機(jī)制應(yīng)用程序1Libpcap應(yīng)用程序2libpcap應(yīng)用程序Nlibpcap緩存過濾器緩存過濾器緩存過濾器TCP/IP等網(wǎng)絡(luò)協(xié)議棧鏈路層驅(qū)動程序鏈路層驅(qū)動程序鏈路層驅(qū)動程序BPF內(nèi)核內(nèi)核網(wǎng)絡(luò)網(wǎng)絡(luò)監(jiān)視器用戶空間tapLibpcap庫函數(shù)接口簡介

libpcap所提供的主要函數(shù)如下:char*pcap_lookupdev();返回一個適于pcap_open_live()和pcap_lookupnet()函數(shù)使用的指向網(wǎng)絡(luò)設(shè)備的指針pcap_t*pcap_open_live();用于獲取一個包捕獲描述符intpcap_lookupnet();用于返回與網(wǎng)絡(luò)設(shè)備相關(guān)的網(wǎng)絡(luò)號和掩碼intpcap_dispatch()或intpcap_loop();收集和處理數(shù)據(jù)包voidpcap_dump();將一個包輸出到由pcap_dump_open〔〕翻開的文件中保存intpcap_compile();用于將過濾規(guī)那么字符串編譯成一個內(nèi)核過濾程序intpcap_setfilter();設(shè)定一個過濾程序intpcap_datalink();返回數(shù)據(jù)鏈路層類型,如10M以太網(wǎng),SLIP,PPP,F(xiàn)DDI,ATM,IEEE802.3等voidpcap_close();關(guān)閉關(guān)聯(lián)設(shè)備〔文件〕并回收資源intpcap_stats(pcap_t*,structpcap_stat*);參數(shù)統(tǒng)計intpcap_read(pcap_t*,intcnt,pcap_handler,u_char*);翻開設(shè)備Libpcap:dump文件格式dump文件頭:structpcap_file_header{ bpf_u_int32magic; //0xa1b2c3d4 u_shortversion_major; u_shortversion_minor; bpf_int32thiszone; /*本地時間*/ bpf_u_int32sigfigs; /*時間戳*/ bpf_u_int32snaplen; /*數(shù)據(jù)長度*/ bpf_u_int32linktype; /*鏈路類型*/};每一個包的包頭和數(shù)據(jù)structpcap_pkthdr{ structtimevalts; bpf_u_int32caplen; bpf_u_int32len;};其中數(shù)據(jù)局部的長度為caplenLibpcap應(yīng)用步驟命令行中指定了要監(jiān)視的網(wǎng)絡(luò)設(shè)備?查找可用的網(wǎng)絡(luò)設(shè)備pcap_lookup_dev()打開網(wǎng)絡(luò)設(shè)備或文件作為包捕獲描述符pcap_open_live()/pcap_open_offline()獲取與網(wǎng)絡(luò)設(shè)備相關(guān)的網(wǎng)絡(luò)號和掩碼pcap_lookupnet()編譯過濾規(guī)則為內(nèi)核過濾程序pcap_compile()設(shè)置過濾程序

pcap_setfilter()包捕獲并處理

pcap_loop()或pcap_dispatch()關(guān)閉并返回pcap_close()YNLibpcap應(yīng)用步驟及關(guān)鍵的函數(shù)使用方法

1.

獲取設(shè)備名

char*pcap_lookupdev(char*errbuf)該函數(shù)用于返回可被pcap_open_live()或pcap_lookupnet()函數(shù)調(diào)用的網(wǎng)絡(luò)設(shè)備名〔一個字符串指針〕。如果函數(shù)出錯,那么返回NULL,同時errbuf中存放相關(guān)的錯誤消息。2.

獲取網(wǎng)絡(luò)號和掩碼

intpcap_lookupnet(char*device,bpf_u_int32*netp,bpf_u_int32*maskp,char*errbuf)獲得指定網(wǎng)絡(luò)設(shè)備的網(wǎng)絡(luò)號和掩碼。netp參數(shù)和maskp參數(shù)都是bpf_u_int32指針。如果函數(shù)出錯,那么返回-1,同時errbuf中存放相關(guān)的錯誤消息。Libpcap應(yīng)用步驟及關(guān)鍵的函數(shù)使用方法

3.

翻開設(shè)備

pcap_t*pcap_open_live(char*device,intsnaplen,intpromisc,intto_ms,char*ebuf)獲得用于捕獲網(wǎng)絡(luò)數(shù)據(jù)包的數(shù)據(jù)包捕獲描述字。device參數(shù)為指定翻開的網(wǎng)絡(luò)設(shè)備名。snaplen參數(shù)定義捕獲數(shù)據(jù)的最大字節(jié)數(shù)。promisc指定是否將網(wǎng)絡(luò)接口置于混雜模式:promisc=1雜湊模式,0正常模式;。to_ms參數(shù)指定超時時間〔毫秒〕。ebuf參數(shù)僅在pcap_open_live()函數(shù)出錯返回NULL時用于傳遞錯誤消息。Libpcap應(yīng)用步驟及關(guān)鍵的函數(shù)使用方法

4.

編譯和設(shè)置過濾器

intpcap_compile(pcap_t*p,structbpf_program*fp,char*str,intoptimize,bpf_u_int32netmask)將str參數(shù)指定的字符串編譯到過濾程序中。fp是一個bpf_program結(jié)構(gòu)的指針,在pcap_compile()函數(shù)中被賦值。optimize參數(shù)控制結(jié)果代碼的優(yōu)化。netmask參數(shù)指定本地網(wǎng)絡(luò)的網(wǎng)絡(luò)掩碼。

intpcap_setfilter(pcap_t*p,structbpf_program*fp)指定一個過濾程序。fp參數(shù)是bpf_program結(jié)構(gòu)指針,通常取自pcap_compile()函數(shù)調(diào)用。出錯時返回-1;成功時返回0。Libpcap應(yīng)用步驟及關(guān)鍵的函數(shù)使用方法

5.

抓取數(shù)據(jù)包intpcap_dispatch(pcap_t*p,intcnt,pcap_handlercallback,u_char*user)cnt參數(shù)指定函數(shù)返回前所處理數(shù)據(jù)包的最大值。cnt=-1表示在一個緩沖區(qū)中處理所有的數(shù)據(jù)包。cnt=0表示處理所有數(shù)據(jù)包,直到產(chǎn)生以下錯誤之一:讀取到EOF;超時讀取。callback參數(shù)指定一個帶有三個參數(shù)的回調(diào)函數(shù),這三個參數(shù)為:typedefvoid(*pcap_handler)(u_char*agrs,conststructpcap_pkthdr*header,constu_char*packet);agrs:pcap_dispatch()函數(shù)傳遞過來的第四個形參,一般我們自己的包捕捉程序不需要提供它,總是為NULL;header:指向pcap_pkthdr結(jié)構(gòu),該結(jié)構(gòu)位于真正的物理幀前面,用于消除不同鏈路層支持的差異;packet:指向所捕獲報文的物理幀。參數(shù)user為用戶傳遞給回調(diào)函數(shù)的指針。如果成功那么返回讀取到的字節(jié)數(shù)。讀取到EOF時那么返回零值。出錯時那么返回-1,此時可調(diào)用pcap_perror()或pcap_geterr()函數(shù)獲取錯誤消息。Libpcap應(yīng)用步驟及關(guān)鍵的函數(shù)使用方法

intpcap_loop(pcap_t*p,intcnt,pcap_handlercallback,u_char*user)功能根本與pcap_dispatch()函數(shù)相同,只不過此函數(shù)在cnt個數(shù)據(jù)包被處理或出現(xiàn)錯誤時才返回,但讀取超時不會返回。而如果為pcap_open_live()函數(shù)指定了一個非零值的超時設(shè)置,然后調(diào)用pcap_dispatch()函數(shù),那么當(dāng)超時發(fā)生時pcap_dispatch()函數(shù)會返回。cnt參數(shù)為負(fù)值時pcap_loop()函數(shù)將始終循環(huán)運(yùn)行,除非出現(xiàn)錯誤。例如:pcap_loop(pd,10,eth_printer,NULL);

主循環(huán),開始抓包,共抓10個(由第二個參數(shù)指定),抓到包后就進(jìn)入回調(diào)函數(shù)eth_printer處理u_char*pcap_next(pcap_t*p,structpcap_pkthdr*h)返回指向下一個數(shù)據(jù)包的u_char指針。Libpcap6.

關(guān)閉

voidpcap_close(pcap_t*p)關(guān)閉p參數(shù)相應(yīng)的文件,并釋放資源。7.

其他的輔助函數(shù)

FILE*pcap_file(pcap_t*p)返回被翻開文件的文件名。

intpcap_fileno(pcap_t*p)返回被翻開文件的文件描述字號碼。pcap_read()這個函數(shù)從包捕獲驅(qū)動器中讀取一組數(shù)據(jù)包并針對每一個包運(yùn)行包過濾程序,然后把過濾后的數(shù)據(jù)送應(yīng)用程序緩沖器。pcap_next()循環(huán)包捕獲其他的輔助函數(shù)脫機(jī)方式監(jiān)聽局部:Libpcap支持脫機(jī)監(jiān)聽。即先將網(wǎng)絡(luò)上的數(shù)據(jù)截獲下來,存到磁盤上,在以前方便的時候再從磁盤上獲取數(shù)據(jù)來做分析。主要函數(shù)為pcap_open_offline()pcap_offline_read()intpcap_datalink(pcap_t*);返回網(wǎng)絡(luò)類型,如DLT_EN10MB就是10M以太網(wǎng)intpcap_major_version(pcap_t*);返回libpcap主版本號intpcap_minor_version(pcap_t*);返回libpcap次版本號其他的輔助函數(shù)intpcap_snapshot(pcap_t*);

返回最長抓多少字節(jié),就是在pcap_open_live中第二個參數(shù)設(shè)置intpcap_stats(pcap_t*,structpcap_stat*);

計數(shù),共抓了多少,過濾掉了多少structpcap_stat{

u_intps_recv;/*numberofpacketsreceived*/

u_intps_drop;/*numberofpacketsdropped*/

u_intps_ifdrop;/*dropsbyinterfaceXXXnotyetsupported*/

};出錯處理象其它庫一樣,libpcap也有自己的錯誤處理機(jī)制。根本上每個函數(shù)都有返回值,出錯時返回值<0

voidpcap_perror(pcap_t*,char*);

char*pcap_strerror(int);

char*pcap_geterr(pcap_t*);

在pcap_t中有一個成員存放著錯誤字串

structpcap{

...

charerrbuf[PCAP_ERRBUF_SIZE];

};安裝配置安裝前需下載以下文件:1〕libpcap.tar.z公用函數(shù)庫:下載地址:2〕底層支持:3〕NDISPacketCaptureDriverforwindows::///~mike安裝配置ForLinux用戶安裝*安裝libpcap:先檢查文件以下文件是否存在,/usr/local/lib/libpcap.a,/usr/include/pcap/pcap.h,pcap-namedb.h和/usr/include/pcap/net/bpf.h,如都存在說明系統(tǒng)中已安裝libpcap〔注意:LinuxRedhat7.0及之后版本已經(jīng)集成了該包〕。安裝配置如沒安裝那么操作:#cd/tmp#cdlibpcap#./configure;make;makecheck;makeinstall如無任何報錯信息,說明安裝成功。例5-1一個簡單的Libpcap測試程序

#ifdef__cplusplus

extern"C"{

#endif

#include<pcap.h>

#ifdef__cplusplus

}

#endif

voidprinter(u_char*user,conststructpcap_pkthdr*h,constu_char*p)

{ printf("Igetonepacket!");

}

#defineDEFAULT_SNAPLEN68

intmain()

{

charebuf[PCAP_ERRBUF_SIZE];

char*device=pcap_lookupdev(ebuf);

bpf_u_int32localnet,netmask;

pcap_lookupnet(device,&localnet,&netmask,ebuf);

printf("%u.%u.%u.%u",localnet&0xff,localnet>>8&0xff,

localnet>>16&0xff,localnet>>24&0xff);

printf(":%d.%d.%d.%d",netmask&0xff, netmask>>8&0xff, netmask>>16&0xff,netmask>>24&0xff);

structpcap_t*pd=pcap_open_live(device, DEFAULT_SNAPLEN,0,1000,ebuf);

if(pcap_datalink(pd)==DLT_EN10MB)

printf("10Mb以太網(wǎng)");

structbpf_programfcode;

pcap_compile(pd,&fcode,NULL,1,0);

pcap_setfilter(pd,&fcode);

pcap_loop(pd,10,printer,NULL);

structpcap_statstat;

pcap_stats(pd,&stat);

printf("recv%d,drop%d.",stat.ps_recv,stat.ps_drop);

pcap_close(pd);

}三、基于Libnet的網(wǎng)絡(luò)編程技術(shù)1.Unix系統(tǒng)平臺上的APIlibrary在眾多的APIlibrary中,對于類Unix系統(tǒng)平臺而言,目前最為流行的CAPIlibrary有:LibnetLibpcapLibnidsLibicmp等。它們分別從不同層次和角度提供了不同的網(wǎng)絡(luò)功能函數(shù)。使網(wǎng)絡(luò)開發(fā)人員能夠忽略網(wǎng)絡(luò)底層細(xì)節(jié)的實(shí)現(xiàn),從而專注于程序本身具體功能的設(shè)計與開發(fā)。其中:

Unix系統(tǒng)平臺上的APIlibrarylibnet提供的接口函數(shù)主要用于實(shí)現(xiàn)數(shù)據(jù)包的構(gòu)造和發(fā)送。

libpcap提供的接口函數(shù)主要用于實(shí)現(xiàn)數(shù)據(jù)包截獲(接收)

。libnids提供的接口函數(shù)主要實(shí)現(xiàn)了開發(fā)網(wǎng)絡(luò)入侵監(jiān)測系統(tǒng)(nids)所必須的一些結(jié)構(gòu)框架。libicmp封裝的是ICMP數(shù)據(jù)包的主要處理過程(構(gòu)造、發(fā)送、接收等)。

Unix系統(tǒng)平臺上的APIlibrary利用這些C函數(shù)庫的接口,開發(fā)人員可以很方便地編寫出具有結(jié)構(gòu)化強(qiáng)、健壯性好、可移植性高等特點(diǎn)的網(wǎng)絡(luò)通信程序。這些函數(shù)庫在網(wǎng)絡(luò)應(yīng)用開發(fā)中具有很大的實(shí)用價值,在scanner、sniffer、firewall、IDS等領(lǐng)域都獲得了極其廣泛的應(yīng)用,著名的抓包軟件如tcpdump、ethereal等就是在libpcap的根底上開發(fā)的。著名的網(wǎng)絡(luò)嗅探器軟件Sniffer就是在libpcap的根底上開發(fā)的。1.構(gòu)造及發(fā)送數(shù)據(jù)包—LibnetLibnet概述功能:數(shù)據(jù)包構(gòu)造和發(fā)送libnet是一個高層API〔toolkit〕,主要用C語言寫成,為應(yīng)用程序設(shè)計人員提供了低層的網(wǎng)絡(luò)數(shù)據(jù)報的構(gòu)造、處理和發(fā)送等功能接口。libnet使得程序員從乏味的報文創(chuàng)立工作〔如多路復(fù)用、緩沖區(qū)管理、神秘的報頭信息(域、位置、長度)、字節(jié)順序、操作系統(tǒng)相關(guān)問題等〕中解脫出來,將精力集中在解決關(guān)鍵問題上。利用libnet,可以方便、快速、簡單地完成報文組裝工作,稍加擴(kuò)展,還可以編寫出復(fù)雜的應(yīng)用程序〔如Traceroute(路由跟蹤)和ping就可以方便地通過libnet和libpcap來實(shí)現(xiàn)〕。Libnetlibnet庫提供的接口函數(shù)包含15種數(shù)據(jù)包生成器和兩種數(shù)據(jù)包發(fā)送器(IP層和數(shù)據(jù)鏈路層)。提供了50多個CAPI函數(shù),功能涵蓋內(nèi)存管理(分配和釋放)函數(shù)地址解析函數(shù)各種協(xié)議類型的數(shù)據(jù)包構(gòu)造函數(shù),包括應(yīng)用層〔如DNS,RIP,SNMP等〕傳輸層〔如TCP,UDP等〕、網(wǎng)絡(luò)層〔如IP,ARP,ICMP,,IGMP,OSPF等〕和數(shù)據(jù)鏈路層〔如Ethernet幀等〕數(shù)據(jù)包發(fā)送函數(shù)(IP層和鏈路層)一些輔助函數(shù),如產(chǎn)生隨機(jī)數(shù)、錯誤報告、端口列表管理等內(nèi)存管理函數(shù)

單數(shù)據(jù)包內(nèi)存初始化:intlibnet_init_packet(u_shortpacket_size,u_char**buf);單數(shù)據(jù)包內(nèi)存釋放:voidlibnet_destroy_packet(u_char**buf);多數(shù)據(jù)包〔緩沖池〕內(nèi)存初始化:Intlibnet_init_packet_arena(structlibnet_arena**arena,u_shortpacket_num,u_shortpacket_size);訪問多數(shù)據(jù)包〔緩沖池〕內(nèi)存中的下一個數(shù)據(jù)包:u_char*libnet_next_packet_from_arena(structlibnet_arena**arena,u_shortpacket_size);多數(shù)據(jù)包內(nèi)存釋放:voidlibnet_destroy_packet_arena(structlibnet_arena**arena);地址解析函數(shù)

解析主機(jī)名:u_char*libnet_host_lookup(u_longip,u_shortuse_name);解析主機(jī)名(可重入函數(shù)):voidlibnet_host_lookup_r(u_longip,u_shortuse_name,u_char*buf);域名解析:u_longlibnet_name_resolve(u_char*ip,u_shortuse_name);獲取接口設(shè)備IP地址:u_longlibnet_get_ipaddr(structlibnet_link_int*l,constu_char*device,constu_char*ebuf);獲取接口設(shè)備硬件地址:structether_addr*libnet_get_hwaddr(structlibnet_link_int*l,constu_char*device,constu_char*ebuf);數(shù)據(jù)包構(gòu)造函數(shù)

ARP協(xié)議數(shù)據(jù)包DNS協(xié)議數(shù)據(jù)包以太網(wǎng)幀數(shù)據(jù)包IGMP協(xié)議數(shù)據(jù)包IP協(xié)議數(shù)據(jù)包IP協(xié)議數(shù)據(jù)包選項UDP協(xié)議數(shù)據(jù)包TCP協(xié)議數(shù)據(jù)包TCP協(xié)議數(shù)據(jù)包選項數(shù)據(jù)包構(gòu)造函數(shù)ICMP協(xié)議數(shù)據(jù)包(ICMP_ECHO/ICMP_ECHOREPLY回聲請求/應(yīng)答)----PingICMP協(xié)議數(shù)據(jù)包(ICMP_MASKREQ/ICMP_MASKREPLY地址掩馬請求/應(yīng)答)ICMP協(xié)議數(shù)據(jù)包(ICMP_UNREACH目的地不可達(dá))ICMP協(xié)議數(shù)據(jù)包(ICMP_TIMEXCEED超時)ICMP協(xié)議數(shù)據(jù)包(ICMP_REDIRECT路由重定向)ICMP協(xié)議數(shù)據(jù)包(ICMP_TSTAMP/ICMP_TSTAMPREPLY時間戳請求/應(yīng)答)數(shù)據(jù)包構(gòu)造函數(shù)RIP路由協(xié)議數(shù)據(jù)包OSPF路由協(xié)議數(shù)據(jù)包OSPF路由協(xié)議數(shù)據(jù)包(Hello)OSPF路由協(xié)議數(shù)據(jù)包(DataBaseDescription(DBD))OSPF路由協(xié)議數(shù)據(jù)包(LinkStateRequest(LSR))OSPF路由協(xié)議數(shù)據(jù)包(LinkStateUpdate(LSU))OSPF路由協(xié)議數(shù)據(jù)包(LinkStateAcknowledgement(LSA))OSPF路由協(xié)議數(shù)據(jù)包(LinkStateRouter)OSPF路由協(xié)議數(shù)據(jù)包(LinkStateSummary)OSPF路由協(xié)議數(shù)據(jù)包(LinkStateASExternal)數(shù)據(jù)常量

常量名數(shù)值(字節(jié)數(shù))LIBNET_ETH_H14LIBNET_IP_H20LIBNET_RIP_H24LIBNET_TCP_H20LIBNET_UDP_H8LIBNET_ARP_H28LIBNET_DNS_H12LIBNET_ICMP_H4LIBNET_ICMP_ECHO_H8LIBNET_ICMP_MASK_H12LIBNET_ICMP_UNREACH_H8LIBNET_ICMP_TIMXCEED_H8LIBNET_ICMP_REDIRECT_H8LIBNET_ICMP_TS_H20LIBNET_IGMP_H8數(shù)據(jù)常量數(shù)據(jù)包內(nèi)存常量:LIBNET_PACKETTCP/UDP數(shù)據(jù)包頭+IP數(shù)據(jù)包頭使用的內(nèi)存LIBNET_OPTSIP或TCP選項使用的內(nèi)存LIBNET_MAX_PACKETIP_MAXPACKET(65535字節(jié))使用的內(nèi)存構(gòu)造以太幀數(shù)據(jù)包intlibnet_build_ethernet(u_char*daddr,u_char*saddr,u_shorttype,constu_char*payload,intpayload_len,u_char*packet_buf);例:構(gòu)造一個不含數(shù)據(jù)的以太幀/*Packetconstruction(ethernetheader).*/

libnet_build_ethernet(

enet_dst,

enet_src,

ETHERTYPE_IP,

NULL,

0,

packet);Ethernet幀Dest.

AddressSource

AddressTypeInfoIPIPXAppleTalkCRC6624ARP協(xié)議數(shù)據(jù)包intlibnet_build_arp(u_shorthrdw,u_shortprot,u_shorth_len,u_shortp_len,

u_shortop,u_char*s_ha,u_char*s_pa,

u_char*t_ha,u_char*t_pa,constu_char*payload,intpayload_len, u_char*packet_buf);構(gòu)造ARP協(xié)議數(shù)據(jù)包t=libnet_build_arp(ARPHRD_ETHER,/*hardwareaddr*/ETHERTYPE_IP,/*protocoladdr*/6,/*hardwareaddrsize*/4,/*protocoladdrsize*/ARPOP_REPLY,/*operationtype*/enet_src,/*senderhardwareaddr*/ip_src,/*senderprotocoladdr*/enet_dst,/*targethardwareaddr*/ip_dst,/*targetprotocoladdr*/NULL,/*payload*/0,/*payloadsize*/packet);/*packetbuffer*/if(t==-1){fprintf(stderr,"Can'tbuildARPheader:%s\n",libnet_geterror(l));gotobad;}IP協(xié)議數(shù)據(jù)包構(gòu)造IP分組數(shù)據(jù)包:intlibnet_build_ip(u_shortlen,u_chartos,u_shortip_id,u_shortfrag, u_charttl,u_charprotocol,u_longsaddr, u_longdaddr,constu_char*payload,intpayload_len,u_char*packet_buf);校驗和與選項單獨(dú)處理構(gòu)造IP協(xié)議數(shù)據(jù)包libnet_build_ip(LIBNET_IP_H,/*sizeoftheIPheader*/

IPTOS_LOWDELAY,/*IPtos*/

242,/*IPID*/

0,/*fragstuff*/

48,/*TTL*/

IPPROTO_TCP,/*transportcontrolprotocol*/

src_ip,/*sourceIPaddress*/

dst_ip,/*destinationIPaddress*/

NULL,/*payload(none)*/

0,/*payloadlength*/

packet);/*packetheadermemory*/

計算IP校驗和調(diào)用函數(shù)來計算TCP/IP協(xié)議的校驗和 libnet_do_checksum(u_char*packet,intprotocol,intpacket_size)進(jìn)行校驗。校驗的協(xié)議由參數(shù)protocol決定,例: if(libnet_do_checksum(packet,IPPROTO_IP,LIBNET_IP_H)==-1)

{

libnet_error(LIBNET_ERR_FATAL, "libnet_do_checksumfailed\n");

}

TCP/UDP協(xié)議數(shù)據(jù)包TCP協(xié)議數(shù)據(jù)包構(gòu)造:intlibnet_build_tcp(u_shortth_sport,u_shortth_dport,u_longth_seq, u_longth_ack,u_charth_flags,u_shortth_win, u_shortth_urg,constu_char*payload, intpayload_len,u_char*packet_buf);UDP協(xié)議數(shù)據(jù)包構(gòu)造:intlibnet_build_udp(u_shortsport,u_shortdport,constu_char*payload,intpayload_len, u_char*packet_buf);構(gòu)造TCP協(xié)議數(shù)據(jù)包/*Packetconstruction(TCPheader).*/libnet_build_tcp(src_prt,/*sourceTCPport*/

dst_prt,/*destinationTCPport*/

0xa1d95,/*sequencenumber*/

0x53,/*acknowledgementnumber*/

TH_SYN,/*controlflags*/

1024,/*windowsize*/

0,/*urgentpointer*/

NULL,/*payload(none)*/

0,/*payloadlength*/

packet+LIBNET_IP_H);/*packetheadermemory*/

數(shù)據(jù)包發(fā)送函數(shù)

翻開rawsocket: intlibnet_open_raw_sock(intprotocol);關(guān)閉rawsocket: intlibnet_close_raw_sock(intsocket);選擇接口設(shè)備: intlibnet_select_device(structsockaddr_in*sin,u_char**device,u_char*ebuf);翻開鏈路層接口設(shè)備: structlibnet_link_int*libnet_open_link_interface(char*device,char*ebuf);關(guān)閉鏈路層接口設(shè)備:

intlibnet_close_link_interface(structlibnet_link_int*l);數(shù)據(jù)包發(fā)送函數(shù)發(fā)送IP數(shù)據(jù)包: intlibnet_write_ip(intsocket,u_char*packet,intpacket_size);發(fā)送鏈路層數(shù)據(jù)包: intlibnet_write_link_layer(structlibnet_link_int*l,constu_char*device,u_char*packet,intpacket_size);檢驗和計算: intlibnet_do_checksum(u_char*packet,intprotocol,intpacket_size);輔助函數(shù)

隨機(jī)數(shù)種子生成器獲取隨機(jī)數(shù)16進(jìn)制數(shù)據(jù)輸出顯示端口列表鏈初始化獲取端口列表鏈的下一項(端口范圍)端口列表鏈輸出顯示獲取端口列表鏈端口列表鏈內(nèi)存釋放使用Libnet的根本過程數(shù)據(jù)包內(nèi)存初始化網(wǎng)絡(luò)接口初始化構(gòu)造所需的數(shù)據(jù)包計算數(shù)據(jù)包的校驗和發(fā)送數(shù)據(jù)包關(guān)閉網(wǎng)絡(luò)接口釋放數(shù)據(jù)包內(nèi)存libnet_init_packet(…);libnet_open_raw_sock(…);libnet_build_ip(…);libnet_build_tcp(…);libnet_do_checksum(…);libnet_write_ip(…);libnet_close_raw_sock(…);libnet_destroy_packet(…);Libnet的安裝以為例,安裝步驟為:#cdlibnet#./configure#make#makeinstall應(yīng)用實(shí)例Snortlibnidstcpdumpssldumpsniffer四、基于Libnids的網(wǎng)絡(luò)編程技術(shù)libnids–reassembleIPstreamsNIDS“E〞box(eventgenerationbox)UserlandTCP/IPstackBasedonLinux2.0.36IPstackUseslibpcap,libnetinternallyIPfragmentreassemblyKernelIPstackUserlandKernelIPstackUserlandIPstackLibnidslibnidsBasicsInitializenids_init()Registercallbacksnids_register_tcp()nids_regster_ip()nids_regiser_udp()Run!nids_run()Reactnids_kill_tcp()nids_run()UDPcallbackTCPcallbackIPcallbackTCPstreamobject:-TCPstate-clientdata-serverdata-sourceIP,port-destIP,port-seq,ack,etc…UDPpacket:-sourceIP,port-destIP,port-UDPpayloadIPpacket-structIPpacket-containsupperlayerslibnidsTCPstatesNIDS_JUST_ESTABLISHEDNewTCPconnectedstate(3WHS)Mustsetstream->{client,server}.collect=1togetstreampayloadcollectedNIDS_DATADatawithinaknown,establishedTCPconnectionNIDS_RESET,NIDS_CLOSE,NIDS_TIMED_OUTTCPconnectionisreset,closedgracefully,orwaslostlibnidsdoesn’t

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論