原理
网卡工作模式
单播模式(Unicast)
多播模式(Multicast)
广播模式(Broadcast)
混杂模式(Promiscuous)
Tips:在混杂模式下的网卡能够接收一切通过的数据,而不管该数据目的地址是否是它。
查看网卡工作模式
抓包
tcpdump常用参数说明-i any : 监听所有网卡
-i eth0 : 监听eth0网卡
-D : 显示所有网卡
-n : 禁止解析主机名
-nn : 禁止解析主机名和端口号
-X : 将包的内容按十六进制和ASCII格式显示
-XX : 跟-X选项类型,并额外显示以太协议头
-v,-vv,-vvv : 递增显示包的信息
-c : 最多抓n个包
-s : 定义抓包的大小,-s0抓取全部
-S : 打印绝对的tcp序号
sudo tcpdump –iany –nnvvXS –s1514 –c10
sudo tcpdump -iany src host 192.168.150.1 and dst port 80 -nnvvXS -s1514 -c10
sudo tcpdump -iany dst host 192.168.150.1 and src port 80 -nnvvXS -s1514 -c10
sudo tcpdump -iany host 192.168.150.1 and port 80 -nnvvXS -s1514 -c10
sudo tcpdump -iany port 80 -nnvvXS -s1514 -w test.cap
动手写抓包工具
使用libpcap开源库
简单的抓包程序
int main () {
int i = 0, count = 0;
pcap_t *descr = NULL;
char errbuf[PCAP_ERRBUF_SIZE], *device = NULL;
memset(errbuf, 0, PCAP_ERRBUF_SIZE);
/* Get the name of the first device suitable for capture */
device = pcap_lookupdev(errbuf);
printf(“Opening device %s\n”, device);
/* Open device in promiscuous mode */
descr = pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512, errbuf);
/* Loop forever & call processPacket() for every received packet */
pcap_loop(descr, -1, processPacket, (u_char *)&count);
return 0;
}
参考资料
http://www.tcpdump.org/https://www.wireshark.org/