个人对String-Matching Capture Filter Generator的理解

本文深入解析Wireshark的捕获过滤功能,重点介绍如何利用String-MatchingCaptureFilterGenerator生成复杂的过滤条件,实现对特定字符串的精确匹配。文章通过实例展示了如何设定过滤表达式来捕获HTTP请求和响应,以及如何处理TCP数据包中的偏移量。

    原文链接:"String-Matching Capture Filter Generator"。跟进这个链接,页面截图如下:

起初不知该页面所云,拨弄几次后发现,原来"1.Enter the string you want to math"和"2.Enter the offset from the start of the TCP data"下面的两道灰杠居然是可以接受输入的编辑框!细细琢磨一下,我觉得第一个编辑框应该用于匹配tcp.data中的字符串,并把它转换成16进制,换一个形象的说法,这是将Wireshark中"Packet Byte"面板的可见字符串转成对应16进制数的功能;至于第二个编辑框,应该是指编辑框1中的字符串距离tcp.data开头的偏移。

    哇,这是一个强大的功能啊,接受2个输入,转换成可以被wireshark "capture filter"接受的过滤条件(BPF过滤语法),最后输出到第三个编辑框。等等,第三个编辑框被一道黑杠挡住了!看来,得寻觅计算公式了。经过一番查找,在这个链接找到2个带有详细解释的例子:

tcp[(((tcp[12:1] & 0xf0) >> 2) + 8):2] = 0x2030

Which in English would be: 
- take the upper 4 bits of the 12th octet in the tcp header ( tcp[12:1] & 0xf0 )
//从TCP header中获得第12字节(10进制)的高4位
- multiply it by four ( (tcp[12:1] & 0xf0)>>2 ) which should give the tcp header length
//上面获得的高4位乘以4,得到TCP header长度
- add 8 ( ((tcp[12:1] & 0xf0) >> 2) + 8 ) gives the offset into the tcp header of the space before the first octet of the response code
//在上面的基础上加8(10进制),得到(要查找内容)在响应码中的位置
- now take two octets from the tcp stream, starting at that offset ( tcp[(((tcp[12:1] & 0xf0) >> 2) + 8):2]  )
- and verify that they are " 0" ( = 0x2030 )
//从上面找到的位置开始,往后取2个字节,检验这2个字节的内容是否为 " 0" (它的16进制值为 0x2030)
Of course this can give you false positives, so you might want to add a test for "HTTP" and the start of the tcp payload with:
//当然,设置的条件可能会得到错误的结果,所以你需要在payload中同时添加搜索"HTTP"的条件
tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450

resulting in the filter:
//最终获得这样的过滤条件
tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 and tcp[(((tcp[12:1] & 0xf0) >> 2) + 8):2] = 0x2030

恩,上面我摘抄的内容可能还是不好理解,我们来看个实际的例子,这是我找到的一个HTTP请求:

TCP header起于0x22B/截止于0x36B

HTTP协议(TCP.data)始于0x37B。而"GET "正好位于0x37B开始的4B。要匹配"GET ",捕获过滤器中的表达式如下:

tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420

表达式中的tcp[12:1]从tcp头部第12B处取一个字节,值为0x50,取该值的高4位乘以4后,得到tcp header的长度,如下图:

但是,我们需要的是tcp.data中的内容,所以要从tcp开始处跳过tcp.header的长度,这就是表达式中的((tcp[12:1] & 0xf0) >> 2)部分的作用。剩下的很好理解,不再解释。另外,wireshark的官网上演示了捕获病毒通信的表达式,也是非常不错的示例。

    最后,提一句,String-Matching Capture Filter Generator看似强大,但也有一定的限制:它只适合捕获固定位置上出现的字符串,如HTTP请求("GET / HTTP/1."), HTTP响应("HTTP/1."), POP3登陆("USER");对于可能会在任意位置上出现的字符串,wireshark建议在显示过滤器中使用"Match"/"Contain"进行匹配。

 另外,capture filter中可能用到的偏移可以参考此文

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值