基于wincap写抓包程序
生活随笔
收集整理的這篇文章主要介紹了
基于wincap写抓包程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解決編譯過程中pcap.h no such file or directory 問題:
下載WpdPack_3_2_alpha1.zip (下載地址:http://www.winpcap.org/install/bin/WpdPack_3_2_alpha1.zip) 然后解壓,解壓縮就可以看見Include和lib;然后用VC++打開項目,在"Project->Settings"標簽欄中選擇"C/C++",在"Preprocessor definitions"的輸入框里添加"WPCAP";再選擇"Link",在"Object/library modules"的輸入框里添加"wpcap.lib Packet.lib"。 然后再設置VC++環境變量: 選擇Tools->options->Directories的include里面加入下載的winpcap開發包解壓以后的include文件夾。 選擇Tools->options->Directories的lib里面加入下載的winpcap開發包解壓以后的lib文件夾. WinpCap是一個公開的免費的抓包驅動加開發包,利用它,可以大大縮短我們的開發周期。
首先,先枚舉系統中的所有網卡:
/* 獲取設備列表 */??
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
??fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
??exit(1);
}
/* 數據列表 */??
for(d=alldevs; d; d=d->next)
{
??printf("%d. %s", ++i, d->name);
??if (d->description)
? ?printf(" (%s)\n", d->description);
??else
? ?printf(" (No description available)\n");
}
然后選擇網卡,然后設備。
if ( (adhandle= pcap_open_live(d->name, //設備名??
??65536, // 捕捉完整的數據包??
??1 , // 混在模式??
??1, // 讀入超時??
??errbuf // 錯誤緩沖??
??) ) == NULL)
{
??printf("Unable to open the adapter");
??pcap_freealldevs(alldevs);
??return;??
}
打開設備之后,我們就可以利用adhandle句柄來正式抓包了,先新建一個回調函數,形如
void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data)
{
}
然
后調用pcap_loop(adhandle, 0, packet_handler,
NULL);pcap_loop的最后一個參數和packet_handler的packets參數是對應的,用于在函數間傳遞數據。WinpCap每收
到一個包就自動調用packet_handler函數,將包的內容作為data參數,我們對data作強制類型轉化就可以得到數據包各部分的內容。
事實上,WinpCap開發包除了可以用回調函數抓包外,還可以用非回調的方法。在得到adhandle后不調用pcap_loop,而用下面的方法:
while(1)
{
? ?res = pcap_next_ex(adhandle,&header,&data);
??if(res==0)
??{
? ?Sleep(100);
? ?continue;
??}
}
用pcap_next_ex讀取數據包內容,至于if(res==0)這一段是為了防止沒數據包到達時重復循環。
不多講了全部源程序可看附件。附件中有兩個抓包程序,一個是GUI的,一個是CUI的。CUI程序的運行結果如下:
附件下載:
WinpCap開發包 :
WinPcap_4_0_beta3.rar
CUI抓包源程序:
CapPack.rar
GUI抓包源程序(MFC):
MFCCapPack.rar
首先,先枚舉系統中的所有網卡:
/* 獲取設備列表 */??
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
??fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
??exit(1);
}
/* 數據列表 */??
for(d=alldevs; d; d=d->next)
{
??printf("%d. %s", ++i, d->name);
??if (d->description)
? ?printf(" (%s)\n", d->description);
??else
? ?printf(" (No description available)\n");
}
然后選擇網卡,然后設備。
if ( (adhandle= pcap_open_live(d->name, //設備名??
??65536, // 捕捉完整的數據包??
??1 , // 混在模式??
??1, // 讀入超時??
??errbuf // 錯誤緩沖??
??) ) == NULL)
{
??printf("Unable to open the adapter");
??pcap_freealldevs(alldevs);
??return;??
}
打開設備之后,我們就可以利用adhandle句柄來正式抓包了,先新建一個回調函數,形如
void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data)
{
}
然
后調用pcap_loop(adhandle, 0, packet_handler,
NULL);pcap_loop的最后一個參數和packet_handler的packets參數是對應的,用于在函數間傳遞數據。WinpCap每收
到一個包就自動調用packet_handler函數,將包的內容作為data參數,我們對data作強制類型轉化就可以得到數據包各部分的內容。
事實上,WinpCap開發包除了可以用回調函數抓包外,還可以用非回調的方法。在得到adhandle后不調用pcap_loop,而用下面的方法:
while(1)
{
? ?res = pcap_next_ex(adhandle,&header,&data);
??if(res==0)
??{
? ?Sleep(100);
? ?continue;
??}
}
用pcap_next_ex讀取數據包內容,至于if(res==0)這一段是為了防止沒數據包到達時重復循環。
不多講了全部源程序可看附件。附件中有兩個抓包程序,一個是GUI的,一個是CUI的。CUI程序的運行結果如下:
附件下載:
WinpCap開發包 :
WinPcap_4_0_beta3.rar
CUI抓包源程序:
CapPack.rar
GUI抓包源程序(MFC):
MFCCapPack.rar
總結
以上是生活随笔為你收集整理的基于wincap写抓包程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机如何防辐射,日常生活如何防辐射
- 下一篇: sklearn中多种编码方式——cate