pcap包解析

pcap包解析
pcap包解析

项目A从pcap文件中析取所有TCP会话与UDP会话张中秋(U201217502 ,853950423@https://www.360docs.net/doc/f01441234.html,, tel 139********,1205班)执笔100% 签字

摘要:本项目主要针对的是对于单一网络节点,.pcap文件是二进制格式的网络轨迹(Network trace)文件,记录了网络通信过程的数据包信息。csv(comma separated values)是一种用逗号','分隔的文本文件,类似于excel文件。.pcap 文件是二进制文件,需要从中提取信息并以csv的格式进行存储。可以使用tshark 实现对.pcap文件进行分析。

关键词:TCP/UDP协议,数据包,文件,IP包

1.引言

要对整个pcap文件进行操作,就必须先对pcap文件进行解析,析取pcap文件中所有的TCP会话和UDP会话。HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。所以在做http重组之前,对pcap文件中TCP会话与UDP会话的提取非常的关键。

2.项目问题分析与解决问题的算法

Pcap文件结构:

(1)基本格式:

文件头数据包头数据报数据包头数据报......

(2)文件头:

图1 pcap文件头

a、标识位:32位的,这个标识位的值是16进制的 0xa1b2c3d4。

b、主版本号:16位,默认值为0x2。

c、副版本号:16位,默认值为0x04。

d、区域时间:32位,实际上该值并未使用,因此可以将该位设置为0。

e、精确时间戳:32位,实际上该值并未使用,因此可以将该值设置为0。

f、数据包最大长度:32位,该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535;例如:想获取数据包的前64字节,可将该值设置为64。

g、链路层类型:32位,数据包的链路层包头决定了链路层的类型。

(3)pcap数据包头:

图2 pcap数据包头

a、时间戳,包括:

秒计时:32位,一个UNIX格式的精确到秒时间值,用来记录数据包抓获的时间,记录方式是记录从格林尼治时间的1970年1月1日 00:00:00 到抓包时经过的秒数;

微秒计时:32位,抓取数据包时的微秒值。

b、数据包长度:32位,标识所抓获的数据包保存在pcap文件中的实际长度,以字节为单位。

c、数据包实际长度:所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大。

(4)pcap数据:

即Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就是说:PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet包确定。

(5)读取时进制转换问题:

package PcapFinally;

import java.util.List;

public class Pcap {

private PcapHeader header;

private List data;

public PcapHeader getHeader(){

return header;

}

public void setHeader(PcapHeader header){

this.header=header;

}

public List getData(){

return data;

}

public void setData(List data){

this.data=data;

}

public void ottString(){

System.out.println("data part count="+data.size());

}

}

package PcapFinally;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

public class PcapData {

public static String source_adrress;

//数据包头文件

public static int time_s;//时间戳(秒)

public static int time_ms;//时间戳(微秒)

public static int pLength;//抓包长度

public static int length;//实际长度

public static byte[] content;//数据

public String tai;//以太网帧14字节不作处直接读取十四个字节

//ip包

public String version_ihl;//ip包中的版本号家包头长度1字节

public String tos;//服务类型8字节

public Short totalLen;//总长度2字节

public Short identification;//用于柱状数据包的标识符2字节

public Short flags_fOffset;//控制表示+数据偏移2字节

public String timeToLive;//生命周期1字节

public static String protocol;//协议类型1字节

private short headerChc;//头校验码2字节

public static String source_address;//原地址4字节

public static String des_address;//目的地址4字节

private String options_padding;// 4字节、/根据version_ihl中的地位数,确定ip的位数//tcp结构

public static String source_port;//源端口2字节

public static String des_port;//目的端口2字节

private String seq_number;// 序号大小端原因,高低位4个8bit的存放顺序是反的,intel 使用小端模式4字节

private String ack_number;//确认号,大小端原因,高低位4个8bit的存放顺序是反的,intel 使用小端模式4字节

private String info_ctrl;//Data Offset (4 bits), Reserved (6 bits), Control bits (6 bits),intel使用小端模式2字节

private String window;//窗口2字节

private String checksum;// 校验和2字节

private String urgent_pointer;// 紧急指针2字节

//udp结构

public String usour_port;//源端口2字节

public String udes_port;//目的端口2字节

private String ulength;//udp长度2 字节

private String ucrc;//udp校验码2字节

public int getTime_s(){

return time_s;

}

public void setTime_s(int time_s){

this.time_s=time_s;

}

public int getTime_ms(){

return time_ms;

}

public void setTime_ms(int time_ms){

this.time_ms=time_ms;

}

public int getpLength(){

return pLength;

}

public void setpLength(int pLength){

this.pLength=pLength;

}

public int getLength(){

return length;

}

public void setLength(int length){

this.length=length;

}

public byte[] getContent(){

return content;

}

public void setContent(byte[] content){

this.content=content;

}

public String getiTai(){

return tai;

}

public void setiTai(String tai ){

this.tai=tai;

}

public String getVersion_ihl(){

return version_ihl;

}

public void setVersion_ihl(String version_ihl){ this.version_ihl=version_ihl;

}

public String getTos(){

return tos;

}

public void setTos(String tos){

this.tos=tos;

}

public short getTotalLen(){

return totalLen;

}

public void setTotalLen(short totalLen){ this.totalLen=totalLen;

}

public short getIdentification(){

return identification;

}

public void setIdentification(short identification){ this.identification=identification;

}

public short getFlags_fOffset(){

return flags_fOffset;

}

public void setFlags_fOffset(short flags_fOffset){ this.flags_fOffset=flags_fOffset;

}

public String getTimeToLive(){

return timeToLive;

}

public void setTimeToLive(String timeToLive){ this.timeToLive=timeToLive;

}

public String getProtocol(){

return protocol;

}

public void setProtocol(String protocol){

this.protocol=protocol;

}

public short getHeaderChc(){

return headerChc;

}

public void setHeaderChc(short headerChc){

this.headerChc=headerChc;

}

public String getSource_address(){

return source_address;

}

public void setSource_address(String source_address){ this.source_address=source_address;

}

public String getDes_adress(){

return des_address;

}

public void setDes_adress(String des_address){ this.des_address=des_address;

}

public String getOptions_padding(){

return options_padding;

}

public void setOptions_padding(String options_padding){ this.options_padding=options_padding;

}

public String getSource_port(){

return source_port;

}

public void setSource_port(String source_port){

this.source_port=source_port;

}

public String getDes_port(){

return des_port;

}

public void setDes_port(String des_port){

this.des_port=des_port;

}

public String getSeq_number(){

return seq_number;

}

public void setSeq_number(String seq_number){ this.seq_number=seq_number;

}

public String getAck_number(){

return ack_number;

}

public void setAck_number(String ack_number){ this.ack_number=ack_number;

}

public String getInfo_ctrl(){

return info_ctrl;

}

public void setInfo_ctrl(String info_ctrl){

https://www.360docs.net/doc/f01441234.html,_ctrl=info_ctrl;

}

public String getWindow(){

return window;

}

public void setWindow(String window){

this.window=window;

}

public String getChecksum(){

return checksum;

}

public void setChecksum(String checksum){

this.checksum=checksum;

}

public String getUrgent_pointer(){

return urgent_pointer;

}

public void setUrgent_pointer(String urgent_pointer){ this.urgent_pointer=urgent_pointer;

}

public String getUsour_port(){

return usour_port;

}

public void setUsour_port(String usour_port){ https://www.360docs.net/doc/f01441234.html,our_port=usour_port;

}

public String getUdes_port(){

return usour_port;

}

public void setUdes_port(String udes_port){

this.udes_port=udes_port;

}

public String getUlength(){

return ulength;

}

public void setUlength(String ulength){

this.ulength=ulength;

}

public String getUcrc(){

return ucrc;

}

public void setUcrc(String ucrc){

this.ucrc=ucrc;

}

private String content2Str(byte[] content){

char[] chars = new char[content.length];

for(int i = 0;i < content.length; i++){

chars[i] = (char) content[i];

}

return String.valueOf(chars);

}

public void ttString() throws IOException{

System.out.println("time_s="+this.time_s);

System.out.println("\ntime_ms="+this.time_ms);

System.out.println("\npLength="+this.pLength);

System.out.println("\nlength="+this.length);

System.out.println("\ncontent="+content2Str(this.content));

System.out.println("\niTai="+this.tai);

System.out.println("\nversion_ihl="+this.version_ihl);

System.out.println("\ntos="+this.tos);

System.out.println("\ntotal_length="+this.totalLen);

System.out.println("\nidentification="+this.identification);

System.out.println("\nflags_offset="+this.flags_fOffset);

System.out.println("\ntimeToLive="+this.timeToLive);

System.out.println("\nprptocol="+this.protocol);

System.out.println("\nHeaderChecksum="+this.headerChc);

System.out.println("\nsource_address="+this.source_address);

System.out.println("\nDes_address="+this.des_address);

System.out.println("\noption_padding="+this.options_padding);

System.out.println("\nsour_port="+this.source_port);

System.out.println("\ndes_port="+this.des_port);

System.out.println("\nseq_numer="+this.seq_number);

System.out.println("\nack_number="+this.ack_number);

System.out.println("\ninfo_ctrl="+https://www.360docs.net/doc/f01441234.html,_ctrl);

System.out.println("\nwindow="+this.window);

System.out.println("\nchecksum="+this.checksum);

System.out.println("\nurgent_pointer="+this.urgent_pointer);

System.out.println("\n##########################");

}

public String ooString(){

StringBuilder s = new StringBuilder();

s.append("time_s=").append(this.time_s);

s.append("\ntime_ms=").append(this.time_ms);

s.append("\npLength=").append(this.pLength);

s.append("\nlength=").append(this.length);

s.append("\ncontent=").append(this.content);

s.append("\niTai=").append(this.tai);

s.append("\nversion_ihl=").append((this.tai));

System.out.println("\nversion_ihl="+this.version_ihl);

System.out.println("\ntos="+this.tos);

System.out.println("\ntotal_length="+this.totalLen);

System.out.println("\nidentification="+this.identification);

System.out.println("\nflags_offset="+this.flags_fOffset);

System.out.println("\ntimeToLive="+this.timeToLive);

System.out.println("\nprptocol="+this.protocol);

System.out.println("\nHeaderChecksum="+this.headerChc);

System.out.println("\nsource_address="+this.source_address);

System.out.println("\nDes_address="+this.des_address);

System.out.println("\noption_padding="+this.options_padding);

System.out.println("\nsour_port="+this.source_port);

System.out.println("\ndes_port="+this.des_port);

System.out.println("\nseq_numer="+this.seq_number);

System.out.println("\nack_number="+this.ack_number);

System.out.println("\ninfo_ctrl="+https://www.360docs.net/doc/f01441234.html,_ctrl);

System.out.println("\nwindow="+this.window);

System.out.println("\nchecksum="+this.checksum);

System.out.println("\nurgent_pointer="+this.urgent_pointer);

return null;

}

}

package PcapFinally;

public class PcapHeader {

private int magic;//文件识别头,为1a2b3c4d

private short magor_version;//主要版本

private short minor_version;//次要版本

private int timezone;//当地标准时间

private int sigflags;//时间戳的精度

private int snaplen;//最大的存储长度

private int linktype;//链路类型

public int getMagic(){

return magic;

}

public void setMagic(int magic){

this.magic=magic;

}

public short getMagor_version(){

return magor_version;

}

public void setMagor_version(short magor_version){ this.magor_version=magor_version;

}

public short getMinor_version(){

return minor_version;

}

public void setMinor_version(short minor_version){ this.minor_version=minor_version;

}

public int getTimezone(){

return timezone;

}

public void setTimezone(int timezone){

this.timezone=timezone;

}

public int getSigflags(){

return sigflags;

}

public void setSigflags(int sigflags){

this.sigflags=sigflags;

}

public int getSnaplen(){

return snaplen;

}

public void setSnaplen(int snaplen){

this.snaplen=snaplen;

}

public int getLinktype(){

return linktype;

}

public void setLinktype(int linktype){

this.linktype=linktype;

}

public void otString(){

System.out.println("magic="+"0x"+Integer.toHexString(this.magi c));

System.out.println("\nmagor_version="+this.magor_version);

System.out.println("\nminor_version="+this.minor_version);

System.out.println("\ntimezone="+this.timezone);

System.out.println("\nsigflags="+this.sigflags);

System.out.println("\nsnaplen="+this.snaplen);

System.out.println("\nlinktype="+this.linktype);

}

public String toString(){

StringBuilder sbr=new StringBuilder();

sbr.append("magic=").append("0x"+Integer.toHexString(this.magi c));

return sbr.toString();

}

}

package PcapFinally;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JButton;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class PcapParser {

static File file;

JFrame jframe=new JFrame("五元组分包算法之按钮一");

JPanel jpanela=new JPanel();

JPanel jpanelb=new JPanel();

JPanel jpanelc=new JPanel();

JTextField selectpthJtf=new JTextField(40);

JTextField outputpthJtf=new JTextField(40);

JButton selectbtn=new JButton("选择原文件");

JLabel outputbtn=new JLabel("输出文件路径");

JButton jiexibao=new JButton("五元组分包");

static JTextArea area=new JTextArea(22,22);

JScrollPane jspane=new JScrollPane(area);

public void inint(){

jpanela.add(jspane);

jpanelb.add(selectpthJtf);

jpanelb.add(selectbtn);

jpanelb.add(outputpthJtf);

jpanelb.add(outputbtn);

jpanelc.add(jiexibao);

jframe.add(jpanela,BorderLayout.NORTH);

jframe.add(jpanelb,BorderLayout.CENTER);

jframe.add(jpanelc,BorderLayout.SOUTH);

area.setText("解析过程:");

selectbtn.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

JFileChooser jchoose = new JFileChooser();

// jchoose.showDialog(null, "确定");

if (jchoose.showDialog(null, "确定") == 1) {

return;

}

file = jchoose.getSelectedFile();

selectpthJtf.setText(jchoose.getSelectedFile().toString());

}

});

jiexibao.addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

try {

dealWith();

outputpthJtf.setText("五元组分包后的文件在本程序的项目中,或者在JDK文件下面,五元组命名中,6代表tcp协议,7代表Udp协议");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

jframe.pack();

jframe.setVisible(true);

jframe.setSize(666,555);

}

private static void reverseByteArray(byte[] arr){

byte temp;

int n=arr.length;

for(int i=0;i

temp=arr[i];

arr[i]=arr[n-1-i];

arr[n-1-i]=temp;

}

}

private static int byteArrayToInt(byte[] b,int offset){ int value=0;

for(int i=0;i<4;i++){

int shift=(4-1-i)*8;

value+=(b[i+offset]&0x000000FF)<

}

return value;

}

private static short byteArrayToShort(byte[]b,int offset){ short value=0;

for(int i=0;i<2;i++){

int shift=(2-1-i)*8;

value+=(b[i+offset]&0x000000FF)<

}

return value;

}

public static void main(String[] args) throws IOException { // TODO Auto-generated method stub

PcapParser pp=new PcapParser();

pp.inint();

}

private static void dealWith() throws IOException{

FileInputStream fis=new FileInputStream(file);

byte[] buffer_4=new byte[4];

byte[] buffer_2=new byte[2];

PcapHeader header=new PcapHeader();

Pcap pcap=new Pcap();

int m=fis.read(buffer_4);

if(m!=4){

return;

}

reverseByteArray(buffer_4);

header.setMagic(byteArrayToInt(buffer_4, 0));

m=fis.read(buffer_2);

reverseByteArray(buffer_2);

header.setMagor_version(byteArrayToShort(buffer_2,0));

m=fis.read(buffer_2);

reverseByteArray(buffer_2);

header.setMinor_version(byteArrayToShort(buffer_2,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

header.setTimezone(byteArrayToInt(buffer_4,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

header.setSigflags(byteArrayToInt(buffer_4,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

header.setSnaplen(byteArrayToInt(buffer_4,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

header.setLinktype(byteArrayToInt(buffer_4,0));

header.otString();

pcap.setHeader(header);

List dataList=new ArrayList();

while (m>0){

PcapData data=new PcapData();

m=fis.read(buffer_4);

if(m<0){

break;

}

reverseByteArray(buffer_4);

data.setTime_s(byteArrayToInt(buffer_4,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

data.setTime_ms(byteArrayToInt(buffer_4,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

data.setpLength(byteArrayToInt(buffer_4,0));

m=fis.read(buffer_4);

reverseByteArray(buffer_4);

data.setLength(byteArrayToInt(buffer_4,0));

byte[] content=new byte[data.getpLength()]; m=fis.read(content);

data.setContent(content);

byte[] ti=new byte[14];

for(int i=0;i<14;i++){

ti[i]=content[i];}

data.setiTai(ti.toString());

byte[] ver_ihla=new byte[1];

for(int i=0;i<1;i++){

int b=i+14;

ver_ihla[0]=content[b];

}

data.setVersion_ihl((short)ver_ihla[0] + "");

byte[] tosa=new byte[1];

for(int i=0;i<1;i++){

int b=i+15;

tosa[i]=content[b];

}

data.setTos(String.valueOf(tosa));

byte[] totall=new byte[2];

for(int i=0;i<2;i++){

int b=i+16;

totall[i]=content[b];

}

reverseByteArray(totall);

data.setTotalLen((byteArrayToShort(totall,0)));

byte[] ident=new byte[2];

for(int i=0;i<2;i++){

int b=i+18;

ident[i]=content[b];

}

data.setIdentification(byteArrayToShort(ident,0));

byte[] ff=new byte[2];

for(int i=0;i<2;i++){

int b=i+20;

ff[i]=content[b];

}

data.setFlags_fOffset(byteArrayToShort(ff,0));

byte[] tt=new byte[1];

for(int i=0;i<1;i++){

int b=i+22;

tt[i]=content[b];

}

data.setTimeToLive(String.valueOf(tt));

byte[] pro=new byte[1];

for(int i=0;i<1;i++){

int b=i+23;

pro[i]=content[b];

}

data.setProtocol((short)pro[0] + "");

byte[] hc=new byte[2];

for(int i=0;i<2;i++){

int b=i+24;

hc[i]=content[b];

}

data.setTimeToLive(String.valueOf(tt));

byte[] sou=new byte[4];

StringBuffer sbr = new StringBuffer();

for(int i=0;i<4;i++){

int b = i + 26;

sbr.append((int)(content[b]&0xff));

sbr.append(".");

}

sbr.deleteCharAt(sbr.length() - 1);

data.setSource_address(sbr.toString());

byte[] des=new byte[4];

StringBuffer sba=new StringBuffer();

for(int i=0;i<4;i++){

int b=i+30;

sba.append((int)(content[b]&0xff));

sba.append(".");

}

sba.deleteCharAt(sba.length() - 1);

data.setDes_adress(sba.toString());

if((short)ver_ihla[0]==69){

if((short)pro[0]==6){

//tcp 协议分析

byte[] soure_portt=new byte[2];

StringBuffer sbd=new StringBuffer();

for(int i=0;i<2;i++){

int b=i+34;

sbd.append((int)(content[b]&0xff));

}

sbd.deleteCharAt(sbd.length() - 1);

data.setSource_port(sbd.toString());

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.360docs.net/doc/f01441234.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.360docs.net/doc/f01441234.html,/ietf/1id-abstracts.txt. The list of Internet-Draft Shadow Directories can be accessed at https://www.360docs.net/doc/f01441234.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.360docs.net/doc/f01441234.html,),客户端将接收到几个应答报文?具体是哪几个? 假设从本地主机到该页面的往返时间是RTT,那么从请求该主页开始到浏览器上出现完整页面, 一共经过多长时间? c. 两个存放在同一个服务器中的截然不同的Web页(例如,https://www.360docs.net/doc/f01441234.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.360docs.net/doc/f01441234.html,/distrubution/win32/ 注意:以上两个网址中,第一个为;winpcap的网址,第二个网址Ethereal不再使用。Ethereal现在已更名为wireShark,其网址为https://www.360docs.net/doc/f01441234.html,/,软件中已集成有winpcap。Ethereal作为早期版本可在网络中搜索下载,官方网站似乎不再提供下载。 事实上,Ethereal本身并不能抓包,它只能用来解析数据包;要抓取数据包,需要借助于Pcap(在Windows下面的实现称作Winpcap,所以在Windows操作系统下,在安装

相关主题
相关文档
最新文档