Libpcap開發集介紹

libpcap是一個C語言庫,libpcap的英文意思是 Packet Capture library,即數據包捕獲函數庫,其功能是通過網卡抓取網絡以太網中的數據包。這個庫爲不同的平臺提供了一致的c函數編程接口,在安裝了 libpcap 的平臺上,以 libpcap 爲接口寫的程序、應用,能夠自由地跨平臺使用。它支持多種操作系統。libpcap 結構簡單,使用方便;它提供了20多個api封裝函數,我們利用這些api函數即可完成本網絡探測器所需的網絡數據包監聽功能。

Libpcap開發庫的應用

  • 網絡統計軟件
  • 入侵檢測系統
  • 網絡調試
  • 數據包過濾,支持過濾機制BPF

Libpcap開發庫使用說明

基於pcap的嗅探器程序的總體架構,其流程如下:

  1. 首先要決定用哪一個接口進行嗅探開始。在Linux中,這可能是eth0,而在BSD系統中則可能是xl1等等。我們也可以用一個字符串來定義這個設備,或者採用pcap提供的接口名來工作。
  2. 初始化pcap。在這裏需要告訴pcap對什麼設備進行嗅探。假如願意的話,我們還可以嗅探多個設備。怎樣區分它們呢?使用 文件句柄。就像打開一個文件進行讀寫一樣,必須命名我們的嗅探“會話”,以此使它們各自區別開來。
  3. 如果只想嗅探特定的傳輸(如TCP/IP包,發往端口23的包等等),我們必須創建一個規則集合,編譯並且使用它。這個過程分爲三個相互緊密關聯的階段。 規則集合被置於一個字符串內,並且被轉換成能被pcap讀的格式(因此編譯它)。編譯實際上就是在我們的程序裏調用一個不被外部程序使用的函數。接下來我 們要告訴 pcap使用它來過濾出我們想要的那一個會話。(此步驟可選)
  4. 最後,我們告訴pcap進入它的主體執行循環。在這個階段內pcap一直工作到它接收了所有我們想要的包爲止。每當它收到一個包就調用另一個已經定義好的 函數,這個函數可以做我們想要的任何工作,它可以剖析所部獲的包並給用戶打印出結果,它可以將結果保存爲一個文件,或者什麼也不作。
  5. 在嗅探到所需的數據後,我們要關閉會話並結束。

Libpcap庫主要函數說明

函數名稱:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
函數功能:獲得用於捕獲網絡數據包的數據包捕獲描述字。
參數說明:device 參數爲指定打開的網絡設備名。snaplen參數定義捕獲數據的最大字節數。promisc指定是否將網絡接口置於混雜模式。to_ms參數指*定超時時 間(毫秒)。ebuf參數則僅在pcap_open_live()函數出錯返回NULL時用於傳遞錯誤消息。

函數名稱:pcap_t *pcap_open_offline(char *fname, char *ebuf)
函數功能:打開以前保存捕獲數據包的文件,用於讀取。
參數說明:fname參數指定打開的文件名。該文件中的數據格式與tcpdump和tcpslice兼容。”-“爲標準輸入。ebuf參數則僅在pcap_open_offline()函數出錯返回NULL時用於傳遞錯誤消息。

函數名稱:pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)
函數功能:打開用於保存捕獲數據包的文件,用於寫入。
參數說明:fname 參數爲”-“時表示標準輸出。出錯時返回NULL。p參數爲調用pcap_open_offline()或pcap_open_live()函數後返回的 pcap結構指針。fname參數指定打開的文件名。如果返回NULL,則可調用pcap_geterr()函數獲取錯誤消 息。

函數名稱:char *pcap_lookupdev(char *errbuf)
函數功能:用於返回可被pcap_open_live()或pcap_lookupnet()函數調用的網絡設備名指針。參數說明:如果函數出錯,則返回NULL,同時errbuf中存放相關的錯誤消息。

函數名稱:int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf)
函數功能:獲得指定網絡設備的網絡號和掩碼。
參數說明:netp參數和maskp參數都是bpf_u_int32指針。如果函數出錯,則返回-1,同時errbuf中存放相關的錯誤消息。

函數名稱:int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user)
函數功能:捕獲並處理數據包。
參數說明:cnt 參數指定函數返回前所處理數據包的最大值。cnt=-1表示在一個緩衝區中處理所有的數據包。cnt=0表示處理所有數據包,直到產生以下錯誤之一:讀取 到EOF;超時讀取。callback參數指定一個帶有三個參數的回調函數,這三個參數爲:一個從pcap_dispatch()函數傳遞過來的 u_char指針,一個pcap_pkthdr結構的指針,和一個數據包大小的u_char指針。如果成功則返回讀取到的字節數。讀取到EOF時則返回零 值。出錯時則返回-1,此時可調用pcap_perror()或pcap_geterr()函數獲取錯誤消息。

