pcap文件分析-上之wireshark工具使用

来源:互联网 发布:淘宝号注册马上注册 编辑:程序博客网 时间:2024/04/30 13:56

1.pcap文件格式说明

pcap文件格式是常用的数据报文存储格式,主流抓包软件,如wireshark、tcpdump等都支持这种格式。

其具体格式为:

    pcap文件头 + { 数据报文信息 + 数据报文 }+

通过查看pcap.h文件,可以知道pcap文件头的具体格式(24字节):

struct pcap_file_header {        bpf_u_int32 magic;        u_short version_major;        u_short version_minor;        bpf_int32 thiszone;     /* gmt to local correction */        bpf_u_int32 sigfigs;    /* accuracy of timestamps */        bpf_u_int32 snaplen;    /* max length saved portion of each pkt */        bpf_u_int32 linktype;   /* data link type (LINKTYPE_*) */};

每一个数据报文,都有对应的数据报文信息(16字节),用于记录数据报文收发的时间,数据报文的长度:

struct timeval {        long            tv_sec;                suseconds_t     tv_usec;       };struct pcap_pkthdr {        struct timeval ts;             bpf_u_int32 caplen;            bpf_u_int32 len;       };

数据报文,即网络中传输的数据包,其具体格式依赖于具体的网络协议,比如一个数据报文链路层采用以太网协议,网络层采用IP协议,传输层采用TCP协议,那么其内容就需要一层一层向上解析。

如果自己对比协议规范去进行pcap文件的解析,那么这个过程无疑是非常痛苦的,还好有强大的wireshark能帮助我们进行协议分析的工作。这里我们用wireshark和UE打开pcap文件,来直观的学习下pcap的文件格式,具体内容如下图所示:

其中深绿色部分是pcap文件头、浅蓝色是数据报文信息、红色部分则是数据报文。

UE中凌乱的数据在wireshark中呈现得紧紧有条,看到这里也许你迫不及待想好好折腾下wireshark。别着急,在介绍wireshark之前,我们再来介绍一个很重要的概念:网络通信原理 ---- stream。

2.网络通信原理 ---- stream

也许你接触过socket编程,编写过c/s架构的程序,那么你知道client与server间的通信,其实依赖的就是网络数据报文。在编程时,server必然要绑定一个端口进行监听,而client则需要链接server的那个端口。

如果你不太了解socket编程,别着急,我们看下面这个小示例:

#------------------------------------------   #server:import sockets = socket.socket()host = 127.0.0.1port = 1234s.bind((host, port))s.listen(5)while True:    c, addr = s.accept()    print 'Got connection from', addr    c.send('Thank you for connecting')    c.close()#------------------------------------------    #client:import sockets = socket.socket()host = 127.0.0.1port = 1234s.connect((host, port))print s.recv(1024)

借助python,你可以轻而易举的写出server和client,这里为了便于单机测试,将其中的host都设置为本机环回地址127.0.0.1。在实际过程中设置为服务器ip地址即可。

正如上面代码所示,在socket编程中host和port的设置是非常关键的。那么具体到在网络通信中来,对于client:host即表明其连接的server ip,我们称之为dip,而port就是server监听的端口,我们称之为dport,当client发起通信连接时,会用其自身ip作为sip,操作系统会为其分配一个随机端口作为sport,这样server收到报文后就会往这个sip/sport发送数据报文,从而实现通信了。

等等,不是说网络通信时有tcp/udp这两种不同的形式吗?但上面没有提到!是的,其实python中进行socket实例化时,默认会采用socket.AF_INET----IPV4协议,socket.SOCK_STREAM----TCP连接。

上面反复谈到连接、连接,那么什么是连接,在上例中client通过tcp协议向server发起连接:

 client    TCP   server

sip/sport ----> dip/dport

server通过相同的协议,对client进行回应:

dip/dport <---- sip/sport

回应报文中的sip/sport和dip/dport正好与请求报文相反。

对于上述两个方向的交互,我们即称为一条网络连接,也就是一条流(stream),它包括两个方向。stream是区分不同的网络通信的重要概念。在后续wireshark的使用中会经常看到它。

注:不同的书籍或者工程师对网络连接或流的定义可能存在差异,这里读者自己把握理解即可。

3.wireshark实用技巧

wireshark支持的协议种类非常宽泛,界面呈现十分友好,其最强大的地方在于协议的decoder,对于常见的协议解析得非常细致,同时它的过滤、统计功能十分强大,非常适合做网络流量的分析。

3.1 decoder

下图是我访问baidu时,其中一个数据报文在wireshark中的解析截图:

有以太头开始,到HTTP请求头,每一层都解析得非常清晰。在以太层,我们可以看到MAC信息;在IP层,我们能看到IP首部的各个字段,其中包括重要的TTL信息、ID信息、SIP/DIP等信息;在TCP层,我们则能知道SPORT/DPORT的信息,windows窗口大小等等;而对于HTTP协议头,wireshark也按行进行了解析,可谓是一目了然。

3.2 过滤

wireshark的过滤分为两种:

捕获过滤(CaptureFilters):用于决定捕获什么样的数据报文,当选择网卡时,点击"Options"选项,即可进行设置:

wireshark捕获过滤器

显示过滤(DisplayFilters):用于在捕获报文中进行特定查找:

wireshark显示过滤器

wireshark的过滤语法非常丰富,具体可以参考下面这篇文章:

http://blog.csdn.net/cumirror/article/details/7054496

3.3 查看流的交互信息

通过在条目上右击,然后选择"follow tcp stream"可以通过stream进行过滤,查看这个连接交互的具体信息。P.S. 注意filter中用到的语法:我在baidu中搜索了“hello” :-) 

过滤baidu搜索的连接

stream交互的具体过程

3.4 查看流统计信息

wireshark除了过滤功能外,还有一个比较不错功能,那就是它的统计集。通过menu菜单中的Statistics->Conversations就可以浏览pcap中数据流量的整体信息了:

统计集信息

3.5 pcap文件的过滤保存

有时你想将pcap中特定的内容进行保存,那么可以通过menu菜单中的File->Export Specified Packets来实现:

4.更多参考

http://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F

http://wiki.wireshark.org/


From:   http://ctf.idf.cn/index.php?g=&m=article&a=index&id=10

0 0
原创粉丝点击