一、 正常状况下,QQ能够顺利的登陆:tcp
这时经过抓包能够发现,QQ协议的数据包,正常状况下(后面有不正常的状况),都是经过udp协议传送的。在udp的数据载荷中,能够看到QQ对应用层数据作的封装格式。其中有一个叫作“命令”的字段(这个名字是科来给起的,真实名称估计是没有),这一字段在数据包所处位置固定、长度固定,经过分析登陆过程当中的一系列数据包,我大概能够判定这个“命令”字段就是QQ用来识别每个数据包的做用和包含内容的(好比有请求登陆、发送消息、接受消息、加个好友什么的)。正好科来在概要中有描述:其中有一个命令就是“请求登陆令牌”,这个数据包听上去在登陆过程当中比较关键,因此我想测试一下,若是阻止这个数据包发送,能不能就阻断掉QQ登陆。在包结构中看到,这个命令字段距离3层头开始的位置有31个字节,大小为2字节,它的值是“00BA”(注意是16进制数值)。ide
因而在路由器中定义一个class来匹配“请求登陆令牌”这个数据包:测试
class-map type access-control match-any qq_udpthis
match start l3-start offset 31 size 2 eq 0xBA加密
而后经过policy将这个数据包记录下来并drop掉:日志
policy-map type access-control qq_udpblog
class qq_udpip
log路由
dropget
二、 第一次测试结果:
在科来的抓包和路由器的日志中能够看到,路由器将“请求登陆令牌”丢弃掉后,QQ客户端在不断的从新发送这个数据包,这一点能够证实这个数据包的做用仍是很大的,送不出去,它是不会罢休的。
过了好久好久(大约一、2分钟后),我估计QQ是以为经过udp发送是没戏了,这时它忽然开始经过HTTP登陆,而且很快就登上去了。这时再经过科来分析这些HTTP数据包,发如今HTTP数据载荷中都是没法识别的2进制数据,我估计它多是把登录数据加密后经过HTTP传输了:
可是继续分析多个HTTP数据后能够看出:
在这些封装在HTTP中的2进制数据,第三、4个字节的值都是0x02和0x16,根据这个规律,再作一个class匹配全部符合这样特征的数据包,执行drop:
class-map type access-control match-any qq_tcp
match start l3-start offset 42 size 2 eq 0x216
policy-map type access-control qq_tcp
class qq_tcp
log
drop
最后再测试一次:
路由器上显示,先把QQ客户端的udp请求给drop了,一会又把它的tcp请求给drop了。这回QQ没招了,给出了“超时”提示!
经过对数据包的深层识别,就可以阻止QQ利用80、443这些必开端口进行登陆的诡异行为。
最后介绍一下这个feature:12.4(15)T里面就有了,从18到72都带!