winpcap三個原始碼例項,可直接使用
原始碼
原始碼一
#include "pcap.h"
#define HAVE_REMOTE
#include "remote-ext.h"
#pragma comment(lib,"wpcap.lib")
int main()
{
pcap_if_t *alldevs; //pcap_if_t is interface type
pcap_if_t *d;
charerrbuf[PCAP_ERRBUF_SIZE]; // store error information
inti;
//struct pcap_rmtauth Ubuntu_cat;
char
if(pcap_createsrcstr(source, PCAP_SRC_FILE,
NULL, NULL,
"本地連線",
errbuf)== -1) {
printf("Error in create source string: %s\n",errbuf);
exit(-1);
}
printf("%s\n", source);
if(pcap_findalldevs_ex(source, // can be PCAP_SRC_IF_STRING forlocal host
NULL, // auth to remote host. NULL if localhost
&alldevs,
errbuf) == -1) {
printf("Error in find all devices: %s\n",errbuf);
exit(1);
}
d =alldevs;
while(d!= NULL) {
printf("%s\n%s\nAddress: "
for(i = 0; d->addresses != NULL&& i < 14; i++)
printf("%d ", d->addresses->addr->sa_data[i]);
printf("\n\n");
d =d->next;
}
pcap_freealldevs(alldevs);
return0;
}
原始碼二
#define HAVE_REMOTE
#include "pcap.h"
void gen_packet(unsignedchar*buf,int len);
#pragma comment(lib,"wpcap.lib")
/*生成資料包*/
void gen_packet(unsignedchar*buf,intlen)
{
inti=0;
//設定目標MAC地址為01:01:01:01:01:01
for(i=0;i<6;i++)
{
buf[i]=0x01;
}
//設定源MAC地址為02:02:02:02:02:02
for(i=6;i<12;i++)
{
buf[i]=0x02;
}
//設定協議標識為0xc0xd,無任何實際意義
buf[12]=0xc;
buf[13]=0xd;
//填充資料包的內容
for(i=14;i<len;i++)
{
buf[i]=i-14;
}
}
int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
intinum;
inti=0;
pcap_t *adhandle;
charerrbuf[PCAP_ERRBUF_SIZE];
intret=-1;
/*獲取本機網路裝置列表 */
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &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(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return-1;
}
/*選擇網路裝置介面*/
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
if(inum< 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/*釋放裝置列表 */
pcap_freealldevs(alldevs);
return-1;
}
/*跳轉到選中的介面卡 */
for(d=alldevs,i=0; i< inum-1 ;d=d->next, i++);
/*開啟裝置 */
if( (adhandle= pcap_open(d->name, // 裝置名
65536, // 65535保證能捕獲到資料鏈路層上每個資料包的全部內容
PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式
1000, // 讀取超時時間
NULL, //遠端機器驗證
errbuf // 錯誤緩衝池
) ) ==NULL)
{
fprintf(stderr,"\nUnable to open the adapter.%s is not supported by WinPcap\n", d->name);
/*釋放裝置列表 */
pcap_freealldevs(alldevs);
return-1;
}
/*在選中的裝置介面上傳送資料*/
printf("\nsending on %s...\n", d->description);
/*傳送資料包*/
//生成資料報
intpacketlen=100;
unsignedchar*buf= (unsigned char*)malloc(packetlen);
memset(buf,0x0,packetlen);
gen_packet(buf,packetlen);//獲得生成的資料包,長度為packetlen
//開始資料包傳送
if( (ret=pcap_sendpacket(adhandle,buf,packetlen))==-1)
{
printf("傳送失敗\n");
free(buf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);
return-1;
}
/*釋放資源*/
free(buf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);
return0;
}
獲取裝置地址程式原始碼三
#define HAVE_REMOTE
#include "pcap.h"
void gen_packet(unsigned char *buf,int len);
#pragma comment(lib, "wpcap.lib")
int main(){
pcap_if_t * alldevs; //所有網路介面卡
pcap_if_t *d; //選中的網路介面卡
charerrbuf[PCAP_ERRBUF_SIZE]; //錯誤緩衝區,大小為256
inti = 0; //介面卡計數變數
/**
int pcap_findalldevs_ex ( char * source,
struct pcap_rmtauth * auth,
pcap_if_t ** alldevs,
char * errbuf );
PCAP_SRC_IF_STRING代表使用者想從一個本地檔案開始捕獲內容;
*/
//獲取本地介面卡列表
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf) == -1){
//結果為-1代表出現獲取介面卡列表失敗
fprintf(stderr,"Error inpcap_findalldevs_ex:\n",errbuf);
//exit(0)代表正常退出,exit(other)為非正常退出,這個值會傳給作業系統
exit(1);
}
//列印裝置列表資訊
/**
d = alldevs 代表賦值第一個裝置,d = d->next代表切換到下一個裝置
結構體 pcap_if_t:
pcap_if * next 指向下一個pcap_if,pcap_if_t和pcap_if 結構是一樣的
char * name 代表介面卡的名字
char * description 對介面卡的描述
pcap_addr * addresses 介面卡儲存的地址
u_int flags 介面卡介面識別符號,值為PCAP_IF_LOOPBACK
*/
for(d= alldevs;d !=NULL;d =d->next){
printf("number:%d name:%s",++i,d->name);
if(d->description){
//列印介面卡的描述資訊
printf("description:%s\n",d->description);
}else{
//介面卡不存在描述資訊
printf("description:%s","no description\n");
}
printf("flags:%s\n",d->flags);
}
//i為0代表上述迴圈未進入,即沒有找到介面卡,可能的原因為Winpcap沒有安裝導致未掃描到
if(i== 0){
printf("interface not found,pleasecheck winpcap installation");
}
//釋放網路介面卡列表
pcap_freealldevs(alldevs);
return0;
}
傳送包
#define HAVE_REMOTE
#include "pcap.h"
void gen_packet(unsigned char *buf,int len);
#pragma comment(lib, "wpcap.lib")
void main(int argc, char **argv)
{
pcap_t*fp;
charerrbuf[PCAP_ERRBUF_SIZE];
u_charpacket[100];
inti;
/* 檢查命令列引數的合法性*/
if(argc != 2)
{
printf("usage: %s interface (e.g.'rpcap://eth0')",argv[0]);
return;
}
/* 開啟輸出裝置*/
if( (fp= pcap_open(argv[1], // 裝置名
100, // 要捕獲的部分 (只捕獲前100個位元組)
PCAP_OPENFLAG_PROMISCUOUS, // 混雜模式
1000, // 讀超時時間
NULL, // 遠端機器驗證
errbuf // 錯誤緩衝
) ) == NULL)
{
fprintf(stderr,"\nUnable to open the adapter.%s is not supported by WinPcap\n", argv[1]);
return;
}
/* 假設在乙太網上,設定MAC的目的地址為 1:1:1:1:1:1 */
packet[0]=1;
packet[1]=1;
packet[2]=1;
packet[3]=1;
packet[4]=1;
packet[5]=1;
/* 設定MAC源地址為 2:2:2:2:2:2 */
packet[6]=2;
packet[7]=2;
packet[8]=2;
packet[9]=2;
packet[10]=2;
packet[11]=2;
/* 填充剩下的內容*/
for(i=12;i<100;i++)
{
packet[i]=i%256;
}
/* 傳送資料包*/
if(pcap_sendpacket(fp, packet, 100 /*size */) !=0)
{
fprintf(stderr,"\nError sending the packet:\n",pcap_geterr(fp));
return;
}
return;
}