LINUX CH6基于Libnet網(wǎng)絡(luò)編程.ppt_第1頁
LINUX CH6基于Libnet網(wǎng)絡(luò)編程.ppt_第2頁
LINUX CH6基于Libnet網(wǎng)絡(luò)編程.ppt_第3頁
LINUX CH6基于Libnet網(wǎng)絡(luò)編程.ppt_第4頁
LINUX CH6基于Libnet網(wǎng)絡(luò)編程.ppt_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章 Libnet編程技術(shù),第二篇 網(wǎng)絡(luò)編程方法與技術(shù),Unix/Linux系統(tǒng)平臺上的API library,在Unix/Linux系統(tǒng)平臺上的網(wǎng)絡(luò)通信應(yīng)用開發(fā)中,目前最為流行的C API library有: Libnet Libpcap Libnids Libicmp 等。 它們分別從不同層次和角度提供了不同的網(wǎng)絡(luò)功能函數(shù)。使網(wǎng)絡(luò)開發(fā)人員能夠忽略網(wǎng)絡(luò)底層細(xì)節(jié)的實(shí)現(xiàn),從而專注于程序本身具體功能的設(shè)計(jì)與開發(fā)。其中:,Unix/Linux系統(tǒng)平臺上的API library,libnet提供的接口函數(shù)主要用于實(shí)現(xiàn)和封裝了數(shù)據(jù)包的構(gòu)造和發(fā)送過程。 libpcap提供的接口函數(shù)主要用于實(shí)現(xiàn)和封裝了與

2、數(shù)據(jù)包截獲(接收)有關(guān)的過程 。 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/Linux系統(tǒng)平臺上的API library,利用這些C函數(shù)庫的接口,網(wǎng)絡(luò)應(yīng)用開發(fā)人員可以很方便地編寫出具有結(jié)構(gòu)化強(qiáng)、健壯性好、可移植性高等特點(diǎn)的網(wǎng)絡(luò)通信程序。 這些函數(shù)庫在網(wǎng)絡(luò)應(yīng)用開發(fā)中具有很大的實(shí)用價(jià)值,在scanner、sniffer、firewall、IDS等領(lǐng)域都獲得了極其廣泛的應(yīng)用,著名的抓包軟件如tcpdump、ethereal等就是在libpcap的基礎(chǔ)上開發(fā)的。著名

3、的網(wǎng)絡(luò)嗅探器軟件Sniffer就是在libpcap的基礎(chǔ)上開發(fā)的。,6.1.1 Libnet概述 功能:數(shù)據(jù)包構(gòu)造和發(fā)送 libnet是一個(gè)高層API(toolkit),主要用C語言寫成,為應(yīng)用程序設(shè)計(jì)人員提供了低層的網(wǎng)絡(luò)數(shù)據(jù)報(bào)的構(gòu)造、處理和發(fā)送等功能接口。 libnet使得程序員從乏味的報(bào)文創(chuàng)建工作(如多路復(fù)用、緩沖區(qū)管理、神秘的報(bào)頭信息(域、位置、長度)、字節(jié)順序、操作系統(tǒng)相關(guān)問題等)中解脫出來,將精力集中在解決關(guān)鍵問題上。 利用libnet,可以方便、快速、簡單地完成報(bào)文組裝工作,稍加擴(kuò)展,還可以編寫出復(fù)雜的應(yīng)用程序(如Traceroute(路由跟蹤)和ping就可以方便地通過libne

4、t和libpcap來實(shí)現(xiàn))。,6.1 Libnet,Libnet,Libnet的主要特點(diǎn): 高層接口: libnet主要用C語言編寫。 可移植性: libnet可以在多種操作系統(tǒng)上運(yùn)行,并且提供了統(tǒng)一接口。 數(shù)據(jù)報(bào)構(gòu)造: libnet提供了一系列的TCP/IP數(shù)據(jù)報(bào)文的構(gòu)造函數(shù),包括應(yīng)用層(如DNS、RIP、SNMP等)、傳輸層(如TCP、UDP等)、網(wǎng)絡(luò)層(如IP、ARP、ICMP、IGMP、OSPF等)和數(shù)據(jù)鏈路層(如Ethernet幀等),以方便用戶使用。 數(shù)據(jù)報(bào)的處理: libnet提供了一系列的輔助函數(shù),如內(nèi)存管理、地址解釋、報(bào)文校驗(yàn)和的計(jì)算等。 數(shù)據(jù)報(bào)發(fā)送: libnet允許用戶在

