不依赖任何第三方库写一个网络嗅觉器(sniffer)

本篇文字旨在编写一个具备基本功能的网络嗅觉器,英文中有对应的词是sniffer,并且已经有一款商业软件名字就是sniffer,当然是收费的。

 

关于以第三方库来写网络嗅觉器,我会在后续的文章中提到。第三方库主要指的是pcap(linux版本)/WinPcap(windows版本)。

 

关于网络嗅觉器功能:

  1. 抓取进站包
  2. 抓取出战包
  3. 分析包中的内容

 

我们以linux为开发环境,使用socket。

通常大家在开发网络应用程序的所创建的socket的类型为

SOCK_STREAM

SOCK_DGRAM

也就是流式套接字和数据包套接字。所对应的协议分别是TCP和UDP。例如:

s = socket(AF_INET , SOCK_STREAM, IPPROTO_TCP);

但是这样,我们只能抓到某一端口的tcp的包(因为这种方式,后面一定要使用bind函数跟某个端口绑定),因此我们采用

SOCK_RAW

这种套接字

s = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);

使用这个套接字就可以抓取所有进站数据包:

s = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);

while( true )

{

    recvfrom( s , buffer , buflen, 0 , &saddr , &nsaddr);

}

 

其全部代码:

 

 

参考:

http://www.binarytides.com/packet-sniffer-code-c-linux/

 

http://www.binarytides.com/packet-sniffer-code-in-c-using-linux-sockets-bsd-part-2/

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示