1. 程式人生 > >winpcap三個原始碼例項,可直接使用

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

source[PCAP_BUF_SIZE];

    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: "

, d->name, d->description);

        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_tpcap_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); 

    } 

    //i0代表上述迴圈未進入,即沒有找到介面卡,可能的原因為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

}