5、兩種不同的數(shù)據(jù)報(bào)發(fā)送方法中選擇(原始套接字接口和鏈路層接口)。,Libnet,libnet庫提供的接口函數(shù)包含15種數(shù)據(jù)包生成器和兩種數(shù)據(jù)包發(fā)送器(IP層和數(shù)據(jù)鏈路層)。 libnet庫提供了50多個(gè)C API函數(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ù)、錯(cuò)誤報(bào)告、端口列表管理等,6.1.2 Libnet函數(shù),1. 內(nèi)存管理函

6、數(shù) 單數(shù)據(jù)包內(nèi)存初始化: int libnet_init_packet(u_short packet_size, u_char *buf); 單數(shù)據(jù)包內(nèi)存釋放: void libnet_destroy_packet(u_char *buf); 多數(shù)據(jù)包(緩沖池)內(nèi)存初始化: int libnet_init_packet_arena(struct libnet_arena *arena, u_short packet_num, u_short packet_size); 訪問多數(shù)據(jù)包(緩沖池)內(nèi)存中的下一個(gè)數(shù)據(jù)包: u_char *libnet_next_packet_from_arena(st

7、ruct libnet_arena *arena, u_short packet_size); 多數(shù)據(jù)包內(nèi)存釋放: void libnet_destroy_packet_arena(struct libnet_arena *arena);,Libnet函數(shù),2. 地址解析函數(shù) 解析主機(jī)名: u_char *libnet_host_lookup(u_long ip, u_short use_name); 解析主機(jī)名(可重入函數(shù)): void libnet_host_lookup_r(u_long ip, u_short use_name, u_char *buf); 域名解析: u_long l

8、ibnet_name_resolve(u_char *ip, u_short use_name); 獲取接口設(shè)備IP地址: u_long libnet_get_ipaddr(struct libnet_link_int *l, const u_char *device, const u_char *ebuf); 獲取接口設(shè)備硬件地址: struct ether_addr *libnet_get_hwaddr(struct libnet_link_int *l, const u_char *device, const u_char *ebuf);,Libnet函數(shù),3. 數(shù)據(jù)包構(gòu)造函數(shù) ARP協(xié)

9、議數(shù)據(jù)包 DNS協(xié)議數(shù)據(jù)包 以太網(wǎng)幀數(shù)據(jù)包 IGMP協(xié)議數(shù)據(jù)包 IP協(xié)議數(shù)據(jù)包 IP協(xié)議數(shù)據(jù)包選項(xiàng) UDP協(xié)議數(shù)據(jù)包 TCP協(xié)議數(shù)據(jù)包 TCP協(xié)議數(shù)據(jù)包選項(xiàng),Libnet函數(shù),3. 數(shù)據(jù)包構(gòu)造函數(shù) ICMP協(xié)議數(shù)據(jù)包(ICMP_ECHO / ICMP_ECHOREPLY 回聲請求/應(yīng)答)-Ping ICMP協(xié)議數(shù)據(jù)包(ICMP_MASKREQ / ICMP_MASKREPLY 地址掩馬請求/應(yīng)答) ICMP協(xié)議數(shù)據(jù)包(ICMP_UNREACH 目的地不可達(dá)) ICMP協(xié)議數(shù)據(jù)包(ICMP_TIMEXCEED 超時(shí)) ICMP協(xié)議數(shù)據(jù)包(ICMP_REDIRECT 路由重定向) ICMP協(xié)議數(shù)據(jù)

