文档库 最新最全的文档下载
当前位置:文档库 › 用PCAP编程

用PCAP编程

用PCAP编程
用PCAP编程

用PCAP编程

一、开始:PCAP应用的格式

第一件需要理解的是PCAP探测器的基本框架。代码流程如下:

1、我们通过定义在哪个接口探测开始。LINUX中这可能是诸如eth0的接口,BSD中可能是

xl1,等等。我们能够或者用字符串定义设备,或者询问PCAP向我们提供可以做工作的接口名称。

2、初始化PCAP。这里我们实际告诉PCAP我们在什么设备探测。如果我们想我们可以在多

个设备上探测。我们如何在他们之间区分?使用文件句柄,就像打开一个文件读或写一样,我们必须命名我们的探测“会话”从而我们能够将它从其他会话区分开。

3、在我们只想探测特定流量的事件中(例如:只是TCP/IP包,只是端口23上的包,等等)

我们必须生成一个规则集,“编译”它并且部署它。这是一个三阶段过程,其中所有都是紧密管理的。规则集用一个字符串保存,然后转化为PCAP能够读取的格式(也就是编译它。)编译实际上是通过调研我们程序中的一个函数去完成;这不涉及去使用一个外部的应用。然后我们能够告诉PCAP去在我们希望过滤的哪一个会话上去部署它。4、最后,我们告诉PCAP进入它的主执行循环。在该状态,无论我们想让它接收多少包,

PCAP都等待着直到它接收到。每次它收到一个新包,它就调用我们已经定义好的一个函数。该函数能够做我们想让它做的任何事;它能够分割包并向用户打印输入,它能够将它保存为一个文件,或者什么也不做。

5、在我们探测需求满足后,我们关闭我们的会话。

二、设置设备

有两种技术在我们希望探测的设备上设置。

第一种是简单地让用户告诉我们。考虑下面的程序:

#include

#include

int main(int argc, char *argv[])

{

char *dev = argv[1];

printf("Device: %s\n", dev);

return(0);

}

用户通过第一个参数传递设备名称到程序以规定设备。现在字符串“dev”以PCAP可以理解的格式保存着我们将在其上探测的接口名称(当然假定用户给我们一个真实的接口)。

另一种技术也同样简单,看下面的程序:

#include

#include

int main(int argc, char *argv[])

{

char *dev, errbuf[PCAP_ERRBUF_SIZE];

dev = pcap_lookupdev(errbuf);

if (dev == NULL) {

fprintf(stderr, "Couldn't find default device: %s\n", errbuf);

return(2);

}

printf("Device: %s\n", dev);

return(0);

}

在本例中,PCAP自身设置设备。那errbuf字符串什么作用呢?大多数PCAP命令允许我们用一个参数传递给其一个字符串。字符串的目的是什么?在事件中命令失败了,它将弹出一个用于错误描述的字符串。在本例中,如果pcap_lookupdev()失败了,它将在errbuf中存储错误消息。

三、打开用于探测的设备

生成探测会话的任务是真的很简单。对此,我们使用pcap_open_live()。该函数的原型如下:

pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms,char *ebuf)

第一个参数是我们在前一部分规定的设备。Snaplen是一个整数定义了通过PCAP捕获的最大字节数量。Promisc,当设置为真时,将使接口进入混合模式(然而,即使设置为否时,也有可能在特定情况下接口进入混合模式)。to_ms是以毫秒计的超时时间(0表示没有超时;至少在一些平台上这意味在看见任何包之前你可以一直等待直到一些充足数量的包到达,因此你也可使用非零超时)。最后,ebuf是一个我们能够在其中存储任何错误的字符串。函数返回我们的会话句柄。

为了演示,考虑下段代码段:

#include

...

pcap_t *handle;

handle = pcap_open_live(somedev, BUFSIZ, 1, 1000, errbuf);

if (handle == NULL) {

fprintf(stderr, "Couldn't open device %s: %s\n", somedev, errbuf);

return(2);

}

本代码段打开了存储在字符串“somedev”中的设备,告诉其读取BUFSIZ规定数量的字节(这在PCAP.H中定义)。我们告诉其将设备置为混合模式,以探测直到错误发生,如果有一个错误,在字符串errbuf中存在;使用该字符串打印一个错误消息。

关于混合探测和非混合探测的区别:两种技术在体系上非常不同。标准上,非混合模式探测时一台主机只探测和它直接关联的数据。只有发往、来自或经过主机路由的数据将会被探测器采集。而混合模式下,探测线路上所有的流量。在一个非交换的环境下,这可能是所有的网络流量。这个明显的优点是它提供了更多可被探测的包。然而,这也有些不足。混合模式探测是可被监测到的:一台主机可以可靠地检测出另一台主机是否在做混合探测。此外,它只工作在非交换环境下。第三,在一个高流量网络中,主机会耗费很多系统资源。

四、过滤流量

有时候我们的探测器只关注特定流量。例如,有时候我们只想在端口23上探测以搜索密码,或者可能我们想截至在端口21(FTP)上发送的文件,也许我们只想要DNS流量(端口53UDP)。无论何种情况,我们很少只想盲目地探测所有网络流量。为过滤流量需进入pcap_compile()和pcap_setfilter()函数。

过程非常简单,在我们调用pcap_open_live()函数之后有了一个探测会话,我们能够部署我们的过滤器。为什么不用我们自己的呢?有两个原因:一、PCAP的过滤器效率更高,因为它直接与BPF过滤器关联;我们省去了直接使用BPF驱动的很多步骤。第二、这非常容易。

