Windump是Windows环境下一款经典的网络协议分析软件,其Unix版本名称为Tcpdump。它可以捕捉网络上两台电脑之间所有的数据包,供网络管理员/入侵分析员做进一步流量分析和入侵检测。在这种监视状态下,任何两台电脑之间都没有秘密可言,所有的流量、所有的数据都逃不过你的眼睛(当然加密的数据不在讨论范畴之内,而且,对数据包分析的结果依赖于你的TCP/IP知识和经验,不同水平的人得出的结果可能会大相径庭)。
先下载安装WinPcap_4_1_3。再下载WinDump安装。不然会报错.
在命令行下启动windump.exe
参数列表:
-a 将网络地址解析为名字
-B size 设置网络数据接收缓冲区大小
-c count 只抓取count数目个包
-D 显示当前系统中所有可用的网卡
-e 输出链路层信息
-F file 从file文件中读取过滤的限制条件
-i interface 监视指定网卡
-n 不将网络地址解析为名字
-N 不打印全称域名信息
-q Print quick(less) packet infomation
-r file 从file文件中读取数据
-S Prints absolute TCP sequence numbers
s snaplen Captures snaplen bytes from the packet; the default value is 68
-t 不打印时间戳
-w file 将输出写入file文件
-X 用十六进制和ASCII码输出捕获的包
-x 用十六进制输出捕获的数据
使用示例如下:
C:/monitor>windump -s 200 -x -w testcap
此句表示捕获每个包的前200个字节,用十六进制输出,并将其写入testcap文件中
使用过滤器
查看网络上所有IP: windump ip
查看与指定ip交流的所有数据: windump ip host 192.168.1.6(指定ip)
查看所有从指定ip发到本机来的所有数据: windump ip src 192.168.1.6(指定ip)
捕获从指定网段发到本机的所有数据: windump ip host 192.168.1(指定ip网段)
主要参数有选项和表达式两类。下面说明几个必要的选项和表达式:
-i 指定要监听的网络接口,可以使用windump -D 列出当前系统中所有的网络设备接口,不指定的话是设备列表中找得的第一个。例如:
./WinDump.exe -D
1.\Device\NPF_GenericNdisWanAdapter (Generic NdisWan adapter)
2.\Device\NPF_{6AA36CF4-E4FD-49BF-93E5-DC29AB8A3AA5} (SiS NIC SISNIC (Microsoft' s Packet Scheduler) )
则
./WinDump.exe
./WinDump.exe -i 1
./WinDump.exe -i \\Device\\NPF_GenericNdisWanAdapter
都是监听第一个网络接口设备Generic NdisWan adapter。
./WinDump.exe -i 2
./WinDump.exe -i \\Device\\NPF_{6AA36CF4-E4FD-49BF-93E5-DC29AB8A3AA5 }
都是监听第二个网络接口设备SiS NIC SISNIC (Microsoft' s Packet Scheduler)。
如果不指定表达式,所有通过指定接口的packet都输出,否则只把表达式expression为真的输出。
最基本的表达式是这样的:
[proto] [dir] [type] [id]
proto 协议,可以是ether, fddi, tr, ip, ip6, arp, rarp, decnet, tcp , udp中任一个或它们的表达式组合,如果不指定,所有和后面的type一致的都考虑在内。
dir packet传输的方向,可以是src, dst中的任一个或它们的表达式组合。不指定的话,相当于src or dst 。
type 指定后面的id是网络地址、主机地址还是端口号,可以是host, net ,port中任一个,如果不指定,默认为host。
id 就是希望监听的网络或主机或端口地址。
一个覆盖所有元素的表达式如下:
ether src host 00:11:D8:6A:33:22
./WinDump.exe -i 2 ether src host 00:11:D8:6A:33:22
监听所有从本地网卡向外发的packet,其中00:11:D8:6A:33:22是本地网卡的mac地址。
./WinDump.exe -i 2 udp dst port 135
监听所有发给本地135 udp端口的packet。
更复杂的表达式是以上基本的表达式的逻辑组合,可用于组合的关键字有and, or, not,同时构成基本表达式的四类运算都是可选,不是必须的,比如:“host foo and not port ftp and not port ftp-data”,其中foo代表主机名,其他都是关键字。
此外,有gateway, broadcast , multicast , mask , protochain , proto , less , greater 四个关键字和一些算术表达式、逻辑符合等。
gateway foo 其中,foo是主机名,如果某个packet以foo为gateway,表达式为真,也就是该packet的ether源或目的地址是foo,而ip源和目的地址都不是foo。
broadcast,multicast 跟在ether或者ip、ip6后面表示某个packet是广播包、多播包,比如“ether broadcast”,“ip multicast”。
mask 和net一起说明网络地址,例如“net 192.168.0 mask 255.255.255.0”。
protochain 跟在ip、ip6后面说明更上层的协议字,比如“ip protochain 6”。
proto 跟在ether或者ip、ip6后面表示更上层的协议,跟在“ether proto”之后的可以是ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso,跟在“ip proto”或“ip6 proto”之后的可以是icmp, icmp6, igmp, igrp, pim, ah, esp, udp, tcp,注意对于有些本身就是关键字的要加“\”转义,比如“ether proto \ip”。
其他表达式是这样的格式:
expr relop expr
其中,relop 可以是 >, <, >=, <=, =, !=, 中任一个,expr是由C语言规范描述的整数常量、二进制运算符(+, -, *, /, &, |)、len(取长度的关键字)、包数据构成,包数据这样访问:
proto [ offset : size ] proto是ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp , ip6中任一个,表示要取的数据是该协议头范围内的,相对于PDU开始处的偏移由offset指定,size可选、说明要取数据的字节数,可以是1~4, 默认是1。例如,
“ether[0] & 1 != 0”匹配所有multicast数据包,因为01:00:5e:00:00:00到 01:00:5e:7f:ff:ff都是多播地址。
“ip[0] & 0xf != 5”匹配所有带选项的ip包,根据ip协议,“ip[0] & 0xf”取到的是IP协议头长度,而不带选项的ip协议头长度刚好是5。
“ip[6:2] & 0x1fff = 0”,“ip[6:2] & 0x1fff”取到该ip包的Fragment Offset,所以匹配所有不分段的ip包或所有分段ip包中的第一段。
其它操作法有!(相当于not )、&&(相当于and )、||(相当于or)。
使用举例:
./WinDump.exe -i 2 not arp and ether host not 02:01:00:00:00:00
抓取所有非arp协议、且源或目的主机的ether地址都不是02:01:00:00:00:00的packet。
windump.exe -i 2 -w cap ether host 00:11:D8:6A:33:22
抓取所有源或目的主机的ether地址是00:11:D8:6A:33:22(本地网卡的mac地址)的packet,但不知道屏幕上输出,而是把所有抓获的raw packet写入文件cap中。
windump.exe -r cap
读取刚才的输出文件cap,对抓获的所有packet进行解析输出。
经粗略分析,windump输出的raw packet文件格式如下:
文件头24个字节:“D4 C3 B2 A1 02 00 04 00 00 00 00 00 00 00 00 00 60 00 00 00 01 00 00 00 ”,具体含义不明确。
接下来是所有raw packet连续存放的数据,对于每个raw packet依次有:
8个字节的timestamp(时间戳)
ether frame header(7 bytes Preamble,1 byte SOF,6 bytes DA, 6 bytes SA,2bytes length/type)
ether frame payload(更上层协议PDU)
windump.exe -r cap 只是在屏幕上依次输出每个packet对应的时间戳、ether frame payload 中PDU协议类型,再是与该协议相关的简单信息。
windump.exe -r cap -x 除了输出基本的信息之外,还把ether frame payload以十六进制输出。
windump是一个开源软件,可以进行各种协议的网络数据包探测,是一个不错的免费、开源Net Sniffer软件,当前最新版本是3.9.5,官方下载网址: http://www.winpcap.org/windump/install/。
详细的帮助文件官方网址是: http://www.winpcap.org/windump/docs/manual.htm
常用的参数:
-w write的缩写,写入文件,供后期分析。
-D 打印系统可用的网络接口列表。
-i[n] interface的缩写,选择要监测的网络接口。
host 指定要监测的主机,可以是域名或IP地址。
port 指定要监测的端口。
src/dst source/Destination的缩写,该参数配合host和port参数一起使用,指定要监测的主机或端口为源/终点的数据包。
-s size的缩写,指定抓取的每个数据包的大小,缺省是68,如果该值太小,可能会丢失数据。如果设置为0,则表示捕获整个包。
-t 不显示时间。
-tttt 以缺省ISO格式显示时间。
tcp, udp, icmp 指定使用的协议
使用范例:
监测某个网站的访问数据包,如mail.163.com:
1 运行命令行
例如:
windump -w pc.dump -s 0 host mawi.wide.ad.jp
windump -w pc.dump -s 0 src host mawi.wide.ad.jp
windump -w pc.dump -s 0 dst host mawi.wide.ad.jp
windump -i2(看自己的网卡,可以不需要) -w pc.dump -s 0 host mail.163.com
2 用浏览器访问mail.163.com的某个网页。
3 用Ultraedit或其他16进制编辑器打开pc.dump文件,你就可以看到你对网页操作的“Request->Response”数据包了。
如果你只对服务器返回的消息感兴趣,如下修改上面的命令:
windump -i2(看自己的网卡,可以不需要) -w pc.dump -s 0 src host mail.163.com
反之:
windump -i2(看自己的网卡,可以不需要) -w pc.dump -s 0 dst host mail.163.com
windump的确是个不可多得的优秀Sniffer软件,值得收藏使用。