10、包(ICMP_TSTAMP / ICMP_TSTAMPREPLY 時(shí)間戳請求/應(yīng)答),Libnet函數(shù),3. 數(shù)據(jù)包構(gòu)造函數(shù) RIP路由協(xié)議數(shù)據(jù)包 OSPF路由協(xié)議數(shù)據(jù)包 OSPF路由協(xié)議數(shù)據(jù)包(Hello) OSPF路由協(xié)議數(shù)據(jù)包(DataBase Description (DBD) OSPF路由協(xié)議數(shù)據(jù)包(Link State Request (LSR) OSPF路由協(xié)議數(shù)據(jù)包(Link State Update (LSU) OSPF路由協(xié)議數(shù)據(jù)包(Link State Acknowledgement (LSA) OSPF路由協(xié)議數(shù)據(jù)包(Link State Router) OSPF路由協(xié)

11、議數(shù)據(jù)包(Link State Summary) OSPF路由協(xié)議數(shù)據(jù)包(Link State AS External),Libnet函數(shù),4. 數(shù)據(jù)包發(fā)送函數(shù) 打開raw socket: int libnet_open_raw_sock(int protocol); 關(guān)閉raw socket: int libnet_close_raw_sock(int socket); 選擇接口設(shè)備: int libnet_select_device(struct sockaddr_in *sin, u_char *device, u_char *ebuf); 打開鏈路層接口設(shè)備: struct libne

12、t_link_int *libnet_open_link_interface (char *device,char *ebuf); 關(guān)閉鏈路層接口設(shè)備:int libnet_close_link_interface(struct libnet_link_int *l);,Libnet函數(shù),發(fā)送IP數(shù)據(jù)包: int libnet_write_ip(int socket, u_char *packet, int packet_size); 發(fā)送鏈路層數(shù)據(jù)包: int libnet_write_link_layer(struct libnet_link_int *l, const u_char *d

13、evice, u_char *packet, int packet_size); 檢驗(yàn)和計(jì)算: int libnet_do_checksum(u_char *packet, int protocol, int packet_size);,Libnet函數(shù),5. 相關(guān)的支持函數(shù) 隨機(jī)數(shù)種子生成器 獲取隨機(jī)數(shù) 16進(jìn)制數(shù)據(jù)輸出顯示 端口列表鏈初始化 獲取端口列表鏈的下一項(xiàng)(端口范圍) 端口列表鏈輸出顯示 獲取端口列表鏈 端口列表鏈內(nèi)存釋放,Libnet函數(shù),6. 數(shù)據(jù)常量 (1)數(shù)據(jù)包頭大小定義: 常量名 數(shù)值(字節(jié)數(shù)) LIBNET_ETH_H 14 LIBNET_IP_H 20 LIBNET_

14、RIP_H 24 LIBNET_TCP_H 20 LIBNET_UDP_H 8 LIBNET_ARP_H 28 LIBNET_DNS_H 12 LIBNET_ICMP_H 4 LIBNET_ICMP_ECHO_H 8 LIBNET_ICMP_MASK_H 12 LIBNET_ICMP_UNREACH_H 8 LIBNET_ICMP_TIMXCEED_H 8 LIBNET_ICMP_REDIRECT_H 8 LIBNET_ICMP_TS_H 20 LIBNET_IGMP_H 8,Libnet函數(shù),(2)數(shù)據(jù)包內(nèi)存常量 常量名 含義 LIBNET_PACKET TCP/UDP數(shù)據(jù)包頭 + IP數(shù)據(jù)

15、包頭使用的內(nèi)存 LIBNET_OPTS IP或TCP選項(xiàng)使用的內(nèi)存 LIBNET_MAX_PACKET IP_MAXPACKET (65535字節(jié))使用的內(nèi)存 (3)隨機(jī)數(shù)發(fā)生器常量(Libnet_get_prand()函數(shù)使用) (4)錯(cuò)誤消息常量(Libnet_error()函數(shù)使用) (5) Libnet_host_lookup()、Libnet_host_lookup_r()和Libnet_name_resolve()函數(shù)使用的常量 (6)宏定義,6.1.3 Libnet使用方法,Libnet提供兩種方式將數(shù)據(jù)報(bào)發(fā)送到網(wǎng)絡(luò)的接口: 原始套接字(raw Socket)接口和鏈路層(lin

16、k layer)接口。鏈路層接口稍復(fù)雜些,且需要更多的代碼。原始套接字接口則簡單,且運(yùn)行速度較快。這兩種方式的函數(shù)對比如教材P161表6-1所示。,利用Libnet函數(shù)庫開發(fā)應(yīng)用程序的基本步驟非常簡單,大致過程如下: 1)數(shù)據(jù)包內(nèi)存初始化 2)網(wǎng)絡(luò)接口初始化 3)構(gòu)造所需的數(shù)據(jù)包 4)計(jì)算數(shù)據(jù)包的校驗(yàn)和 5)發(fā)送數(shù)據(jù)包 6)關(guān)閉網(wǎng)絡(luò)接口 7)釋放數(shù)據(jù)包內(nèi)存,原始套接字接口 libnet_init_packet(); libnet_open_raw_sock(); libnet_build_ip(); libnet_build_tcp(); libnet_do_checksum(); libne