在部署我们过滤器之前,我们必须“编译”它。过滤器表达式用一个正则字符串保存(字符数组)。语法在TCPDUMP操作手册中描述,这里只举一些简单的例子。

编译程序我们调用pcap_compile()。原型定义如下:

int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)

第一个参数是我们的会话句柄(在我们之前的例子中是pcap_t *handle)。跟着它的是一个我们将存储我们过滤器的编译版本位置的索引。然后是以正则字符串格式的表达式自身。下一个是一个整数决定了表达式是否被优化(0是假,1是真)。最好,我们必须规定过滤器将部署网络的网络掩码。函数失败时返回-1;其他值表示成功。

表达式编译后,是时候部署它。进入pcap_setfilter()函数。遵循我们解释PCAP的格式,我们将查看pcap_setfilter()原型:

int pcap_setfilter(pcap_t *p, struct bpf_program *fp)

这个非常直观。第一个参数是我们的会话句柄,第二个是到表达式编译版本的指针(假定与pcap_compile()的第二个参数是相同的变量)。

另一段代码将帮助我们更好理解:

#include

...

pcap_t *handle; /* Session handle */

char dev[] = "rl0"; /* Device to sniff on */

char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */

struct bpf_program fp; /* The compiled filter expression */

char filter_exp[] = "port 23"; /* The filter expression */

bpf_u_int32 mask; /* The netmask of our sniffing device */

bpf_u_int32 net; /* The IP of our sniffing device */

if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {

fprintf(stderr, "Can't get netmask for device %s\n", dev);

net = 0;

mask = 0;

}

handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);

if (handle == NULL) {

fprintf(stderr, "Couldn't open device %s: %s\n", somedev, errbuf);

return(2);

}

if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {

fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));

return(2);

}

if (pcap_setfilter(handle, &fp) == -1) {

fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));

return(2);

}

该程序将指示探测器在混合模式下在设备r10的端口23上探测出入的流量。你可以注意到在先期例子中包含一个我们还没有讨论的函数。Pcap_lookupnet()函数输入一个设备名字将返回它的IP和网络掩码。这是必须的,因为我们需要知道掩码以部署过滤器。该函数在本文最后的其他部分描述。

根据我的经验该过滤器并不是在所有操作系统上都工作。在我的测试环境,我发现有一缺省内核的OpenBSD 2.9支持该类型过滤器,但是包含缺省内核的FreeBSD 4.3不支持。

五、实际探测

到目前我们已经学习了如何定义设备,准备好探测,并且部署好什么应该探测什么不探测的过滤器。现在是实际部署一些包了。

有两种主要的抓包技术。我们能够在某时捕获一个单独的包,或者在做事情之前进入一个循环等待n个要探测的包。我们将开始看看如何捕获一个单独包,以及使用循环的方法。我们使用pcap_next()。pcap_next()的原型相对简单:

u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

第一个参数是我们的会话句柄,第二个参数是一个指针,指向容纳有关包一般信息的结构,特别地其中包括探测时间、包长度、其特定部分的长度(例如在被分段的情况)。Pcap_next()返回一个u_char指针指向上述结构描述的包。我们将讨论实际读取包的技术。

这里是一个使用pcap_next()探测分组的示例:

#include

#include

int main(int argc, char *argv[])

{

pcap_t *handle; /* Session handle */

char *dev; /* The device to sniff on */

char errbuf[PCAP_ERRBUF_SIZE]; /* Error string */

struct bpf_program fp; /* The compiled filter */

char filter_exp[] = "port 23"; /* The filter expression */

bpf_u_int32 mask; /* Our netmask */

bpf_u_int32 net; /* Our IP */

struct pcap_pkthdr header; /* The header that pcap gives us */

const u_char *packet; /* The actual packet */

/* Define the device */

dev = pcap_lookupdev(errbuf);

if (dev == NULL) {

fprintf(stderr, "Couldn't find default device: %s\n", errbuf);

return(2);

}

/* Find the properties for the device */

if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {

fprintf(stderr, "Couldn't get netmask for device %s: %s\n", dev, errbuf);

net = 0;

mask = 0;

}

/* Open the session in promiscuous mode */

handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);

if (handle == NULL) {

fprintf(stderr, "Couldn't open device %s: %s\n", somedev, errbuf);

return(2);

}

/* Compile and apply the filter */

if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {

fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));

return(2);

}

if (pcap_setfilter(handle, &fp) == -1) {

fprintf(stderr, "Couldn't install

filter %s: %s\n", filter_exp, pcap_geterr(handle));

return(2);

}

/* Grab a packet */

packet = pcap_next(handle, &header);

/* Print its length */

printf("Jacked a packet with length of [%d]\n", header.len);

/* And close the session */

pcap_close(handle);

return(0);

}

应用在pcap_lookupdev()返回的设备上设置为混合模式探测。它发现来自端口23(telnet)的第一个包并告诉用户包的大小(字节数)。再一次,该程序包含一个新的调用pcap_close(),我们之后将讨论。

我们能够使用的另一个技术更复杂,并可能更有用。很少探测器实际使用pcap_next()。更多地,使用pcap_loop()或者pcap_dispatch()。为理解这两个函数的使用,你必须理解回调函数的思想。

