pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump、wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数据包进行测试。

pcap文件的格式为:
  文件头    24字节
  数据包头 + 数据包  数据包头为16字节,后面紧跟数据包
  数据包头 + 数据包  ……
 
pcap.h里定义了文件头的格式

  1. struct pcap_file_header {
  2. bpf_u_int32 magic;
  3. u_short version_major;
  4. u_short version_minor;
  5. bpf_int32 thiszone;     /* gmt to local correction */
  6. bpf_u_int32 sigfigs;    /* accuracy of timestamps */
  7. bpf_u_int32 snaplen;    /* max length saved portion of each pkt */
  8. bpf_u_int32 linktype;   /* data link type (LINKTYPE_*) */
  9. };

看一下各字段的含义:
magic:   4字节 pcap文件标识 目前为“d4 c3 b2 a1”
major:   2字节 主版本号     #define PCAP_VERSION_MAJOR 2
minor:   2字节 次版本号     #define PCAP_VERSION_MINOR 4
thiszone:4字节 时区修正     并未使用,目前全为0
sigfigs: 4字节 精确时间戳   并未使用,目前全为0
snaplen: 4字节 抓包最大长度 如果要抓全,设为0x0000ffff(65535),
               tcpdump -s 0就是设置这个参数,缺省为68字节
linktype:4字节 链路类型    一般都是1:ethernet
常用链路类型:
      0           BSD loopback devices, except for later OpenBSD
       1           Ethernet, and Linux loopback devices
       6           802.5 Token Ring
       7           ARCnet
       8           SLIP
       9           PPP
       10          FDDI
       100         LLC/SNAP-encapsulated ATM
       101         "raw IP", with no link
       102         BSD/OS SLIP
       103         BSD/OS PPP
       104         Cisco HDLC
       105         802.11
       108         later OpenBSD loopback devices (with the AF_value in network byte order)
       113         special Linux "cooked" capture
       114         LocalTalk

=======================================================================================
|    magic    |major  | minor |   thiszone  |   sigfigs   |   snaplen   |  linktype  
| d4 c3 b2 a1 | 02 00 | 04 00 | 00 00 00 00 | 00 00 00 00 | ff ff 00 00 | 01 00 00 00
=======================================================================================
 
 
数据包头的格式

  1. struct pcap_pkthdr {
  2. struct timeval ts;      /* time stamp */
  3. bpf_u_int32 caplen;     /* length of portion present */
  4. bpf_u_int32 len;        /* length this packet (off wire) */
  5. };
  6. struct timeval {
  7. long            tv_sec;         /* seconds (XXX should be time_t) */
  8. suseconds_t     tv_usec;        /* and microseconds */
  9. };

ts:    8字节 抓包时间 4字节表示秒数,4字节表示微秒数
caplen:4字节 保存下来的包长度(最多是snaplen,比如68字节)
len:   4字节 数据包的真实长度,如果文件中保存的不是完整数据包,可能比caplen大

了解了pcap文件格式,就可以自己手工构造任意数据包了,可以以录好的包为基础,

构建pcap文件示例:

