【wireshark】抓包和文件格式支持

1. 抓包

捕获从网络适配器提取包,并将其保存到硬盘上.

访问底层网络适配器需要提升的权限,因此和底层网卡抓包的功能被封装在dumpcap中,这是Wireshark中唯一需要特权执行的程序,代码的其他部分(包括解析器,用户界面等等)只需要普通用户权限。

为了隐藏所有底层的机器依赖性,使用了libpcap/WinPcap库.这此库提供了从多种不同的网络接口 类型(Ethernet, Token Ring,...)上捕获包的通用接口.

2. 文件格式

Wireshark可以读写libpcap格式的捕获文件,这是它的默认文件格式,被用于其他很多网络捕获工具, 如tcpdump.另外,Wireshark还可以读写其他网络捕获工具使用的多种不同的文件格式.wiretap库, 和Wireshark一起开发,提供了读写所有这些文件格式的通用接口.如果你需要添加其他的捕获文件格式,应从此处着手.

pcap文件的封装格式如下图所示。magic number的值对于以主机字节序写入的文件来说是0x1a2b3c4d。

两个重要struct见/wiretap/libpcap.h。

/* "libpcap" file header (minus magic number). */
struct pcap_hdr {
    unsigned short  version_major;
    unsigned short  version_minor;
    int thiszone;
    unsigned int    sigfigs;
    unsigned int    snaplen;
    unsigned int    network;
};

/* "libpcap" record header. */
struct pcaprec_hdr {
    unsigned int    ts_sec;
    unsigned int    ts_usec;
    unsigned int    incl_len;
    unsigned int    orig_len;
};

3. 报文解析

当Wireshark从文件中载入包时,会解析每一个包.Wireshark尝试探测包类型并尽可能地取得更多的包信息.然而此时,只需要显示在报文列表窗格(packet list pane)的信息.

当用户在包列表窗格中选择特定的包时,它会被重新解析一次.此时,Wireshark尝试取得每条信息并显示在报文细节窗格(packet detail pane)中.

Wireshark支持多种文件格式,这是由wiretap目录下代码来实现的。简单来说,在fire_access.c里有一个open_info结构体数组open_info_base,它的一部分如下:

static struct open_info open_info_base[] = {
    { "Pcap",                        OPEN_INFO_MAGIC,     libpcap_open,             "pcap",     NULL, NULL },
    { "PcapNG",                      OPEN_INFO_MAGIC,     pcapng_open,              "pcapng",   NULL, NULL },
    { "NgSniffer",                   OPEN_INFO_MAGIC,     ngsniffer_open,           NULL,       NULL, NULL },
    { "Snoop",                       OPEN_INFO_MAGIC,     snoop_open,               NULL,       NULL, NULL },
    { "IP Trace",                    OPEN_INFO_MAGIC,     iptrace_open,             NULL,       NULL, NULL },
    { "Netmon",                      OPEN_INFO_MAGIC,     netmon_open,              NULL,       NULL, NULL },
    { "Netxray",                     OPEN_INFO_MAGIC,     netxray_open,             NULL,       NULL, NULL },
    { "Radcom",                      OPEN_INFO_MAGIC,     radcom_open,              NULL,       NULL, NULL },
    { "Nettl",                       OPEN_INFO_MAGIC,     nettl_open,               NULL,       NULL, NULL },
    { "Visual",                      OPEN_INFO_MAGIC,     visual_open,              NULL,       NULL, NULL },
    { "5 Views",                     OPEN_INFO_MAGIC,     _5views_open,             NULL,       NULL, NULL },
    { "Network Instruments",         OPEN_INFO_MAGIC,     network_instruments_open, NULL,       NULL, NULL },
    { "Peek Tagged",                 OPEN_INFO_MAGIC,     peektagged_open,          NULL,       NULL, NULL },
    { "DBS Etherwatch",              OPEN_INFO_MAGIC,     dbs_etherwatch_open,      NULL,       NULL, NULL },
    { "K12",                         OPEN_INFO_MAGIC,     k12_open,                 NULL,       NULL, NULL },
    { "Catapult DCT 2000",           OPEN_INFO_MAGIC,     catapult_dct2000_open,    NULL,       NULL, NULL },
    { "Aethra",                      OPEN_INFO_MAGIC,     aethra_open,              NULL,       NULL, NULL },
    { "BTSNOOP",                     OPEN_INFO_MAGIC,     btsnoop_open,             "log",      NULL, NULL },
    { "EYESDN",                      OPEN_INFO_MAGIC,     eyesdn_open,              NULL,       NULL, NULL },
    { "TNEF",                        OPEN_INFO_MAGIC,     tnef_open,                NULL,       NULL, NULL },
    { "MIME Files with Magic Bytes", OPEN_INFO_MAGIC,     mime_file_open,           NULL,       NULL, NULL },
    { "Lanalyzer",                   OPEN_INFO_HEURISTIC, lanalyzer_open,           "tr1",      NULL, NULL },
    ...
};

在file_access.c中的init_open_routines函数中,它被赋值给全局变量open_routines。

