前文说到如何抓包,这下算是抓着了。我们中间补习一段,就是这个过滤字符串如何写,man一下tcpdump给我们以启示,分三种类型:
type 过滤器以id名和数字组成. 可能的类型有host、net、port、portrange.例如:`host foo', `net 128.3', `port 20', `portrange 6000-6008'. 如果没有指定type,那么默认是host
dir 过滤器指定一系列的方向信息,并用and/or连接。 比如src、dst或者src and dst等,例如:`src foo', `dst net 128.3', `src or dst port ftp-data'. 若方向不指定,则认为默认是src or dst。
proto 过滤器以协议类型做限定. 典型的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp. 例如, `ether src foo', `arp net 128.3', `tcp port 21', `udp portrange 7000-7009'. 如果没有指定协议,那么默认就是所有协议 比如., `src foo' means `(ip or arp or rarp) src foo', `net bar' means `(ip or arp or rarp) net bar' and `port 53' means `(tcp or udp)port 53'.
ok,我们可以自由的修改expression那个字符串以满足自己的过滤需求了。
书接前文,我们得到了这个报文,怎么解析?好的,我们把packet那个变量,不是存储着报文的真正内容吗?
我们转换为一个结构,叫做struct libnet_ethernet_hdr *,存在一个叫eth的变量中,然后依靠
if(eth->ether_type == ntohs(ETHERTYPE_IP))
…………
if(eth->ether_type == ntohs(ETHERTYPE_ARP))
…………
来对报文做不同的处理。