含有两套构建方法, 因起先不知道可以通过pcap_open_dead & pcap_dump_open 构建文件头, 所以开始是自己创建一个文件并写入文件头.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <stdint.h>
  6. #include <errno.h>
  7. #include <pcap.h>
  8. #include "common.h"
  9. #define TCPDUMP_MAGIC       0xa1b2c3d4
  10. #ifndef PCAP_VERSION_MAJOR
  11. #define PCAP_VERSION_MAJOR 2
  12. #define
  13. #define PCAP_VERSION_MINOR
  14. #define PCAP_VERSION_MINOR 4
  15. #endif
  16. #define LINKTYPE_NULL       DLT_NULL
  17. #define LINKTYPE_ETHERNET   DLT_EN10MB  /* also for 100Mb and up */
  18. #define LINKTYPE_EXP_ETHERNET   DLT_EN3MB   /* 3Mb experimental Ethernet */
  19. #define LINKTYPE_AX25       DLT_AX25
  20. #define LINKTYPE_PRONET     DLT_PRONET
  21. #define LINKTYPE_CHAOS      DLT_CHAOS
  22. #define LINKTYPE_TOKEN_RING DLT_IEEE802 /* DLT_IEEE802 is used for Token Ring */
  23. #define LINKTYPE_ARCNET     DLT_ARCNET  /* BSD-style headers */
  24. #define LINKTYPE_SLIP       DLT_SLIP
  25. #define LINKTYPE_PPP        DLT_PPP
  26. #define LINKTYPE_FDDI       DLT_FDDI
  27. static int
  28. pcap_write_header(FILE *fp, int linktype, int thiszone, int snaplen)
  29. {
  30. struct pcap_file_header hdr;
  31. hdr.magic = TCPDUMP_MAGIC;
  32. hdr.version_major = PCAP_VERSION_MAJOR;
  33. hdr.version_minor = PCAP_VERSION_MINOR;
  34. hdr.thiszone = thiszone;
  35. hdr.snaplen = snaplen;
  36. hdr.sigfigs = 0;
  37. hdr.linktype = linktype;
  38. if (fwrite((char *)&hdr, sizeof(hdr), 1, fp) != 1)
  39. return (-1);
  40. return (0);
  41. }
  42. #define FILE_SAVE "pcap_write.pcap"
  43. uint8_t l2_data[] = {
  44. 0x00, 0x0c, 0x29, 0x99, 0xfc, 0xa6, 0x00, 0x0c, 0x29, 0xd7, 0xc1, 0xf2, 0x08, 0x00, 0x45, 0x00,
  45. 0x00, 0x46, 0x87, 0x8a, 0x00, 0x00, 0x40, 0x11, 0x6e, 0xa5, 0xc0, 0xa8, 0x01, 0x31, 0xc0, 0xa8,
  46. 0x01, 0xf6, 0x7e, 0x75, 0x00, 0x35, 0x00, 0x32, 0x89, 0x42, 0x0a, 0x5d, 0x00, 0x00, 0x00, 0x01,
  47. 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6e, 0x73, 0x31, 0x05, 0x67, 0x75, 0x61, 0x72, 0x64,
  48. 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x29, 0x10, 0x00, 0x00, 0x00,
  49. 0x80, 0x00, 0x00, 0x00
  50. };
  51. int main(int argc, char **argv)
  52. {
  53. #if 0
  54. FILE *fp = NULL;
  55. struct pcap_pkthdr h;
  56. fp = fopen(FILE_SAVE, "wb");
  57. if (!fp){
  58. fprintf(stderr, "fopen %s for write failed. errno=%d desc=%s\n",
  59. FILE_SAVE, errno, strerror(errno));
  60. return 1;
  61. }
  62. pcap_write_header(fp, LINKTYPE_ETHERNET, 0x0, 0x0000ffff);
  63. gettimeofday(&h.ts, NULL);
  64. h.caplen = sizeof(l2_data);
  65. h.len    = sizeof(l2_data);
  66. pcap_dump((uint8_t *)fp, &h, l2_data);
  67. fflush(fp);
  68. fclose(fp);
  69. #else
  70. pcap_t *p = NULL;
  71. pcap_dumper_t *fp = NULL;
  72. struct pcap_pkthdr h;
  73. p = pcap_open_dead(LINKTYPE_ETHERNET, 0x0000ffff);
  74. if (NULL == p){
  75. fprintf(stderr, "pcap_open_dead failed.\n");
  76. return 1;
  77. }
  78. fp = pcap_dump_open(p, FILE_SAVE);
  79. if (NULL == fp){
  80. fprintf(stderr, "pcap_dump_open failed.\n");
  81. return 1;
  82. }
  83. gettimeofday(&h.ts, NULL);
  84. h.caplen = sizeof(l2_data);
  85. h.len    = sizeof(l2_data);
  86. pcap_dump((uint8_t *)fp, &h, l2_data);
  87. pcap_dump_close(fp);
  88. #endif
  89. return 0;
  90. }

