参考资料:

https://blog.csdn.net/wojiaopanpan/article/details/69944970

wireshark分两种表达式,一种是捕获表达式,这个是在捕获时用的,根据表达式判断是否捕获;

另一种是显示表达式,是针对捕获后的包进行过滤。

二者支持的语法不完全一致。

一、捕获表达式

1、端口号为8080或9080,或ip为A或B

 tcp port  or tcp port  or host 10.45.4.46 or host 192.168.19.120

2、tcp包,主机为A

src or dst  host 10.15.4.46 and tcp 

3、捕获两个ip主机间的通信

一开始我是这么写的,分别捕获两个方向上的流量,后面感觉这也太冗余了:

(src host 192.168.17.1  and dst host 192.168.17.128) and (dst host 192.168.17.1  and src host 192.168.17.128 and tcp port ) and tcp port 

于是尝试了以下的表达式,证明是没问题的:

 host 192.168.17.1  and  host 192.168.17.128 and tcp port 

4、一个重要发现

在本地虚拟机搭建redis-sentinel集群后,想抓取三台linux主机间的流量,想着 wireshark 只能抓本机的包,没想到其实可以用下面的方法来抓包:

抓虚拟机虚拟出来的网卡上的流量即可。

二、捕获表达式之http捕获--tcp首部固定为20字节的情况:

3、抓http post包

tcp[20:2]=0x504f

其实,捕获表达式默认支持的协议里,是不支持http这种应用层协议的。

但是呢,大家如果仔细研究下下面的http包,就知道,还是有办法的:

好了,如果说,我想抓post请求的http,应该怎么办呢,只要捕获表达式里面指定tcp头结束后的前两个字节为50 4F(对应“PO”)

则可以知道,这个就是post请求。

那这个怎么用表达式来表达呢?

请看下面从别的网站摘录的:

Interesting Parts of a TCP header
=================================
tcp[0:2] source port
tcp[2:2] destination port
tcp[4:4] sequence number
tcp[8:4] acknowledgement number
tcp[12] header length
tcp[13] tcp flags
tcp[14:2] window size
tcp[16:2] checksum
tcp[18:2] urgent pointer
tcp[20..60] options or data

我对照着抓包理解了下,

tcp[startIndex:length],应该就是startIndex表示tcp头的第几个字节,从0开始。

后面冒号后面的是长度。

比如tcp[2:2] destination port 意思是从数组索引2开始,长度为2个字节的部分,就对应了目的端口。

所以,抓http的post,就应该是:

tcp[20:2]=0x504f

4、抓http get请求

tcp[20:2]=0x4745

5、http响应

发现个问题。上面的只能抓请求,却不能抓响应内容。

只能看看响应包的特征了:

原来,响应包的头两个字节为HT啊,(0x4854)。

那么,表达式看来可以这样写:

tcp[:]=0x4854

6、抓取http请求和响应(get和post方法)

tcp[:]=0x4745   or tcp[:]=0x504F or tcp[:]=0x4854

表达式这个,可以参考:

https://www.centos.bz/2017/09/tcpdump-capture-packet/

三、捕获表达式之http捕获--tcp首部不固定为20字节的情况:

以上第二章,3,4,5,6点,都是假设tcp的首部固定为20字节。那么20字节以后,肯定就是数据部分了。

但是,请看下图:

看完上面,再看下面,首部字段只占了高4位,从下图看出来,整个字节的十六进制为“50”,换成二进制为01010000:

01010000,我们将其右移4位,变成0101.(换成十进制为5)。

因为该处记录的是TCP报名头的长度,是一个偏移量,单位为4字节(1段),所以我们用长度×4,就能计数出整个个TCP头的字节了。

所以就是5*4=20字节。

那么,我们表达式可以这么写:

( tcp[12] >> 4 ) << 2,左移四位,右移两位,最后就是左移两位。就获取到数据开始的位置。

汇总下,

1、抓取http get请求

tcp[(tcp[12]>>2)]= 0x4745

2、抓取http post请求

tcp[(tcp[12]>>2)]= 0x504f

3、 抓取http请求和响应(get和post方法)

tcp[(tcp[12]>>2):2]=0x4745 or tcp[(tcp[12]>>2):2]=0x504F or tcp[(tcp[12]>>2):2]=0x4854

4、需要注意的地方

如果你和我一样,拿着上面第三点的表达式去抓包,可能会发现下面的情况:

先说我们期待的正确的结果是什么样的:

但是,我发现结果是下面这样的:

