(一)
數(shù)據(jù)結(jié)構(gòu)
·1) typedef struct _ADAPTER ADAPTER
//描述一個(gè)網(wǎng)絡(luò)適配器,;
·2) typedef struct _PACKET PACKET
//描述一組網(wǎng)絡(luò)數(shù)據(jù)報(bào)的結(jié)構(gòu),;
·3) typedef struct NetType NetType
//描述網(wǎng)絡(luò)類(lèi)型的數(shù)據(jù)結(jié)構(gòu),;
·4) typedef struct npf_if_addr npf_if_addr //描述一個(gè)網(wǎng)絡(luò)適配器的ip地址,;
·5) struct bpf_hdr //數(shù)據(jù)報(bào)頭部,;
·6) struct bpf_stat //當(dāng)前捕獲數(shù)據(jù)報(bào)的統(tǒng)計(jì)信息,。
函數(shù)
1)int pcap_findalldevs ( pcap_if_t ** alldevsp, char * errbuf)
功能:列出當(dāng)前所有可用的網(wǎng)絡(luò)設(shè)備(網(wǎng)卡)
所在頭文件:pcap.h
參數(shù)說(shuō)明: pcap_if_t ** alldevsp
指向pcap_if_t結(jié)構(gòu)列表的指針的地址,。實(shí)際使用時(shí),,聲明一個(gè)pcap_if_t結(jié)構(gòu)的指針(pcap_if_t *
alldevsp),然后把該地址作為參數(shù)傳入即可(&alldevsp),。 char * errbuf
錯(cuò)誤緩沖區(qū),,要求長(zhǎng)度至少為PCAP_ERRBUF_SIZE 字節(jié)
返回值: -1:出錯(cuò),將會(huì)向錯(cuò)誤緩沖中填充錯(cuò)誤信息,,錯(cuò)誤信息為ASCII碼,,可以直接打印出來(lái)。
0:正確返回,,可以使用alldevsp訪(fǎng)問(wèn)所有網(wǎng)絡(luò)硬件
pcap_if的結(jié)構(gòu)
Struct pcap_if { struct pcap_if *next;
char *name; chat *description; struct pcap_addr
address; u_int flags; }
也可以用pcap_if_t 代替pcap_if 2)
pcap_t * pcap_open_live ( char * device, int snaplen, int promisc,int to_ms, char * errbuf );
獲取一個(gè)包捕捉句柄,,類(lèi)似文件操作函數(shù)使用的文件句柄。
device指定網(wǎng)絡(luò)接口設(shè)備名,。 snaplen指定單包最大捕捉字節(jié)數(shù),。
promisc指定網(wǎng)絡(luò)接口進(jìn)入混雜模式。
to_ms指定毫秒級(jí)讀超時(shí),,0可能代表永不超時(shí),。
errbuf包含失敗原因。 如果調(diào)用失敗返回NULL
3)void pcap_close ( pcap_t *p )
該函數(shù)用于關(guān)閉pcap_open_live()獲取的包捕捉句柄,,釋放相關(guān)資源,。 4)int pcap_lookupnet ( char * device, bpf_u_int32 * netp, pf_u_int32 * maskp, char * errbuf );
該函數(shù)用于獲取指定網(wǎng)絡(luò)接口的IP地址、子網(wǎng)掩碼,。
5)int pcap_compile ( pcap_t * p, struct bpf_program * fp, char * str,int optimize
, bpf_u_int32 netmask );
該函數(shù)用于解析過(guò)濾規(guī)則串,,填寫(xiě)bpf_program結(jié)構(gòu)。str指向過(guò)濾規(guī)則串,。 6)int pcap_setfilter ( pcap_t * p, struct bpf_program * fp );
該函數(shù)用于設(shè)置pcap_compile()解析完畢的過(guò)濾規(guī)則,,完全可以自己提供過(guò)濾規(guī)則,無(wú)須pcap_compile()介入
7)
int pcap_dispatch ( pcap_t * p, int cnt, pcap_handler callback,
u_char * user );
捕捉報(bào)文以及分發(fā)報(bào)文到預(yù)先指定好的處理函數(shù)(回調(diào)函數(shù)),。 pcap_dispatch()接收夠cnt個(gè)報(bào)文便返回,,如果cnt為-1意味著所有報(bào)文集中在一個(gè)緩沖區(qū)中。如果cnt為0,,僅當(dāng)發(fā)生錯(cuò)誤,、讀取到EOF或者讀超時(shí)到了(pcap_open_live中指定)才停止捕捉報(bào)文并返回。
8)int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char
*user),;
這里pcap_loop的作用是抓包,,每抓到一個(gè)包之后就調(diào)用callback函數(shù)來(lái)處理之,callback需要你自己編寫(xiě),,callback的類(lèi)似于這種:
void
PacketCallback(u_char *user, const struct pcap_pkthdr *h, const u_char
*p);
你給出的代碼是定義了一個(gè)函數(shù)指針grinder_t的類(lèi)型,,就可以用grinder_t來(lái)聲明函數(shù)指針了 grinder應(yīng)該就是作為一個(gè)回調(diào)函數(shù)來(lái)處理pcap抓到的包
pcap_loop和callback之間參數(shù)存在聯(lián)系,,pcap_loop的最后一個(gè)參數(shù)user是留給用戶(hù)使用的,,當(dāng)callback被調(diào)用的時(shí)候這個(gè)值會(huì)傳遞給callback的第一個(gè)參數(shù)(也叫user),callback的最后一個(gè)參數(shù)p指向一塊內(nèi)存空間,,這個(gè)空間中存放的就是pcap_loop抓到的數(shù)據(jù)包,。callback的第二個(gè)參數(shù)是一個(gè)結(jié)構(gòu)體指針,該結(jié)構(gòu)體定義如下: struct
pcap_pkthdr { struct timeval ts; bpf_u_int32 caplen;
bpf_u_int32
len; }; 這個(gè)結(jié)構(gòu)體是由pcap_loop自己填充的,,用來(lái)取得一些關(guān)于數(shù)據(jù)包的信息 所以,,在callback函數(shù)當(dāng)中只有第一個(gè)user指針是可以留給用戶(hù)使用的,如果你想給callback傳遞自己參數(shù),,那就只能通過(guò)pcap_loop的最后一個(gè)參數(shù)user來(lái)實(shí)現(xiàn)了
(二)
在函數(shù) pcap_open_live(), pcap_open_dead(), pcap_open_offline(),
pcap_setnonblock(), pcap_getnonblock(), pcap_findalldevs(), pcap_lookupdev(), 和
pcap_lookupnet() 中的errbuf假定至少有 PCAP_ERRBUF_SIZE 個(gè)字符,。
typedef void(*) pcap_handler (u_char *user, const struct pcap_pkthdr
*pkt_header, const u_char *pkt_data) 接受數(shù)據(jù)包的回調(diào)函數(shù)的原型
pcap_t * pcap_open_live (const char *device, int snaplen, int promisc, int
to_ms, char *ebuf) 在網(wǎng)絡(luò)中打開(kāi)一個(gè)活動(dòng)的捕獲
pcap_t * pcap_open_dead (int linktype, int
snaplen) 在還沒(méi)開(kāi)始捕獲時(shí),創(chuàng)建一個(gè)pcap_t的結(jié)構(gòu)體
pcap_t * pcap_open_offline (const char *fname, char *errbuf) 打開(kāi)一個(gè)
tcpdump/libpcap 格式的存儲(chǔ)文件,,來(lái)讀取數(shù)據(jù)包
pcap_dumper_t * pcap_dump_open (pcap_t *p, const char
*fname) 打開(kāi)一個(gè)文件來(lái)寫(xiě)入數(shù)據(jù)包
int pcap_setnonblock (pcap_t *p, int nonblock, char
*errbuf) 在阻塞和非阻塞模式間切換
int pcap_getnonblock (pcap_t *p, char *errbuf) 獲得一個(gè)接口的非阻塞狀態(tài)信息
int pcap_findalldevs (pcap_if_t **alldevsp, char *errbuf) 構(gòu)造一個(gè)可打開(kāi)的網(wǎng)絡(luò)設(shè)備的列表
pcap_open_live()
void pcap_freealldevs (pcap_if_t *alldevsp) 釋放一個(gè)接口列表,,這個(gè)列表將被
pcap_findalldevs()返回
char * pcap_lookupdev (char *errbuf) 返回系統(tǒng)中第一個(gè)合法的設(shè)備
int pcap_lookupnet (const char *device, bpf_u_int32 *netp, bpf_u_int32
*maskp, char *errbuf) 返回接口的子網(wǎng)和掩碼
int pcap_dispatch (pcap_t *p, int cnt, pcap_handler callback, u_char
*user) 收集一組數(shù)據(jù)包
int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char
*user) 收集一組數(shù)據(jù)包
u_char * pcap_next (pcap_t *p, struct pcap_pkthdr *h) 返回下一個(gè)可用的數(shù)據(jù)包
int pcap_next_ex (pcap_t *p, struct pcap_pkthdr **pkt_header, const u_char
**pkt_data) 從一個(gè)設(shè)備接口,或從一個(gè)脫機(jī)文件中,,讀取一個(gè)數(shù)據(jù)包
void pcap_breakloop (pcap_t *) 設(shè)置一個(gè)標(biāo)志位,,這個(gè)標(biāo)志位會(huì)強(qiáng)制 pcap_dispatch() 或
pcap_loop() 返回,而不是繼續(xù)循環(huán),。
int pcap_sendpacket (pcap_t *p, u_char *buf, int size) 發(fā)送一個(gè)原始數(shù)據(jù)包
void pcap_dump (u_char *user, const struct pcap_pkthdr *h, const u_char
*sp) 將數(shù)據(jù)包保存到磁盤(pán)
long pcap_dump_ftell (pcap_dumper_t *) 返回存儲(chǔ)文件的文件位置
int pcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize,
bpf_u_int32 netmask) 編譯數(shù)據(jù)包過(guò)濾器,,將程序中高級(jí)的過(guò)濾表達(dá)式,轉(zhuǎn)換成能被內(nèi)核級(jí)的過(guò)濾引擎所處理的東西,。 (參見(jiàn)
過(guò)濾表達(dá)式語(yǔ)法)
int pcap_compile_nopcap (int snaplen_arg, int linktype_arg, struct
bpf_program *program, char *buf, int optimize, bpf_u_int32
mask) 在不需要打開(kāi)適配器的情況下,,編譯數(shù)據(jù)包過(guò)濾器。這個(gè)函數(shù)能將程序中高級(jí)的過(guò)濾表達(dá)式,,轉(zhuǎn)換成能被內(nèi)核級(jí)的過(guò)濾引擎所處理的東西,。
(參見(jiàn)過(guò)濾表達(dá)式語(yǔ)法)
int pcap_setfilter (pcap_t *p, struct bpf_program *fp) 在捕獲過(guò)程中綁定一個(gè)過(guò)濾器
void pcap_freecode (struct bpf_program *fp) 釋放一個(gè)過(guò)濾器
int pcap_datalink (pcap_t *p) 返回適配器的鏈路層
int pcap_list_datalinks (pcap_t *p, int **dlt_buf) 列出數(shù)據(jù)鏈
int pcap_set_datalink (pcap_t *p, int
dlt) 將當(dāng)前pcap描述符的數(shù)據(jù)鏈的類(lèi)型,設(shè)置成dlt給出的類(lèi)型,。返回-1表示設(shè)置失敗,。
int pcap_datalink_name_to_val (const char
*name) 轉(zhuǎn)換一個(gè)數(shù)據(jù)鏈類(lèi)型的名字,即將具有DLT_remove的DLT_name,,轉(zhuǎn)換成符合數(shù)據(jù)鏈類(lèi)型的值,。轉(zhuǎn)換是區(qū)分大小寫(xiě)的,返回-1表示錯(cuò)誤,。
const char * pcap_datalink_val_to_name (int
dlt) 將數(shù)據(jù)鏈類(lèi)型值轉(zhuǎn)換成合適的數(shù)據(jù)鏈類(lèi)型的名字,。返回NULL表示轉(zhuǎn)換失敗。
const char * pcap_datalink_val_to_description (int
dlt) 將數(shù)據(jù)鏈類(lèi)型值轉(zhuǎn)換成合適的數(shù)據(jù)鏈類(lèi)型的簡(jiǎn)短的名字,。返回NULL表示轉(zhuǎn)換失敗,。
int pcap_snapshot (pcap_t *p) 返回發(fā)送給應(yīng)用程序的數(shù)據(jù)包部分的大小(字節(jié))
int pcap_is_swapped (pcap_t *p) 當(dāng)前存儲(chǔ)文件使用與當(dāng)前系統(tǒng)不同的字節(jié)序列時(shí),返回true
int pcap_major_version (pcap_t *p) 返回正在用來(lái)寫(xiě)入存儲(chǔ)文件的pcap庫(kù)的主要版本號(hào)
int pcap_minor_version (pcap_t *p) 返回正在用來(lái)寫(xiě)入存儲(chǔ)文件的pcap庫(kù)的次要版本號(hào)
FILE * pcap_file (pcap_t *p) 返回一個(gè)脫機(jī)捕獲文件的標(biāo)準(zhǔn)流
int pcap_stats (pcap_t *p, struct pcap_stat *ps) 返回當(dāng)前捕獲的統(tǒng)計(jì)信息
void pcap_perror (pcap_t *p, char
*prefix) 在標(biāo)準(zhǔn)錯(cuò)誤輸出臺(tái)打印最后一次pcap庫(kù)錯(cuò)誤的文本信息,,前綴是prefix,。
char * pcap_geterr (pcap_t *p) 返回最后一次pcap庫(kù)錯(cuò)誤的文本信息
char * pcap_strerror (int error) 提供這個(gè)函數(shù),,以防 strerror() 不能使用。
const char * pcap_lib_version
(void) 返回一個(gè)字符串,,這個(gè)字符串保存著libpcap庫(kù)的版本信息,。注意,它除了版本號(hào),,還包含了更多的信息,。
void pcap_close (pcap_t *p) 關(guān)閉一個(gè)和p關(guān)聯(lián)的文件,并釋放資源
FILE * pcap_dump_file (pcap_dumper_t *p) 返回一個(gè)由
pcap_dump_open()打開(kāi)的存儲(chǔ)文件的標(biāo)準(zhǔn)輸入輸出流
int pcap_dump_flush (pcap_dumper_t *p) 將輸出緩沖寫(xiě)入存儲(chǔ)文件,,這樣,,任何使用 pcap_dump()
存儲(chǔ),但還沒(méi)有寫(xiě)入文件的數(shù)據(jù)包,,會(huì)被立刻寫(xiě)入文件,。返回-1表示出錯(cuò),返回0表示成功,。
void pcap_dump_close (pcap_dumper_t *p) 關(guān)閉一個(gè)存儲(chǔ)文件
Windows平臺(tái)專(zhuān)用的擴(kuò)展函數(shù) 本節(jié)中的函數(shù)是從libpcap擴(kuò)展而來(lái),,為了提供更強(qiáng)大的功能(比如遠(yuǎn)程數(shù)據(jù)捕獲,數(shù)據(jù)包緩存尺寸變化或高精度的數(shù)據(jù)包注入),。然而,,目前,這些函數(shù)只能用于Windows平臺(tái),。
PAirpcapHandle pcap_get_airpcap_handle (pcap_t
*p) 返回一個(gè)和適配器相關(guān)聯(lián)的AirPcap句柄,。這個(gè)句柄可以被用來(lái)改變和CACE無(wú)線(xiàn)技術(shù)有關(guān)的設(shè)置。
bool pcap_offline_filter (struct bpf_program *prog, const struct pcap_pkthdr
*header, const u_char *pkt_data) 當(dāng)給定的過(guò)濾器應(yīng)用于一個(gè)脫機(jī)數(shù)據(jù)包時(shí),,返回true
int pcap_live_dump (pcap_t *p, char *filename, int maxsize, int
maxpacks) 將捕獲保存到文件
int pcap_live_dump_ended (pcap_t *p, int sync) 返回內(nèi)核堆處理的狀態(tài),。例如,告訴我們由
pcap_live_dump() 定義的限制條件是否已經(jīng)滿(mǎn)足,。
pcap_stat * pcap_stats_ex (pcap_t *p, int
*pcap_stat_size) 返回當(dāng)前捕獲的統(tǒng)計(jì)信息,。
int pcap_setbuff (pcap_t *p, int dim) 設(shè)置與當(dāng)前適配器關(guān)聯(lián)的內(nèi)核緩存大小
int pcap_setmode (pcap_t *p, int mode) 將接口p的工作模式設(shè)置為mode
int pcap_setmintocopy (pcap_t *p, int size) 設(shè)置內(nèi)核一次調(diào)用所受到的最小數(shù)據(jù)總數(shù)
HANDLE pcap_getevent (pcap_t *p) 返回與接口p關(guān)聯(lián)的事件句柄
pcap_send_queue * pcap_sendqueue_alloc (u_int memsize) 分配一個(gè)發(fā)送隊(duì)列
void pcap_sendqueue_destroy (pcap_send_queue *queue) 銷(xiāo)毀一個(gè)發(fā)送隊(duì)列
int pcap_sendqueue_queue (pcap_send_queue *queue, const struct pcap_pkthdr
*pkt_header, const u_char *pkt_data) 將數(shù)據(jù)包加入到發(fā)送隊(duì)列
u_int pcap_sendqueue_transmit (pcap_t *p, pcap_send_queue *queue, int
sync) 將一個(gè)發(fā)送隊(duì)列發(fā)送至網(wǎng)絡(luò)
int pcap_findalldevs_ex (char *source, struct pcap_rmtauth *auth, pcap_if_t
**alldevs, char *errbuf) 創(chuàng)建一個(gè)網(wǎng)絡(luò)設(shè)備列表,它們可以由 pcap_open()打開(kāi),。
int pcap_createsrcstr (char *source, int type, const char *host, const char
*port, const char *name, char *errbuf) 接收一組字符串(hot
name,port,...),,并根據(jù)新的格式,返回一個(gè)完整的源字符串(比如:'rpcap://1.2.3.4/eth0')
int pcap_parsesrcstr (const char *source, int *type, char *host, char *port,
char *name, char *errbuf) 解析一個(gè)源字符串,,并返回分離出來(lái)的內(nèi)容,。
pcap_t * pcap_open (const char *source, int snaplen, int flags, int
read_timeout, struct pcap_rmtauth *auth, char
*errbuf) 打開(kāi)一個(gè)用來(lái)捕獲或發(fā)送流量(僅WinPcap)的通用源。
pcap_samp * pcap_setsampling (pcap_t *p) 為數(shù)據(jù)包捕獲定義一個(gè)采樣方法
SOCKET pcap_remoteact_accept (const char *address, const char *port, const
char *hostlist, char *connectinghost, struct pcap_rmtauth *auth, char
*errbuf) 阻塞,,直到網(wǎng)絡(luò)連接建立,。(僅用于激活模式)
int pcap_remoteact_close (const char *host, char *errbuf) 釋放一個(gè)活動(dòng)連接
(僅用于激活模式).
void pcap_remoteact_cleanup () 清除一個(gè)正在用來(lái)等待活動(dòng)連接的socket
int pcap_remoteact_list (char *hostlist, char sep, int size, char
*errbuf) 返回一個(gè)主機(jī)名,這個(gè)主機(jī)和我們建立了活動(dòng)連接,。(僅用于激活模式)
|