编译 & 链接

# gcc pcap_write.c -o pcap_write -lpcap

构建tcpdump/wireshark pcap文件的更多相关文章

  1. 自主创建tcpdump/wireshark pcap文件

      pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump.wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数据包进行测试. p ...

  2. 基于TcpDump和pcap文件分析的Android平台网络抓包程序设计与实现【随便】

    一.考虑使用Tcpdump,将抓到的包保存到cap文件中,然后手动分析.参考资料:1. http://www.cnblogs.com/tt-0411/archive/2012/09/23/269936 ...

  3. text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件

    简介 Text2pcap是一个读取ASCII hex转储的程序,它将描述的数据写入pcap或pcapng文件.text2pcap可以读取包含多个数据包的hexdumps,并构建多个数据包的捕获文件.t ...

  4. pcap文件生成metadata——使用tshark解析tcpdump的pcap包

    pcap文件生成metadata #!/usr/bin/env python # -*- coding: utf-8 -*- import os import time, datetime impor ...

  5. 使用tcpdump+Wireshark(或Fiddler)做linux服务器的网络请求分析

    我们的服务器上,一般都没有窗口界面,这时候要抓包,用tcpdump是最方便的.而分析网络请求时,wireshark又是相当方便的,这时候我们就需要把它们两个一起来使用了. tcpdump 抓取数据 命 ...

  6. JSunpack-n模拟WireShark拦截文件传输

    前言: 在前面的实验里我们进行了JSunpack-n的安装及其简单使用.JSunpack-n还有另外一些功能须要进行測试试验,由于本人也是刚接触这些东西.本文就当中一个"功能点"进 ...

  7. tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍

    tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...

  8. python dpkt 解析 pcap 文件

    dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...

  9. Windows下使用scapy+python2.7实现对pcap文件的读写操作

    scapy在linux环境中对pcap文件进行操作非常方便,但在windows下,特别是在python2.7环境下却会碰到各种各样的依赖包无法使用的问题,最明显的可能就属dnet和pcap的pytho ...

随机推荐

  1. the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header

    the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...

  2. Eclipse右键New菜单项的自定义设置

    大家都知道一般在Eclipse中新建一个项目或者文件都是通过菜单项的File-New来创建,然而有些右键出来的选项可能从来都不会使用到,而有些可能会常用到但是右键中又没有,这个时候就可以自定义New中 ...

  3. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  4. DDD领域驱动设计和实践(转载)

    -->目录导航 一. DDD领域驱动设计介绍 1. 什么是领域驱动设计(DDD) 2. 领域驱动设计的特点 3. 如果不使用DDD? 4. 领域驱动设计的分层架构和构成要素 5. 事务脚本和领域 ...

  5. Jquery UI dialog 传参

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3519318.html] $("#dialog").dialog({ aut ...

  6. Linux守护进程daemon

      守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启 ...

  7. Why Creating a Meaningful Morning Routine Will Make You More Successful

    https://medium.com/life-learning/how-creating-a-meaningful-morning-routine-will-make-you-more-succes ...

  8. SharePoint 2010 母版页定制小思路介绍

    转:http://tech.ddvip.com/2013-11/1384521515206064.html 介绍:我们使用SharePoint2010做门户网站,经常需要定制母版页,但是2010提供的 ...

  9. DevExpress中XtraGrid控件对GridView每行的颜色设置 zt

    改变行颜色 private void GridView1_RowStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowStyleEventArg ...

  10. 【转】QTP书写程序技巧

    一.添加固定注释 新建一TXT文档,将要添加的注释写在文档中 将文档名改为:ActionTemplate.mst 将文件放到QTP安装目录的dat文件夹中 设置好后,在QTP中每次新建一个测试就会自动 ...