意思就是,第7个包,即上图,虽然显示为TCP,但是实际上,它的tcp首部后,跟着的内容就是http的内容。

这又是怎么回事?

这里长话短说,因为这里,http协议采用了chunk传输。

具体的内容可以参考:https://blog.csdn.net/u014569188/article/details/78912469

二、显示表达式

1、http请求且ip地址为A或者B

http &&( ip.addr == 10.15.4.46 or ip.addr == 192.168.19.120)

1.1 请求源地址为A

ip.src == 10.15.4.46

2、http请求且端口号为9080

http && tcp.port == 

wireshark 表达式备忘录的更多相关文章

  1. tcpdump统计http请求并导出URL文本

    tcpdump统计http请求并导出URL文本 tcpdump tcpdump是一个用于截取网络分组,并输出分组内容的工具.凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排 ...

  2. 【协议分析】Wireshark 过滤表达式实例

    Wireshark 过滤表达式实例   1.wireshark基本的语法 字符 \d          0-9的数字 \D          \d的补集(以所以字符为全集,下同),即所有非数字的字符 ...

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

    首先说几个最常用的关键字,"eq" 和 "=="等同,可以使用 "and" 表示并且,"or"表示或者."!& ...

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

    首先说几个最常用的关键字,“eq” 和 “==”等同,可以使用 “and” 表示并且,“or”表示或者.“!" 和 "not” 都表示取反. 一.针对wireshark最常用的自然 ...

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

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

  6. [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)

    首先说几个最常用的关键字,“eq” 和 “==”等同,可以使用 “and” 表示并且,“or”表示或者.“!" 和 "not” 都表示取反. 一.针对wireshark最常用的自然 ...

  7. wireshark 过滤表达式

    一.针对wireshark最常用的自然是针对IP地址的过滤.其中有几种情况: (1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包.         表达式为:ip.src == ...

  8. wireshark捕获/显示过滤器表达式书写规律说明

    一.说明 1.1 背景说明 对于大多数刚开始接触wireshark的使用者而言,经常是开始的时候时候看到wireshark能把所有数据包都拦截下来觉得强无敌,但是面对一大堆的数据包要问有什么用或者说想 ...

  9. [Java 8] (9) Lambda表达式对递归的优化(下) - 使用备忘录模式(Memoization Pattern) .

    使用备忘录模式(Memoization Pattern)提高性能 这个模式说白了,就是将需要进行大量计算的结果缓存起来,然后在下次需要的时候直接取得就好了.因此,底层只需要使用一个Map就够了. 但是 ...

随机推荐

  1. Mac下配置Oracle数据库客户端远程连接数据库服务器

    下载mac数据库客户端: 地址:http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 下载这俩个:(来源:http:// ...

  2. spark 源码阅读博客

    http://blog.csdn.net/oopsoom/article/details/38257749

  3. TradeStation简介

        TradeStation是美国一款经典程序化交易软件,支持股票.期货.外汇.期权等交易品种.它是由美国TradeStation公司开发,主要服务于美股.     TradeStation的设计 ...

  4. 关于Struts2的文件上传

    要实现Struts2框架的文件上传,需要用到2个jar包 commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 由于文件解析Struts2内部已经帮我们做 ...

  5. 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比

    一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库.    关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型.    简单来说,关系模型指的 ...

  6. Unity接第三方SDK时遇到的坑

    1.大部分SDK的方法需要在线程中执行,一般会放在主线程里执行,安卓中主线程一般用于UI渲染. this.runOnUiThread(new Runnable() { @Override public ...

  7. windows下安装node.js

    由于shopnc的im需要node.js 先安装下node.js 下载node.js 直接运行 安装完成后 win+R,出入cmd 安装时已经自动配置了环境变量(如果没设置环境变量,变量名:NODE_ ...

  8. CorelDRAW中如何再制对象详解

    再制对象指的是快捷地将对象按一定的方式复制为多个对象,此种复制是复制的复制,再制不仅可以节省复制的时间,再制间距还可以保证复制效果.本教程将详解如何在CorelDRAW软件中再制对象. CorelDR ...

  9. 解决webStorm没有cesium代码自动提示的方法

    Webstorm中默认是没有cesium代码提示的,但是可以通过设置让它有智能提示 File -> Settings -> Languages&Frameworks -> J ...

  10. python的初始化运行了哪些?

    下面的3个print一个是在模块下面,一个是函数里面,一个是类名下面(不在方法里面) 1. 运行这段代码可以发现第3行和11行可以打印出来.第7行没有打印出来.所以可以放心,函数或者方法里面就算有错误 ...