回调函数不是新东西,在很多API中都很普通。回调函数的概念很简单。假定我有一个程序等待某种事件。为了本例的目的,让我们假定我的程序希望一个用户在键盘上按一个键。每次他们按一个键,我将调用一个函数,它将决定做什么。我使用的函数就是一个回调函数。每次用户按一个键,我的程序将调用回调函数。回调在pcap中使用,但是代替用户按键时被调用,他们在pcap探测到一个分组包时被调用。用户用于定义其回调的两个函数是pcap_loop()和pcap_dispatch()。pcap_loop()和pcap_dispatch()在使用回调时非常相同。两者都是在满足我们过滤要求的包被探测到时调用回调函数。如果不是,则所有被探测的包都发往回调函数。

Pcap_loop()的原型如下:

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 第一个参数是我们的会话句柄。接着是一个整数告诉pcap_loop()在返回前应探测多少包(负数值表示它直到错误发生前都一直探测)。第三个参数是回调函数的名字(只是其标识符,没有括号)。最后一个参数在某些应用中有用,但多数情况只是简单设置为NULL。假定除了pcap_loop()发送的参数,我们有我们自己的参数想发送给回调函数,就使用该参数。明显地,你必须强制转换到u_char指针以确保此处的结果正确;正如我们此后将看到的,pcap利用一些非常有用的方法以u_char指针的形式传递信息。在我们显示一个pcap如何操作的例子之后,将很清楚此处该如何去做。如果不是,参考你手头的C参考书,指针的解释已经超过本文。Pcap_dispatch()和pcap_loop()之间的区别是pcap_dispatch()将只处理它从系统接收的第一批包,而pcap_loop将一直处理成批的包直到包数量超过了。两者的深度区别请看参考手册。

在我们能够提供使用pcap_loop()的例子之前,我们必须坚持我们的回调函数格式。我们不能够任意地定义我们回调函数的原先,否则,pcap_loop()将不知道如何使用函数。我们使用的回调函数原型格式如下:

void got_packet(u_char *args, const struct pcap_pkthdr *header,

const u_char *packet);

让我们看看细节。首先,你将注意到函数有一个void返回类型。这是逻辑上可理解的额,因为pcap_loop()不知道如何处理返回值。第一个参数与pcap_loop()的最后一个参数关联。无论传递到pcap_loop()的第一个参数值是什么在回调函数每次被调用时都将传递给函数的第一个参数。第二个参数是pcap头,它包含这当包被探测到时有多大等等这样的信息。在pcap.h中定义的pcap_pkthdr结构如下:

struct pcap_pkthdr {

struct timeval ts; /* time stamp */

bpf_u_int32 caplen; /* length of portion present */

bpf_u_int32 len; /* length this packet (off wire) */ };

这些值自身基本都可解释了。最后一个参数最重要,也对程序员最容易产生混乱。这是另一个到u_char的指针,指向包含pcap_loop探测到的完整包的数据块的第一个字节。

但是如何利用这个变量(在我们原型中名为“packet”)?正如你想到的,包包含很多属性,这不是简单的一个字符串,实际上是一个结构的集合(例如,TCP/IP包有以太头,IP 头,TCP头,以及包的负载)。该u_char指针指向该结构的串行版本。为利用它,我们必须做某些有意义的类型转换。

首先,在类型转换之前我们必须有实际的结构定义。下面我

Wireshark使用教程(精品)

Wireshark使用教程 第 1 章介绍 1.1. 什么是Wireshark Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 你可以把网络包分析工具当成是一种用来测量有什么东西从网线上进出的测量工具,就好像使电工用来测量进入电信的电量的电度表一样。(当然比那个更高级) 过去的此类工具要么是过于昂贵,要么是属于某人私有,或者是二者兼顾。 Wireshark出现以后,这种现状得以改变。Wireshark可能算得上是今天能使用的最好的开元网络分析软件。 1.1.1. 主要应用 下面是Wireshark一些应用的举例: ?网络管理员用来解决网络问题 ?网络安全工程师用来检测安全隐患 ?开发人员用来测试协议执行情况 ?用来学习网络协议 除了上面提到的,Wireshark还可以用在其它许多场合。 1.1. 2. 特性 ?支持UNIX和Windows平台 ?在接口实时捕捉包 ?能详细显示包的详细协议信息 ?可以打开/保存捕捉的包 ?可以导入导出其他捕捉程序支持的包数据格式 ?可以通过多种方式过滤包 ?多种方式查找包 ?通过过滤以多种色彩显示包 ?创建多种统计分析 ?…还有许多 不管怎么说,要想真正了解它的强大,您还得使用它才行

图 1.1. Wireshark捕捉包并允许您检视其内 1.1.3. 捕捉多种网络接口 Wireshark 可以捕捉多种网络接口类型的包,哪怕是无线局域网接口。想了解支持的所有网络接口类型,可以在我们的网站上找到https://www.wendangku.net/doc/0917080516.html,/CaptureSetup/NetworkMedia. 1.1.4. 支持多种其它程序捕捉的文件 Wireshark可以打开多种网络分析软件捕捉的包,详见??? 1.1.5. 支持多格式输出 Wieshark可以将捕捉文件输出为多种其他捕捉软件支持的格式,详见??? 1.1.6. 对多种协议解码提供支持 可以支持许多协议的解码(在Wireshark中可能被称为解剖)??? 1.1.7. 开源软件 Wireshark是开源软件项目,用GPL协议发行。您可以免费在任意数量的机器上使用它,不用担心授权和付费问题,所有的源代码在GPL框架下都可以免费使用。因为以上原因,人们可以很容易在Wireshark上添加新的协议,或者将其作为插件整合到您的程序里,这种应用十分广泛。 1.1.8. Wireshark不能做的事 Wireshark不能提供如下功能 ?Wireshark不是入侵检测系统。如果他/她在您的网络做了一些他/她们不被允许的奇怪的事情,Wireshark不会警告您。但是如果发生了奇怪的事情,Wireshark可能对察看发生了什么会有所帮助。[3]?Wireshark不会处理网络事务,它仅仅是“测量”(监视)网络。Wireshark不会发送网络包或做其它交互性的事情(名称解析除外,但您也可以禁止解析)。 1.2. 系通需求

