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

起初不知该页面所云,拨弄几次后发现,原来"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请求:

个人对String-Matching Capture Filter Generator的理解_编辑框_02

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

个人对String-Matching Capture Filter Generator的理解_16进制_03

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的长度,如下图:

个人对String-Matching Capture Filter Generator的理解_字符串_04

但是,我们需要的是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中可能用到的偏移可以参考​​此文​