在file_access.c中的wtap_open_offline函数中,会遍历此数组,直到其中的打开函数可以打开给定的文件。

switch ((*open_routines[i].open_routine)(wth, err, err_info)) {
case -1:
    /* I/O error - give up */
    wtap_close(wth);
    return NULL;

case 0:
    /* No I/O error, but not that type of file */
    break;

case 1:
    /* We found the file type */
    goto success;
}

4. 参考

Wireshark开发指南第6章"How wireshark works"

时间: 2024-10-29 09:02:43

【wireshark】抓包和文件格式支持的相关文章

用Wireshark抓包来揭开ftp client GG和ftp server MM的勾搭内容并用C代码来简要模拟实现Windows自带的ftp client

前面, 我们玩过http, 颇有点意思, 在本文中, 我们继续来玩ftp(file transfer protocol).   http和ftp都是建立在tcp之上的应用层协议, 无论他们怎么包装, 怎么装bigger, 最终还是基于tcp端到端传输的.本文主要分为两个部分: 一. 用Wireshark抓包来揭开ftp client GG和ftp server MM的勾搭内容.二.用C代码来简要模拟实现Windows自带的ftp client. 说明, 本文中的实验, 我用了两台电脑, 分别是p

Wireshark抓包工具使用教程以及常用抓包规则

Wireshark是一个非常好用的抓包工具,当我们遇到一些和网络相关的问题时,可以通过这个工具进行分析,不过要说明的是,这只是一个工具,用法是非常灵活的,所以今天讲述的内容可能无法直接帮你解决问题,但是只要你有解决问题的思路,学习用这个软件就非常有用了.Wireshark官方下载地址:http://www.wireshark.org/download.html如果记不住,可以在百度中输入Wir就可以看到百度智能匹配的关键词了,选择第一个地址进去下载即可. 简单介绍下这个软件的一些常用按钮,因为本

Mac OS X上使用Wireshark抓包

Wireshark针对UNIX Like系统的GUI发行版界面采用的是X Window(1987年更改X版本到X11).Mac OS X在Mountain Lion之后放弃X11,取而代之的是开源的XQuartz(X11.app).因此,在Mac OS X上安装Wireshark之前,需要先下载安装XQuartz. 1.安装XQuartz XQuartz(XQuartz-2.7.6.dmg)安装完成后,按照提示需要注销重新登录,以使XQuartz作为默认的X11 Server. 安装成功后,在终

wireshark抓包获取网站登录信息

最近有个需求,用python实现自动回复某个帖子,达到人工置顶的目的. 要自动回复,自然要先登录,所以需要获取到登录时http post提交的用户信息,抓包工具使用wireshark. 默认已经配置好wireshark,并且具备计算机网络的基础知识,如果不具备请自行百度. 用来登录的网页是天涯登录 首先,我们要知道本机的IP地址和点击登录页面的登录按钮后要向他发出http请求的机器的ip地址,前者用ipconfig或者mac下使用ifconfig知道,后者的话需要打开网页源码获取响应服务器的网址

云计算之路-阿里云上:Wireshark抓包分析一个耗时20秒的请求

这篇博文分享的是我们针对一个耗时20秒的请求,用Wireshark进行抓包分析的过程. 请求的流程是这样的:客户端浏览器 -> SLB(负载均衡) -> ECS(云服务器) -> SLB -> 客户端浏览器. 下面是分析的过程: 1. 启动Wireshark,针对内网网卡进行抓包. 2. 在IIS日志中找出要分析的请求(借助Log Parser Studio) 通过c-ip(Client IP Address)可以获知SLB的内网IP,在分析Wireshar抓包时需要依据这个IP进

利用Wireshark抓包登录博客园

1,打开WireShark,选择本地网卡. 2,在filter中输入过滤条件Http. 3,找到http包中的get 和post的包,这时你可以找到你登录的用户名和密码了,这个用户名和密码通过表单进行验证. 利用Wireshark抓包登录博客园,布布扣,bubuko.com

Wireshark抓包分析从入门到精通

曾近有个牛逼的实战课程放在你的面前,你不懂得好好珍惜,直到失去后才追悔莫及,如果G-LAB可以给你再来一次的机会,你会不会抓住?没错,G-LAB真的给了你再来一次的机会.[Wireshark抓包分析从入门到精通]主讲<郭主任>(月光宝盒索取)请联系QQ:2853771084

wireshark抓包结果很多[TCP Retransmission],怎么办?

有一同事问用wireshark抓包时发现很多[TCP Retransmission],这些包极大影响了自己真正想看的http数据包,如下图. 我拿到pcapng后首先看到这些包的来源ip都是固定的两个,所以首先想到的方法就是过滤ip,规则如下: http and ip.src_host !="23.2.16.200" and ip.src_host !="23.2.16.218" 这种方法虽然解决了问题,但是明显不够通用,如果ip很多不是烦死人了吗?所以接着分析,g

WireShark抓包过程

wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了. 为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包. wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容,总结,如果是处理HTTP,HTTPS 还是用Fiddler, 其他协议比如TCP,UDP 就用wire