• 基于winpcap捕获,过滤和分析数据包


    程序1, 获取网卡信息并启动capture

    func.h

    #pragma once
    #ifndef __FUNC_H
    #define __FUNC_H
    #define HAVE_REMOTE
    #include<winsock2.h>
    #include<windows.h>
    
    #include<stdio.h>
    #include"pcap.h"
    #include"remote-ext.h"
    
    
    //获取网卡信息
    void showNetworkAdapter();
    
    //获取网卡属性
    void showAdapterInfo();
    
    //捕获数据包
    void capturePackets();
    
    
    //输出捕获的数据包的回调函数
    void showCapturedData(u_char* param, const struct pcap_pkthdr* header, const u_char* pkt_data);
    #endif // !__FUNC_H

    func.cpp

    #include"func.h"
    
    void showNetworkAdapter()
    {
        pcap_if_t* pAdapter;
        pcap_if_t* temp;
        char errorBuffer[1024] = { 0 };
    
        if (pcap_findalldevs_ex("rpcap://", 0, &pAdapter, errorBuffer) == -1)
        {
            fprintf(stderr, "获取网卡信息失败,原因:%s
    ", errorBuffer);
            return;
        }
    
        if (pAdapter==NULL)
        {
            printf("没有网卡
    ");
            return;
        }
        temp = pAdapter;
        while (temp)
        {
            printf("网卡名: %s 	 网卡信息: %s
    ", temp->name, temp->description);
            temp = temp->next;
        }
    
        pcap_freealldevs(pAdapter);
    }
    
    
    void showAdapterInfo()
    {
    
    }
    
    void capturePackets()
    {
        pcap_if_t* pAdapter;
        pcap_if_t* temp;
        pcap_t* ptargetAdapter;
        size_t no = 0;
        size_t target_no = 0;
        char errorBuffer[1024] = { 0 };
        if (pcap_findalldevs_ex("rpcap://", 0, &pAdapter, errorBuffer) == -1)
        {
            fprintf(stderr, "获取网卡信息失败,原因:%s
    ", errorBuffer);
            return;
        }
    
        if (pAdapter == NULL)
        {
            printf("没有网卡
    ");
            return;
        }
        temp = pAdapter;
        while (temp)
        {
            no++;
            printf("No %d:网卡名: %s 	 网卡信息: %s
    ", no, temp->name, temp->description);
            temp = temp->next;
            
        }
        printf("输入要捕获的网卡号:1-%d
    ", no);
        scanf("%d", &target_no);
    
        temp = pAdapter;
        for (size_t i = 1; i < target_no; i++)
        {
            temp = temp->next;
        }
    
        //以混杂模式打开目标设备并设置捕获数据每次捕获时间间隔为1s.
        memset(errorBuffer, 0, sizeof(errorBuffer));
        ptargetAdapter = pcap_open(temp->name, 1024, PCAP_OPENFLAG_PROMISCUOUS, 1000, 0, errorBuffer);
    
        if (ptargetAdapter==0)
        {
            fprintf(stderr, "打开失败,错误原因:%s
    ",errorBuffer);
        }
    
        printf("在设备%s启动监听...
    ", temp->description);
        pcap_freealldevs(pAdapter);
        //设置回调函数并捕获数据包给回调函数处理.数据包作为参数自动发给回调函数.还能能回调函数发送
        //一个自定义参数,这里没有,直接设置为0
        pcap_loop(ptargetAdapter, 0, showCapturedData, 0);
    }
    
    //捕获数据包回调函数,第一个参数是pcap_loop函数给的,第2个参数是数据包包头信息是由winpcap封装的
    //结构体. 第3个参数是数据包内容
    void showCapturedData(u_char * param, const pcap_pkthdr * header, const u_char * pkt_data)
    {
        //下面几行是处理数据包头的发送时间戳转为正常时间,代码固定
        struct tm* ltime;
        char timestr[16] = { 0 };
        time_t 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
    ", timestr, header->ts.tv_usec, header->len);
    
    
    
    
    }

    main.cpp

    #include "func.h"
    
    int main()
    {
        WSADATA wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);
    
        //showNetworkAdapter();
        capturePackets();
    
        return 0;
    }
  • 相关阅读:
    树形结构菜单,递归实现
    基于Vue的日历组件,可以标注重要日子
    关于element-ui级联菜单(城市三级联动菜单)和回显问题
    继承(面试问到)
    vue监听浏览器刷新
    Popover 弹出框,里面的表格点击后关闭弹窗
    el-table表格合并单元格
    对角线
    ElementUI中el-radio再次点击取消选中
    保留文本框换行和空格
  • 原文地址:https://www.cnblogs.com/freesec/p/6219542.html
Copyright © 2020-2023  润新知