17、t_write_ip(); libnet_close_raw_sock(); libnet_destroy_packet();,6.1.3 Libnet使用方法,6.1.3 Libnet使用方法,1. 網(wǎng)絡(luò)初始化 應(yīng)用Libnet庫的應(yīng)用程序,首先要激活網(wǎng)絡(luò)發(fā)送接口。 對原始套接字接口和數(shù)據(jù)鏈路層接口分別調(diào)用相應(yīng)函數(shù)。 2. 內(nèi)存分配 網(wǎng)絡(luò)初始化完成后需要為數(shù)據(jù)報(bào)分配內(nèi)存。同樣,對原始套接字接口和數(shù)據(jù)鏈路層接口分別調(diào)用相應(yīng)函數(shù)。當(dāng)數(shù)據(jù)報(bào)處理完后,占用的內(nèi)存要釋放。 另外一種內(nèi)存分配方法是通過緩沖池,即在Libnet庫的調(diào)用里分配大量的塊內(nèi)存。,6.1.3 Libnet使用方法,3. 數(shù)據(jù)報(bào)構(gòu)建

18、 對于每一個(gè)協(xié)議層,都有一個(gè)相應(yīng)的Libnet構(gòu)建函數(shù)。對于原始套接字接口,libnet_build_ip()和libnet_build_tcp()將被調(diào)用;對已鏈路層接口,libnet_build_ethernet()將被調(diào)用。 數(shù)據(jù)報(bào)構(gòu)造模式如教材P162圖6-1所示。,構(gòu)造以太幀數(shù)據(jù)包,int libnet_build_ethernet(u_char *daddr, u_char *saddr, u_short type,const u_char *payload, int payload_len, u_char *packet_buf); 例:構(gòu)造一個(gè)不含數(shù)據(jù)的以太幀 * Packet