pcap文件格式

PCAP文件格式 每个.pcap文件的文件头Pcap Header:24B 每个.pcap文件中的数据包头 Packet Header:16B 每个.pcap文件中的数据报 Packet Data:14B以太头+TCP/IP数据 具体如下: 1.pcap文件头部(pcap header) sturct pcap_file_header { DWORD magic; WORD version_major; WORD version_minor; DWORD thiszone; DWORD sigfigs; DWORD snaplen; DWORD linktype; } 说明: 1、标识位magic:32位的,这个标识位的值是16进制的 0xa1b2c3d4。 32-bit magic number , The magic number has the value hex a1b2c3d4. 2、主版本号version_major:16位,默认值为0x2。返回写入被打开文件所使用的pcap函数的主版本号。 16-bit major version number, The major version number should have the value 2. 3、副版本号version_minor:16位,默认值为0x04。 16-bit minor version number, The minor version number should have the value 4. 4、区域时间thiszone:32位,实际上该值并未使用,因此可以将该位设置为0。 32-bit time zone offset field that actually not used, so you can (and probably should) just make it 0;

pcap过滤规则格式

函数名称:int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str, int optimize, bpf_u_int32 netmask) 函数功能:该函数用于将str指定的规则整合到fp过滤程序中去,并生成过滤程序入口地址,用于过滤选择期望的数据报。 参数说明: pcap_t *p:pcap_open_live返回的数据报捕获的指针; struct bpf_program *fp:指向一个子函数用于过滤,在pcap_compile()函数中被赋值; char *str:该字符串规定过滤规则; int optimize:规定了在结果代码上的选择是否被执行; bpf_u_int32 netmask:该网卡的子网掩码,可以通过pcap_lookupnet()获取; 返回值:如果成功执行,返回0,否则返回-1; 过滤规则由一个或多个原语(primitive)组成,如果为””则表示不进行任何过滤. 原语通常由一个标识(id, 名称或数字), 和标识前面的一个或多个修饰子(qualifier) 组成. 修饰子有三种不同的类型: type 类型修饰子指出标识名称或标识数字代表什么类型的东西. 能够使用的类型有host, net 和port. 例如, `host foo', `net 128.3', `port 20'. 假如不指定类型修饰子, 就使用缺省的 host . dir 方向修饰子指出相对于标识的传输方向 (数据是传入还是传出标识). 能够使用的方向有 src, dst, src or dst和src and dst. 例如, `src foo', `dst net 128.3', `src or dst port ftp-data'. 假如不指定方向修饰子, 就使用缺省的src or dst .对于 `null' 链路层 (就是说象 slip 之类 的点到点协议), 用inbound和outbound修饰子指定所需的传输方向. proto 协议修饰子需要匹配指定的协议. 能够使用的协议有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp和udp. 例如, `ether src foo', `arp net 128.3', `tcp port 21'. 假如 不指定协议修饰子, 就使用任何符合类型的协议. 例如, `src foo' 指 `(ip 或 arp 或 rarp) src foo' (注意后者不符合语法), `net bar' 指 `(ip 或 arp 或 rarp) net bar', `port 53' 指 `(tcp 或 udp) port 53'. [`fddi' 实际上是 `ether' 的别名; 分析器把他们视为 ``用在指定网络接口上的数据链路层.'' FDDI 报头包含类似于以太协议的源目地址, 而且通常包含类似于以太协议的报文类型, 因此您能 够过滤 FDDI 域, 就象分析以太协议相同. FDDI 报头也包含其他域, 但是您不能在过滤器表达式 里显式描述.] 作为上述的补充, 有一些特别的 `原语' 关键字, 他们不同于上面的模式: gateway, broadcast, less, greater和数学表达式. 这些在后面有叙述. 更复杂的过滤器表达式能够通过and, or和not连接原语来组建. 例如, `host foo and not port ftp and not port ftp-data'. 为了少敲点键, 能够忽略相同的修饰子. 例如, `tcp dst port ftp or ftp-data or domain' 实际上就是 `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'. 允许的原语有: dst host host

任务三计算机网络实验IP数据报捕获与分析

任务三计算机网络实验I P数据报捕获与 分析

任务三网络编程 一、实验目的 捕获本机网卡的IP包,对捕获的IP包进行解析。要求必须输出以下字段:版本号、总长度、标志位、片偏移、协议、源地址和目的地址。 二、实验环境 平台:Windows 编程环境:VC 6.0 语言:C++ 三、实验原理 3.1 数据报格式 以太帧由一个包含三个字段的帧头开始,前两个字段包含了物理地址,各六个字节,头部的第三个字段包含了 16 位的以太帧类型,帧头后面是数据区。根据帧类型可以判断是哪种数据包,一般常用的有 0X0080(IP 数据包)、0X0806(ARP 请求/应答)和 0X8035(RARP 请求/应答)三种类型。TCP/IP 协议簇中位于网络层的协议,也是最为核心的协议。所有的 TCP, UDP, ICMP 及 IGMP 数据都以 IP 数据报格式传输。IP 协议提供了无连接的、不可靠的数据传输服务。同时IP 协议的一个重要功能是为网络上的包传递提供路由支持。TCP/IP 协议使用 IP 数据报这个名字来指代一个互联网数据包。IP 数据报由两部分组成,前面的头部和后面的数据区,头部含有描述该数据报的信息,包括源 IP 地址和目的 IP 地址等。在 IP 数据报的报头中的众多信息可根据协议类型字段区分出该数据包的类型,常用的有TCP 包、 UDP 包、 ICMP 包等,各格式分别如下所示:

IP数据报格式 TCP数据报格式 ICMP数据报格式

UDP数据报格式 3.2 捕获数据包方法 目前常用的捕获数据包的方法有原始套接字、LibPcap、WinPcap和JPcap 等方法。本次实验选用套接字方法。套接字是网络应用编程接口。应用程序可以使用它进行网络通信而不需要知道底层发生的细节。有时需要自己生成一些定制的数据包或者功能并希望绕开Socket提供的功能,原始套接字(RawSocket)满足了这样的要求。原始套接字能够生成自己的数据报文,包括报头和数据报本身的内容。通过原始套接字,可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。 网络数据包截获机制一般指通过截获整个网络的所有信息流,根据信息源主机,目标主机,服务协议端口等信息,简单过滤掉不关心的数据,再将用户感兴趣的数据发送给更高层的应用程序进行分析。一般数据包的传输路径依次为网卡、设备驱动层、数据链路层、 IP 层、传输层、最后到达应用程序。IP 数据包的捕获就是将经过数据链路层的以太网帧拷贝出一个备份,传送给 IP 数据包捕获程序进行相关的处理。 IP 数据包的捕获程序一般由数据包捕获函数库和数据包分析器组成。数据包捕获函数库是一个独立于操作系统的标准捕获函数库。主要提供一组可用于查找网络接口名称、打开选定的网络接口、初始化、设置包过滤条件、编译过滤代码、捕获数据包等功能函数。对捕获程序而言,只需要调用数据包捕获函数库的这些函数就能获得所期望的 IP 数据包。这种捕获程序与数据包捕获函数库分离的机制,使得编写的程序具有很好的可移植性。IP 数据包捕获程序的核心部分就是数据包分析器。数据包分析器应具有识别和理解各种协议格式

Pcap 文件格式和 WireShark

Pcap 文件格式和 WireShark PCAP是一个数据包抓取库, 很多软件都是用它来作为数据包抓取工具的。 WireShark也是用PCAP库来抓取数据包的。PCAP抓取出来的数据包并不是原始的网络字节流,而是对其进行从新组装,形成一种新的数据格式。 一个用PCAP抓取的数据包的文件格式如下: Pcap文件头24B各字段说明: Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始 Major:2B,0x02 00:当前文件主要的版本号

Minor:2B,0x04 00当前文件次要的版本号 ThisZone:4B当地的标准时间;全零 SigFigs:4B时间戳的精度;全零 SnapLen:4B最大的存储长度 LinkType:4B链路类型 常用类型: 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 其中我们最为常见的类型就是1,以太网链路。 字段说明: Timestamp:时间戳高位,精确到seconds

简洁的Pcap文件格式--Wireshark

PCAP 文件格式协议分析 一、基本格式: 文件头数据包头数据报数据包头数据报...... pcap文件格式结构 格式如结构体 pcap_file_header 格式如pcap_pkthdr 数据包 格式如pcap_pkthdr 数据包 格式如pcap_pkthdr 数据包 二、文件头结构体: sturct pcap_file_header { DWORD magic; WORD version_major; WORD version_minor; DWORD thiszone; DWORD sigfigs; DWORD snaplen; DWORD linktype; } 说明: 1、标识位:32位的,这个标识位的值是16进制的 0xa1b2c3d4。 a 32-bit magic number ,The magic number has the value hex a1b2c3d4. 2、主版本号:16位,默认值为0x2。 a 16-bit major version number,The major version number should have the value 2. 3、副版本号:16位,默认值为0x04。 a 16-bit minor version number,The minor version number should have the value 4. 4、区域时间:32位,实际上该值并未使用,因此可以将该位设置为0。 a 32-bit time zone offset field that actually not used, so you

pcap及pcapng格式解析中文版

TOC Network Working Group L. Degioanni Internet-Draft CACE Technologies Expires: September 2, 2004 F. Risso Politecnico di Torino G. Varenni CACE Technologies March 2004 PCAP下一代转储文件格式 PCAP-DumpFileFormat Status of this Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC 2026. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet-Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as “work in progress.” The list of current Internet-Drafts can be accessed at https://www.wendangku.net/doc/0917080516.html,/ietf/1id-abstracts.txt. The list of Internet-Draft Shadow Directories can be accessed at https://www.wendangku.net/doc/0917080516.html,/shadow.html. This Internet-Draft will expire on September 2, 2004. Copyright Notice

抓包分析说明文档

抓包分析说明文档 说明: 本文档针对ZXSEC US产品的后台抓包命令使用进行说明,相关详细命令参照相关手册。 在使用后台抓包分析命令时,建议大家使用如SecureCRT这样的远程管理工具,通过telnet或者ssh的方式登陆到网关,由于UTM本身不支持将抓包的结果保存在设备自身的存储空间,因此需要借助SecureCRT这样远程管理工具接收文件。 1.基本命令 命令: diagnose sniffer packet. # diag sniffer packet <'filter'> 2.参数说明 2.1 interface 指定实际的接口名称,可以是真实的物理接口名称,也可以是VLAN的逻辑接口名称,当使用“any”关键字时,表示抓全部接口的数据包。 例: #diag sniffer packet port1//表示抓物理接口为port1的所有数据包 #diag sniffer packet any//表示抓所有接口的所有数据包 #diag sniffer packet port1-v10//当在物理接口建立一个VLAN子接口,其逻辑接口名为port1-v10,此时表示抓port1-v10接口的所有数据包,此处一定注意一个问题,由于抓包命令中的空格使用来区分参数字段的,但是在逻辑接口创建时,接口名称支持空格,考虑到今后抓包分析的方便,建议在创建逻辑接口时不要带有空格。

2.2 verbose 指控制抓取数据包的内容 1: print header of packets, //只抓取IP的原地址、源端口、目的地址、目的端口和数据包的Sequence numbers 为系统缺省设置 2: print header and data from ip of packets, //抓取IP数据包的详细信息,包括IP数据的payload。 3: print header and data from ethernet of packets) ,//抓取IP数据包的详细信息,包括IP数据的payload,导出到文本文件可以使有专用的转换工具,转换为Ethereal支持文件格式 例: 【例1】抓所有接口(interface=any)的任何数据包(filter=none),级别1(verbose=1) ZXSEC-US # dia sni pa any none 1 interfaces=[any] filters=[none] nr=2048,fr=1584,b_nr=1024,pg=4096 3.710103 127.0.0.1.1029 -> 127.0.0.1.53: udp 40 【例2】抓所有接口(interface=any)的任何数据包(filter=none),级别2(verbose=2),会显示数据包的payload信息。 # diag sniffer packet internal none 2 1 192.168.0.1.22 -> 192.168.0.30.1144: psh 2867817048 ack 1951061933 0x0000 4510 005c 8eb1 4000 4006 2a6b c0a8 0001 E..\..@.@.*k.... 0x0010 c0a8 001e 0016 0478 aaef 6a58 744a d7ad .......x..jXtJ.. 0x0020 5018 0b5c 8ab9 0000 9819 880b f465 62a8 P..\.........eb. 0x0030 3eaf 3804 3fee 2555 8deb 24da dd0d c684 >.8.?.%U..$..... 0x0040 08a9 7907 202d 5898 a85c facb 8c0a f9e5 ..y..-X..\...... 0x0050 bd9c b649 5318 7fc5 c415 5a59 ...IS.....ZY 【例3】抓所有接口(interface=any)的任何数据包(filter=none),级别3(verbose=3),会显示数据包的payload信息。 ZXSEC-US # dia sni pa any none 3

x86指令编码格式解析

提到编码,只要学过一点汇编的人都应该知道一些常用的汇编指令的编码,比如:B8 78 56 34 12,一看到B8就知道对应的汇编指令是MOV EAX,0X12345678 占用5字节,一看到E8就知道是E8后面跟的是JMP 的4字节偏移,一见90就知道是NOP,因为这些指令都很常用,编码也都很简单,想必大家对这些指令编码都熟记于心了。如果提到 MOV EBX,XXXXXXXX MOV ECX,XXXXXXX这些指令也许大家对指令编码就不怎么记得了,因为X86的编码太多了,要把他全记住那可不是件容易的事。其实要把X86的编码指令记住并不是件难事,因为X86编码指令看似复杂庞大,其实这大部分编码有是有规律可寻的。 在这里先说组寄存器: 0 1 2 3 4 5 6 7 EAX ECX EDX EBX ESP EBP ESI EDI 0 1 2 3 4 5 6 7 AL CL DL BL AH CH DH BH 不知道各位同学当年学汇编的时候寄存器是不是按这个顺序记的,如果是按这个顺序记住的话,接下来讲的编码你可能一看就记住了 B8是MOV EAX 大家都很清楚的记得,那么B9呢?B9就是MOV ECX ,BA MOV EDX 聪明的同学应该很快的看出规律出来了吧!BB 是MOV EBX ,BC是MOV ESP 一直到BF 是MOV EDI B0是MOV AL,XX 2字节立即数,对照上面的表格,大家应该很容易的说出B1是MOV CL,XX,一直到B7是MOV BH,XX 90是NOP大家都知道,其实他的真正编码指令是XCHG EAX,EAX,91 XCHG EAX,ECX 一直到97 XCHG EAX,EDI 40到47是INC EAX 到 INC EDI ,48到4F是DEC EAX到DEC EDI 50到57是PUSH EAX 到 PUSH EDI ,58到 5F是 POP EAX 到 POP EDI 现在对于这一类的指令编码,大家是不是感觉记起来轻松了 对内存访问的指令在汇编中也经常出现,现在在说说这些指令的编码格式 ADD OR ADC SBB AND SUB XOR CMP ES CS SS DS DAA DAS AAA AAS 就跟上面我说的寄存器一样先按顺序记下这些东西再说 要讲对内存访问的编码就不得不先说说X86通用的编码指令格式 上图参考INTEL开发手册卷二,想具体了解的可以去参考下,看不懂英文的,论坛的翻译版块有部分章节

计算机网络-使用网络协议分析器捕捉和分析协议数据包

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室2014年11月28日 一、实验目的 (1)熟悉ethereal的使用 (2)验证各种协议数据包格式 (3)学会捕捉并分析各种数据包。 二、实验环境 1.MacBook Pro 2.Mac OS 10.10.1 3..Wireshark 三、实验内容 1.安装ethereal软件 2.捕捉数据包,验证数据帧、IP数据报、TCP数据段的报文格式。 3.捕捉并分析ARP报文。 4.捕捉ping过程中的ICMP报文,分析结果各参数的意义。 5.捕捉tracert过程中的ICMP报文,分析跟踪的路由器IP是哪个接口的。 6.捕捉并分析TCP三次握手建立连接的过程。 7.捕捉整个FTP工作工程的协议包 对协议包进行分析说明,依据不同阶段的协议分析,画出FTP工作过程的示意图 a.. 地址解析ARP协议执行过程 b. FTP控制连接建立过程 c . FTP 用户登录身份验证过程 d. FTP 数据连接建立过程 e. FTP数据传输过程 f. FTP连接释放过程(包括数据连接和控制连接) 8.捕捉及研究WWW应用的协议报文,回答以下问题: a. .当访问某个主页时,从应用层到网络层,用到了哪些协议? b. 对于用户请求的百度主页(https://www.wendangku.net/doc/0917080516.html,),客户端将接收到几个应答报文?具体是哪几个? 假设从本地主机到该页面的往返时间是RTT,那么从请求该主页开始到浏览器上出现完整页面, 一共经过多长时间? c. 两个存放在同一个服务器中的截然不同的Web页(例如,https://www.wendangku.net/doc/0917080516.html,/index.jsp,和

NS3对于初学者的教程,高手忽略这个吧

1.Ns3 的安装: 开发环境配置: sudo apt-get install gcc g++ python python-dev //C++和python安装,必装 sudo apt-get install mercurial //NS3代码维护使用的源码版本控制管理系统 sudo apt-get install bzr //运行python绑定ns-3-dev需要bazaar这个组件 sudo apt-get install libgtk2.0-0 libgtk2.0-dev //基于GTK的配置系统 sudo apt-get install gdb valgrind //调试工具 sudo apt-get install doxygen graphviz imagemagick //文档生成器 sudo apt-get install texlive texlive-latex-extra //文档生成器,从源代码中生成说明文档 sudo apt-get install texinfo dia texlive-extra-utils texi2html //ns-3手册和tutorial编写查看工具 sudo apt-get install flex bison //仿真必需的词法分析器和语法分析生成器,必装 sudo apt-get install libgoocanvas-dev //部分移动场景仿真的可视化测试需要这个组件 sudo apt-get install tcpdump //读取pcap的packet traces,即包嗅探器 sudo apt-get install sqlite sqlite3 libsqlite3-dev //支持统计特性的数据库软件 sudo apt-get install libxml2 //xml的配置存储软件 sudo apt-get install python-pygraphviz python-kiwi python-pygoocanvas //Gustavo's ns-3-pyviz的可视化软件 sudo apt-get install qt4-qmake sudo apt-get install qt4-dev-tools 安装完成后: 进入ns-allinone-3.16目录 sudo ./build.py 之后进入ns-allinone-3.16/ns-3.16 sudo ./waf -check 返回目录ns-allinone-3.16 进入目录netanim-3.103 sudo make clean sudo qmake NetAnim.pro sudo make 之后 sudo ls 可以看见绿色的NetAnim这个东西就成功了 sudo ./NetAnim 打开仿真界面 安装全部完成

pcap文件格式及文件解析

第一部分:PCAP包文件格式 一基本格式: 文件头数据包头数据报数据包头数据报...... 二、文件头: 文件头结构体 sturct pcap_file_header { DWORD magic; DWORD version_major; DWORD version_minor; DWORD thiszone; DWORD sigfigs; DWORD snaplen; DWORD linktype; }

说明: 1、标识位:32位的,这个标识位的值是16进制的0xa1b2c3d4。 a 32-bit magic number ,The magic number has the value hex a1b2c3d4. 2、主版本号:16位,默认值为0x2。 a 16-bit major version number,The major version number should have the value 2. 3、副版本号:16位,默认值为0x04。 a 16-bit minor version number,The minor version number should have the value 4. 4、区域时间:32位,实际上该值并未使用,因此可以将该位设置为0。 a 32-bit time zone offset field that actually not used, so you can (and probably should) just make it 0; 5、精确时间戳:32位,实际上该值并未使用,因此可以将该值设置为0。 a 32-bit time stamp accuracy field tha not actually used,so you can (and probably should) just make it 0; 6、数据包最大长度:32位,该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535;例如:想获取数据包的前64字节,可将该值设置为64。 a 32-bit snapshot length" field;The snapshot length field should be the maximum number of bytes perpacket that will be captured. If the entire packet is captured, make it 65535; if you only capture, for example, the first 64 bytes of the packet, make it 64.

Wireshark的Pcap文件格式分析及解析源码

Wireshark的Pcap文件格式分析及解析源码 下面主要介绍下Ethereal默认的*.pcap文件保存格式。 Pcap文件头24B各字段说明: Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始 Major:2B,0x02 00:当前文件主要的版本号 Minor:2B,0x04 00当前文件次要的版本号 ThisZone:4B当地的标准时间;全零 SigFigs:4B时间戳的精度;全零 SnapLen:4B最大的存储长度 LinkType:4B链路类型 常用类型: 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 Packet 包头和Packet数据组成 字段说明: Timestamp:时间戳高位,精确到seconds Timestamp:时间戳低位,精确到microseconds Caplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。 Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。 Packet 数据:即 Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就是说:PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet包确定。最后,Packet数据部分的格式其实就是标准的网路协议格式了可以任何网络教材上找得到。 以下是我的实现,针对自定义的UDP的抓包文件进行解析 typedef struct tagIpHead { int version;//版本 int headLength; //头长度 int diffsever; int totallength; //总长度 int identification; int flag; int fragment; int ttl; int protocoltype; //协议类型 int checksum; unsigned long srcip;//源ip unsigned long dstip;//目的ip }IP_HEAD;

实验1 网络协议分析

实验1 网络协议分析 1. 实验目的 1.了解一种网络数据捕获工具的基本功能和使用方法。 2.掌握IP、TCP协议的格式及工作过程 3.掌握ICMP协议的格式及工作过程 2. 实验环境 1.实验室提供PC 2.Red Hat Linux 9.0(或Ubuntu Linux 8.04) 3.Windows XP 3.实验原理 网络分析(network analysis)是指捕捉网络流动的数据包,将网络数据转换成可读格式,通过查看包内部数据来发现网络中的问题,分析网络性能并发现瓶颈;监视网络通信量,观察网络协议的行为,了解网络的运行状态;深入了解网络协议的功能。 这一单元介绍些计算机网络分析/监视工具的用法。 3.1网络分析系统的基本原理 3.1.1 Libpcap函数库 网络分析系统的工作依赖于一套捕捉网络数据包的函数库。最早的网络数据包捕捉函数库是UNIX系统中的Libpcap函数库。现在大部分UNIX数据包捕获系统都基于Libpcap或者是在其基础上做些针对性的改进。之后,意大利人Fulvio Risso和Lofts Degioanni为Windows系统提出并实现了一个功能强大的开发式数据包捕获平台——Winpcap函数库。 3.1.2 网络分析系统的结构和工作过程 一个网络分析器通常由5部分组成:硬件、捕包驱动、包缓冲区、实时协议分析和解码器。 网络数据包捕捉函数库工作在网络分析系统的最底层,作用是将一个数据包从链路层接收,即从网卡取得数据包或者根据过滤规则取出数据包的子集。 捕包函数捕回数据包后就需要将其转变给上层的分析模块,进行协议分析和协议还原工

作。由于OSI的7层协议模型,协议数据是从上到下判装后发送的。由于协议分析需要从下至上进行:首先对网络层的协议识别后进行组包还原,然后脱去网络层协议头,将里面的数据交给传输层分析,这样一直进行到应用层。 3.1.3基于插件技术的协议分析器 采用插件技术,就是在程序的设计开发过程中,把整个应用程序分成宿主程序和插件两个部分,宿主程序与插件能够相互通信。在宿主程序不变的情况下,就可以通过增减插件或修改插件来调整应用程序的功能。运用插件技术可以开发出伸缩性良好、便于维护的应用程序,程序有很强的可扩展性,各个功能模块内聚性强。 现在的网络协议种类繁多,为了可以随时增加新的协议分析器,一般的协议分析器都采用插件技术。这样,如果需要对一个新的协议进行分析,只需开发编写这个协议分析器并调用注册函数在系统注册就可以使用了。 3.2网络协议分析器Ethereal 3.2.1 Ethereal概述 1.Ethereal的特点 Ethereal是一个可以对活动的网络上或磁盘中捕获数据并分析的重要软件,它有如下一些特点。 (1)它是当前较为流行的一种计算机网络调试和数据包嗅探软件,可以应用于故障修复、分析、软件和协议开发以及教育领域。 (2)可以在实时时间内,从网络连接处捕获数据,或者从被捕获文件处读取数据。 (3)它是一种开发源代码的许可软件,允许用户向其中添加改进方案。 (4)可以运行在所有的主流操作系统之上(Windows,Linux,Solaris)。 (5)支持的网络通信协议是所有的抓包工具中最全面的,几乎所有的协议,Ethereal都有相应的解码器,可以从以太网、FDDI、PPP、令牌环、IEEE 802.11、ATM上的IP和回路接口上读取实时数据。 (6)支持几乎所有的抓包工具的保存格式,可以读取从tcpdump(1ibpcap)、网络通用嗅探器(被压缩和未被压缩)、SnifferTM专业版等多种网络监控器处捕获的文件。 (7)可以通过editcap程序的命令行交换机,有计划地编辑或修改被捕获文件。 (8)可以通过显示过滤器精确地显示数据,输出文件可以被保存或打印为纯文本格式。 2.Ethereal的下载和安装Ethereal的下载地址 http://winpcap.polito.it/install/default.htm https://www.wendangku.net/doc/0917080516.html,/distrubution/win32/ 注意:以上两个网址中,第一个为;winpcap的网址,第二个网址Ethereal不再使用。Ethereal现在已更名为wireShark,其网址为https://www.wendangku.net/doc/0917080516.html,/,软件中已集成有winpcap。Ethereal作为早期版本可在网络中搜索下载,官方网站似乎不再提供下载。 事实上,Ethereal本身并不能抓包,它只能用来解析数据包;要抓取数据包,需要借助于Pcap(在Windows下面的实现称作Winpcap,所以在Windows操作系统下,在安装

相关文档
相关文档 最新文档