Linux:

PF_PACKET  往是专门用于抓包的,往系统网络层注册一个协议。然后所有的往外发的包和进来的包都会调到http://lxr.linux.no/linux+v3.4/net/packet/af_packet.c 这个文件里面 的packet_rcv() 函数,

static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
 struct packet_type *pt, struct net_device *orig_dev)


TCPDUMP 原理 (Linux)-LMLPHP


outgoing方向(出去的包)会在 dev_queue_xmit_nit 里面遍历 ptype_all 链表进行所有网络协议处理的时候调用到packet_rcv 。
incoming  方向(从外面其他机器进来的包会在 netif_receive_skb 函数里面同样办法遍历 ptype_all进行处理的时候调用到packet_rcv 。

TCPDUMP 原理 (Linux)-LMLPHP

利用数据链路层抓包 

Linux:
对于Linux是sock_packet 
对于Solaris是DLPI 
对于BSD是BPF 

libpcap封装了上述这些接口而已。

Windows:
采用原始套接字RAW_SOCK
采用Winpcap.lib
采用winsock 2 spi(服务提供者接口
采用Api Hook   
采用ddk(device   driver   kit设备驱动工具包)

|应用层|------exe程序,比如ie
--------
|表示层|-------ws2_32.dll
--------
|会话层|-------SPI
--------         
|传输层|-------TDI(不能截获ICMP等协议的数据)
--------  
|网络层|-------NDIS(可以截获所有的网络数据)
--------
|链路层|-------设备驱动 
--------       
|物理层|-------网卡

12-04 11:23