lvxuzhou


私信TA

用户名:lvxuzhou

访问量:97340

签 名:

lvxuzhou

等  级
排  名 48
经  验 11191
参赛次数 0
文章发表 56
年  龄 0
在职情况 学生
学  校 西安
专  业

  自我简介:

    今天要讲解处理脱机dump文件(Handling offline files)。dump文件大家一定不会太陌生,其实就是进程的内存镜像。dump很大程度上是一个计算机术语,你应该会在跟备份有关的领域里听到这个词。而对于WinPcap的dump文件来说,其实就是将捕获到的所有网络数据包的信息存储到文件当中。事实上这是相当有意义的一件事情,用过捕包软件的同志,比如WireShark,将捕获到的信息保存至文件,还可以将文件中的信息载入到分析软件中,这样可以方便多次地查看和分析。WinPcap正是提供了相关的API来让开发者方便做这些事情,导出的格式也是和libpcap保持一致的,保持高度的移植性。

1、配置传入参数

QQ图片20211026231104.png

测试代码:

#include "pcap.h"
#include <QCoreApplication>
#include <winsock2.h>
#include <ws2tcpip.h>

void packet_handler(u_char *param, const struct pcap_pkthdr *header,
                    const u_char *pkt_data);
int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);

  pcap_if_t *alldevs;
  pcap_if_t *d;
  int i = 0;
  int inum;

  pcap_t *adhandle;

  char errbuf[PCAP_ERRBUF_SIZE];

  pcap_dumper_t *dumpfile;

  /* 检查程序输入参数 */
  if (argc != 2) {
    printf("usage: %s filename", argv[0]);
    return -1;
  }
  /* 获取本地机器设备列表 */
  if (pcap_findalldevs_ex((char *)PCAP_SRC_IF_STRING,
                          NULL /* auth is not needed */, &alldevs,
                          errbuf) == -1) {
    fprintf(stderr, "Error in pcap_findalldevs_ex: %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, // 设备名
           65535, // 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;
  }
  /* 打开堆文件 */
  dumpfile = pcap_dump_open(adhandle, argv[1]);
  if (dumpfile == NULL) {
    fprintf(stderr, "\nError opening output file\n");
    return -1;
  }

  printf("\nlistening on %s... Press Ctrl+C to stop...\n", d->description);
  /* 不再需要设备列表了,释放它 */
  pcap_freealldevs(alldevs);
  /* 开始捕捉 */
  pcap_loop(adhandle, 0, packet_handler, (u_char *)dumpfile);

  return a.exec();
}
/* 回调函数,当收到每一个数据包时会被libpcap所调用 */
/* 回调函数,用来处理数据包 */

void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header,
                    const u_char *pkt_data) {
  /* 保存数据包到堆文件 */

  pcap_dump(dumpfile, header, pkt_data);
}

执行结果:
QQ图片20211026231104.png

 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区