基于wincap写抓包程序
生活随笔
收集整理的這篇文章主要介紹了
基于wincap写抓包程序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
解決編譯過程中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++環(huán)境變量: 選擇Tools->options->Directories的include里面加入下載的winpcap開發(fā)包解壓以后的include文件夾。 選擇Tools->options->Directories的lib里面加入下載的winpcap開發(fā)包解壓以后的lib文件夾. WinpCap是一個公開的免費的抓包驅(qū)動加開發(fā)包,利用它,可以大大縮短我們的開發(fā)周期。
首先,先枚舉系統(tǒng)中的所有網(wǎng)卡:
/* 獲取設備列表 */??
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
??fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
??exit(1);
}
/* 數(shù)據(jù)列表 */??
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");
}
然后選擇網(wǎng)卡,然后設備。
if ( (adhandle= pcap_open_live(d->name, //設備名??
??65536, // 捕捉完整的數(shù)據(jù)包??
??1 , // 混在模式??
??1, // 讀入超時??
??errbuf // 錯誤緩沖??
??) ) == NULL)
{
??printf("Unable to open the adapter");
??pcap_freealldevs(alldevs);
??return;??
}
打開設備之后,我們就可以利用adhandle句柄來正式抓包了,先新建一個回調(diào)函數(shù),形如
void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data)
{
}
然
后調(diào)用pcap_loop(adhandle, 0, packet_handler,
NULL);pcap_loop的最后一個參數(shù)和packet_handler的packets參數(shù)是對應的,用于在函數(shù)間傳遞數(shù)據(jù)。WinpCap每收
到一個包就自動調(diào)用packet_handler函數(shù),將包的內(nèi)容作為data參數(shù),我們對data作強制類型轉(zhuǎn)化就可以得到數(shù)據(jù)包各部分的內(nèi)容。
事實上,WinpCap開發(fā)包除了可以用回調(diào)函數(shù)抓包外,還可以用非回調(diào)的方法。在得到adhandle后不調(diào)用pcap_loop,而用下面的方法:
while(1)
{
? ?res = pcap_next_ex(adhandle,&header,&data);
??if(res==0)
??{
? ?Sleep(100);
? ?continue;
??}
}
用pcap_next_ex讀取數(shù)據(jù)包內(nèi)容,至于if(res==0)這一段是為了防止沒數(shù)據(jù)包到達時重復循環(huán)。
不多講了全部源程序可看附件。附件中有兩個抓包程序,一個是GUI的,一個是CUI的。CUI程序的運行結(jié)果如下:
附件下載:
WinpCap開發(fā)包 :
WinPcap_4_0_beta3.rar
CUI抓包源程序:
CapPack.rar
GUI抓包源程序(MFC):
MFCCapPack.rar
首先,先枚舉系統(tǒng)中的所有網(wǎng)卡:
/* 獲取設備列表 */??
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
??fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
??exit(1);
}
/* 數(shù)據(jù)列表 */??
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");
}
然后選擇網(wǎng)卡,然后設備。
if ( (adhandle= pcap_open_live(d->name, //設備名??
??65536, // 捕捉完整的數(shù)據(jù)包??
??1 , // 混在模式??
??1, // 讀入超時??
??errbuf // 錯誤緩沖??
??) ) == NULL)
{
??printf("Unable to open the adapter");
??pcap_freealldevs(alldevs);
??return;??
}
打開設備之后,我們就可以利用adhandle句柄來正式抓包了,先新建一個回調(diào)函數(shù),形如
void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data)
{
}
然
后調(diào)用pcap_loop(adhandle, 0, packet_handler,
NULL);pcap_loop的最后一個參數(shù)和packet_handler的packets參數(shù)是對應的,用于在函數(shù)間傳遞數(shù)據(jù)。WinpCap每收
到一個包就自動調(diào)用packet_handler函數(shù),將包的內(nèi)容作為data參數(shù),我們對data作強制類型轉(zhuǎn)化就可以得到數(shù)據(jù)包各部分的內(nèi)容。
事實上,WinpCap開發(fā)包除了可以用回調(diào)函數(shù)抓包外,還可以用非回調(diào)的方法。在得到adhandle后不調(diào)用pcap_loop,而用下面的方法:
while(1)
{
? ?res = pcap_next_ex(adhandle,&header,&data);
??if(res==0)
??{
? ?Sleep(100);
? ?continue;
??}
}
用pcap_next_ex讀取數(shù)據(jù)包內(nèi)容,至于if(res==0)這一段是為了防止沒數(shù)據(jù)包到達時重復循環(huán)。
不多講了全部源程序可看附件。附件中有兩個抓包程序,一個是GUI的,一個是CUI的。CUI程序的運行結(jié)果如下:
附件下載:
WinpCap開發(fā)包 :
WinPcap_4_0_beta3.rar
CUI抓包源程序:
CapPack.rar
GUI抓包源程序(MFC):
MFCCapPack.rar
總結(jié)
以上是生活随笔為你收集整理的基于wincap写抓包程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机如何防辐射,日常生活如何防辐射
- 下一篇: Linux基础:su命令使用方法介绍