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)
outgoing方向(出去的包)会在 dev_queue_xmit_nit 里面遍历 ptype_all 链表进行所有网络协议处理的时候调用到packet_rcv 。
incoming 方向(从外面其他机器进来的包会在 netif_receive_skb 函数里面同样办法遍历 ptype_all进行处理的时候调用到packet_rcv 。
利用数据链路层抓包
Linux:
对于Linux是sock_packet
对于Solaris是DLPI
对于BSD是BPF
libpcap封装了上述这些接口而已。
对于Solaris是DLPI
对于BSD是BPF
libpcap封装了上述这些接口而已。
Windows:
采用原始套接字RAW_SOCK
采用Winpcap.lib
采用winsock 2 spi(服务提供者接口
采用Api Hook
采用ddk(device driver kit设备驱动工具包)
采用Api Hook
采用ddk(device driver kit设备驱动工具包)
|应用层|------exe程序,比如ie
--------
|表示层|-------ws2_32.dll
--------
|会话层|-------SPI
--------
|传输层|-------TDI(不能截获ICMP等协议的数据)
--------
|网络层|-------NDIS(可以截获所有的网络数据)
--------
|链路层|-------设备驱动
--------
|物理层|-------网卡
--------
|表示层|-------ws2_32.dll
--------
|会话层|-------SPI
--------
|传输层|-------TDI(不能截获ICMP等协议的数据)
--------
|网络层|-------NDIS(可以截获所有的网络数据)
--------
|链路层|-------设备驱动
--------
|物理层|-------网卡