日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用winpcap开发网络抓包工具

發(fā)布時(shí)間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用winpcap开发网络抓包工具 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:
winpcap(windows packet capture)是windows平臺(tái)下一個(gè)免費(fèi),公共的網(wǎng)絡(luò)訪問(wèn)系統(tǒng)。開(kāi)發(fā)winpcap這個(gè)項(xiàng)目的目的在于為win32應(yīng)用程序提供訪問(wèn)網(wǎng)絡(luò)底層的能力。它用于windows系統(tǒng)下的直接的網(wǎng)絡(luò)編程。進(jìn)行過(guò)網(wǎng)絡(luò)方面學(xué)習(xí)的都知道,wireshark軟件是基于winpcap的,winpcap可直接開(kāi)發(fā)基于網(wǎng)絡(luò)底層協(xié)議的應(yīng)用程序,例如arp,以后會(huì)寫(xiě)一篇arp的開(kāi)發(fā)、應(yīng)用和防御
功能需求:
1、截取主機(jī)A發(fā)送給主機(jī)B的消息
2、獲取消息保存到文件
3、將消息下發(fā)到主機(jī)B
4、截取接收主機(jī)B消息
5、獲取消息保存到文件
6、將消息轉(zhuǎn)發(fā)到主機(jī)A
程序設(shè)計(jì)
1、由于winpcap是基于網(wǎng)卡的數(shù)據(jù)獲取,所以先獲取正確的網(wǎng)卡
2、打開(kāi)選擇的網(wǎng)卡設(shè)備
設(shè)計(jì)一個(gè)獲取主機(jī)A消息的線程和一個(gè)獲取主機(jī)B消息的線程。
相關(guān)接口介紹
1、int pcap_findalldevs(pcap_if_t **, char *);//獲取所有網(wǎng)絡(luò)設(shè)備,保存于pcap_if_t 指向的內(nèi)存空間
2、void pcap_freealldevs(pcap_if_t *); // 清空所有網(wǎng)絡(luò)設(shè)備
3、pcap_t *pcap_open(const char *source, // 獲取的設(shè)備名
int snaplen, //要捕捉的數(shù)據(jù)包的部分
int flags, // 模式
int read_timeout,// 超時(shí)時(shí)間
struct pcap_rmtauth *auth, // 遠(yuǎn)程機(jī)器驗(yàn)證
char *errbuf);// 錯(cuò)誤緩沖池

4、void pcap_close(pcap_t *);//關(guān)閉設(shè)備
5、int pcap_compile(//編譯過(guò)濾規(guī)則
pcap_t *,
const char *,
int,
bpf_u_int32);
6、int pcap_setfilter(pcap_t *, struct bpf_program *);// 設(shè)置過(guò)濾規(guī)則
7、int pcap_next_ex(// 從interface或離線記錄文件獲取一個(gè)報(bào)文
pcap_t *,
struct pcap_pkthdr **, // 報(bào)文頭,包含mac地址
const u_char **);//報(bào)文內(nèi)容

程序設(shè)計(jì)
main.cpp

#include "pcap.h" #include "vector"using namespace std;int main() {vector<string> vecDevName;vecDevName.clear();pcap_if_t *alldevs;char errbuf[PCAP_ERRBUF_SIZE];/*查詢網(wǎng)卡設(shè)備*/if(pcap_findalldevs(&alldevs, errbuf) == -1){ /* At this point, we don't need any more the device list. Free it */pcap_freealldevs(alldevs);return -1; }while (alldevs->next != NULL){printf("%s:%s \n", alldevs->name, alldevs->description);vecDevName.push_back(alldevs->name);alldevs = alldevs->next;}// 打開(kāi)網(wǎng)絡(luò)設(shè)備pcap_t *adhandle;/* Open the device *//* 打開(kāi)設(shè)備 */if ( (adhandle= pcap_open(vecDevName[0].c_str(), // 設(shè)備名65536, // 要捕捉的數(shù)據(jù)包的部分 // 65535保證能捕獲到不同數(shù)據(jù)鏈路層上的每個(gè)數(shù)據(jù)包的全部?jī)?nèi)容PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式1000, // 讀取超時(shí)時(shí)間NULL, // 遠(yuǎn)程機(jī)器驗(yàn)證errbuf // 錯(cuò)誤緩沖池) ) == NULL){// fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);return -1;}// 編譯過(guò)濾規(guī)則bpf_u_int32 NetMask=0xffffff;struct bpf_program fcode;char szFilter[256];sprintf(szFilter, "ip host 192.168.1.254");//compile the filterif(pcap_compile(adhandle, &fcode, szFilter, 1, NetMask) < 0){//strTip.Format("Error compiling filter: wrong syntax:%s", szFilter);pcap_close(adhandle);return -3;}// 設(shè)置過(guò)濾規(guī)則if(pcap_setfilter(adhandle, &fcode) < 0){pcap_close(adhandle);return -4;}int res;struct pcap_pkthdr *header;const u_char *pkt_data;time_t local_tv_sec;struct tm *ltime;char timestr[16];while((res = pcap_next_ex( adhandle, &header, &pkt_data)) >= 0){if(res == 0)continue;/* 將時(shí)間戳轉(zhuǎn)換成可識(shí)別的格式 */local_tv_sec = header->ts.tv_sec;ltime=localtime(&local_tv_sec);strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的使用winpcap开发网络抓包工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。