19、 construction (ethernet header). */ libnet_build_ethernet( enet_dst, enet_src, ETHERTYPE_IP, NULL, 0, packet); /*,Ethernet幀,Dest.Address,SourceAddress,Type,Info,CRC,ARP協(xié)議數(shù)據(jù)包,int libnet_build_arp(u_short hrdw, u_short prot, u_short h_len,u_short p_len, u_short op, u_char *s_ha,u_char *s_pa, u_char *t

20、_ha, u_char *t_pa, const u_char *payload, int payload_len, u_char *packet_buf);,構(gòu)造ARP協(xié)議數(shù)據(jù)包,t = libnet_build_arp( ARPHRD_ETHER, /* hardware addr */ ETHERTYPE_IP, /* protocol addr */ 6, /* hardware addr size */ 4, /* protocol addr size */ ARPOP_REPLY, /* operation type */ enet_src, /* sender hardware

21、addr */ ip_src, /* sender protocol addr */ enet_dst, /* target hardware addr */ ip_dst, /* target protocol addr */ NULL, /* payload */ 0, /* payload size */ packet); /* packet buffer */ if (t = -1) fprintf(stderr, Cant build ARP header: %sn, libnet_geterror(l); goto bad; ,IP協(xié)議數(shù)據(jù)包,構(gòu)造IP分組數(shù)據(jù)包: int libn

22、et_build_ip(u_short len, u_char tos, u_short ip_id, u_short frag, u_char ttl, u_char protocol, u_long saddr, u_long daddr, const u_char *payload, int payload_len,u_char *packet_buf);,校驗(yàn)和與選項(xiàng)單獨(dú)處理,構(gòu)造IP協(xié)議數(shù)據(jù)包,libnet_build_ip(LIBNET_IP_H, /* size of the IP header */ IPTOS_LOWDELAY, /* IP tos */ 242, /* IP

23、 ID */ 0, /* frag stuff */ 48, /* TTL */ IPPROTO_TCP, /* transport control protocol */ src_ip, /* source IP address */ dst_ip, /* destination IP address */ NULL, /* payload (none) */ 0, /* payload length */ packet); /* packet header memory */,TCP/UDP協(xié)議數(shù)據(jù)包,TCP協(xié)議數(shù)據(jù)包構(gòu)造: int libnet_build_tcp(u_short th_

24、sport, u_short th_dport, u_long th_seq, u_long th_ack, u_char th_flags, u_short th_win, u_short th_urg, const u_char *payload, int payload_len, u_char *packet_buf); UDP協(xié)議數(shù)據(jù)包構(gòu)造: int libnet_build_udp(u_short sport, u_short dport, const u_char *payload,int payload_len, u_char *packet_buf);,構(gòu)造TCP協(xié)議數(shù)據(jù)包,*

25、 Packet construction (TCP header). */ libnet_build_tcp(src_prt, /* source TCP port */ dst_prt, /* destination TCP port */ 0 xa1d95, /* sequence number */ 0 x53, /* acknowledgement number */ TH_SYN, /* control flags */ 1024, /* window size */ 0, /* urgent pointer */ NULL, /* payload (none) */ 0, /* p

26、ayload length */ packet + LIBNET_IP_H); /* packet header memory */,Libnet使用方法,4. 數(shù)據(jù)報(bào)校驗(yàn)和 Libnet庫調(diào)用函數(shù)來計(jì)算TCP/IP協(xié)議的校驗(yàn)和。 libnet_do_checksum(u_char *packet, int protocol, int packet_size)進(jìn)行校驗(yàn)。 校驗(yàn)的協(xié)議由參數(shù)protocol 決定。 例: if (libnet_do_checksum(packet, IPPROTO_IP, LIBNET_IP_H) = -1) libnet_error(LIBNET_ERR_FAT

27、AL, libnet_do_checksum failedn); ,Libnet使用方法,5. 數(shù)據(jù)報(bào)發(fā)送 最后一步是將數(shù)據(jù)報(bào)發(fā)送到網(wǎng)絡(luò)中。分為兩種情況:使用原始套接字接口方式和使用鏈路層接口方式。 6. 關(guān)閉網(wǎng)絡(luò)接口 (1)關(guān)閉raw Socket (2)關(guān)閉鏈路層接口設(shè)備 7. 退出、釋放數(shù)據(jù)包內(nèi)存,6.1.4 Libnet應(yīng)用實(shí)例,Libnet的安裝。以libnet1.1.2.1為例,安裝步驟為: # tar -zxvf libnet.tar.gz # cd libnet # ./configure # make # make install,綜合使用libnet和libpcap:ARP

28、例程,綜合使用libnet和libpcap可以構(gòu)造強(qiáng)有力的網(wǎng)絡(luò)分析、診斷、和應(yīng)用程序。一個(gè)具有普遍意義的綜合使用libnet和libpcap的程序的原理框架如圖1所示:,綜合使用libnet和libpcap:ARP例程,本節(jié)給出一個(gè)綜合應(yīng)用libnet和libpcap的簡單例程,其功能是在接收到一個(gè)來自特定主機(jī)的ARP請求報(bào)文之后,發(fā)出ARP回應(yīng)報(bào)文,通知該主機(jī)請求的IP地址對應(yīng)的MAC地址。這個(gè)程序?qū)崿F(xiàn)了標(biāo)準(zhǔn)的ARP協(xié)議,但是卻不同于操作系統(tǒng)內(nèi)核中標(biāo)準(zhǔn)的實(shí)現(xiàn)方法。該程序利用了libpcap在數(shù)據(jù)鏈路層抓包,利用了libnet向數(shù)據(jù)鏈路層發(fā)包,是使用libnet和libpcap構(gòu)造TCP/IP

29、協(xié)議軟件的一個(gè)例程。,ARP協(xié)議,ARP協(xié)議是“Address Resolution Protocol”(地址解析協(xié)議)的縮寫。在局域網(wǎng)中,網(wǎng)絡(luò)中實(shí)際傳輸?shù)氖恰皫?,幀里面是有目?biāo)主機(jī)的MAC地址的。在以太網(wǎng)中,一個(gè)主機(jī)要和另一個(gè)主機(jī)進(jìn)行直接通信,必須要知道目標(biāo)主機(jī)的MAC地址。但這個(gè)目標(biāo)MAC地址是如何獲得的呢?它就是通過地址解析協(xié)議獲得的。所謂“地址解析”就是主機(jī)在發(fā)送幀前將目標(biāo)IP地址轉(zhuǎn)換成目標(biāo)MAC地址的過程。 ARP協(xié)議的基本功能就是通過目標(biāo)設(shè)備的IP地址,查詢目標(biāo)設(shè)備的MAC地址,以保證通信的順利進(jìn)行。具體來說, ARP(Address Resolution Protocol)地址解析協(xié)議用于將計(jì)算機(jī)的網(wǎng)絡(luò)地址(IP地址32位)轉(zhuǎn)化為物理地址(MAC地址48位)。ARP協(xié)議是屬于鏈路層的協(xié)議,在以太網(wǎng)中

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論