函數名稱:int pcap_loop(pcap_t *p, int cnt,pcap_handler callback, u_char *user)
函數功能: 功能基本與pcap_dispatch()函數相同,只不過此函數在cnt個數據包被處理或出現錯誤時才返回,但讀取超時不會返回。而如果爲 pcap_open_live()函數指定了一個非零值的超時設置,然後調用pcap_dispatch()函數,則當超時發生時 pcap_dispatch()函數會返回。cnt參數爲負值時pcap_loop()函數將始終循環運行,除非出現錯誤。

函數名稱:void pcap_dump(u_char *user, struct pcap_pkthdr *h,u_char *sp)
函數功能:向調用pcap_dump_open()函數打開的文件輸出一個數據包。該函數可作爲pcap_dispatch()函數的回調函數。

函數名稱:int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask)
函數功能:將str參數指定的字符串編譯到過濾程序中。
參數說明:fp是一個bpf_program結構的指針,在pcap_compile()函數中被賦值。optimize參數控制結果代碼的優化。netmask參數指定本地網絡的網絡掩碼。

函數名稱:int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
函數功能:指定一個過濾程序。
參數說明:fp參數是bpf_program結構指針,通常取自pcap_compile()函數調用。出錯時返回-1;成功時返回0。

函數名稱:u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
函數功能:返回指向下一個數據包的u_char指針。

函數名稱:int pcap_datalink(pcap_t *p)
函數功能:返回數據鏈路層類型,例如DLT_EN10MB。

函數名稱:int pcap_snapshot(pcap_t *p)
函數功能:返回pcap_open_live被調用後的snapshot參數值。

函數名稱:int pcap_is_swapped(pcap_t *p)
函數功能:返回當前系統主機字節與被打開文件的字節順序是否不同。

函數名稱:int pcap_major_version(pcap_t *p)
函數功能:返回寫入被打開文件所使用的pcap函數的主版本號。

函數名稱:int pcap_minor_version(pcap_t *p)
函數功能:返回寫入被打開文件所使用的pcap函數的輔版本號。

函數名稱:int pcap_stats(pcap_t *p, struct pcap_stat *ps)
函數功能:向pcap_stat結構賦值。成功時返回0。這些數值包括了從開始捕獲數據以來至今共捕獲到的數據包統計。如果出錯或不支持數據包統計,則返回-1,且可調用pcap_perror()或pcap_geterr()函數來獲取錯誤消息。

函數名稱:FILE *pcap_file(pcap_t *p)
函數功能:返回被打開文件的文件名。

函數名稱:int pcap_fileno(pcap_t *p)
函數功能:返回被打開文件的文件描述字號碼。

函數名稱:void pcap_perror(pcap_t *p, char *prefix)
函數功能:在標準輸出設備上顯示最後一個pcap庫錯誤消息。以prefix參數指定的字符串爲消息頭。

函數名稱:char *pcap_geterr(pcap_t *p)
函數功能:返回最後一個pcap庫錯誤消息。

函數名稱:char *pcap_strerror(int error)
函數功能:如果strerror()函數不可用,則可調用pcap_strerror函數替代。

函數名稱:void pcap_close(pcap_t *p)
函數功能:關閉p參數相應的文件,並釋放資源。

函數名稱:void pcap_dump_close(pcap_dumper_t *p)
函數功能:關閉相應的被打開文件。

Libpcap開發庫安裝

  1. 到網站www.tcpdump.org下載最新版 libpcap-0.9.6.tar.gz
  2. 解壓安裝包:tar –zxvf libpcap-0.9.6.tar.gz, 產生目錄libpcap-0.9.6
  3. cd libpcap-0.9.6
  4. ./configure
  5. Make;make installl

在Turbolinux系列產品中,libpcap已經是基本庫之一,不必再進行下載配置。

Libpcap開發庫使用舉例

下面是一段數據包捕獲程序test.c,每捕獲一個數據包時打印信息“A packet is captured!”。

  #include <stdio.h>
  #include <pcap.h>

  int main (int argc, char* argv[])
  {
          /*the printer running when packet have captured*/
          void printer()
          {
                  printf("A packet is captured!\n");
                  return;
          }

          /*the error code buf of libpcap*/
          char ebuf[PCAP_ERRBUF_SIZE];
          /*create capture handler of libpcap*/
          pcap_t *pd = pcap_open_live ("eth0", 68, 0, 1000, ebuf);

          /*start the loop of capture, loop 5 times, enter printer when capted*/
          pcap_loop (pd, 5, printer, NULL);

          pcap_close (pd);
          return 0;
  }
  1. 編譯gcc –o test test.c –lpcap
  2. 運行./test
  3. 輸出結果:
  A packet is captured!
  A packet is captured!
  A packet is captured!
  A packet is captured!
  A packet is captured!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章