网络安全参考 | UNIX参考 | GPS参考 | 无线参考 | 在线手册 | OSBUG.ORG | SUNNY-NETWORK.COM
网站地图 RSS订阅
高级搜索 收藏本站
Home | 业界动态 | 防火墙 | IDS/IPS | VPN | PKI | Honeypot | Hacker/Intruder | 黑客技术 | 破解技术 | 加密技术 | 病毒防护 | 木马 | 反垃圾邮件 | 反流氓软件 | 漏洞 | 无线安全 | UNIX | Windows | 安全编程 | 安全软件 | TPM/TCG | 数据恢复 | 企业信息安全 | 个人信息安全
 当前位置: Home > 安全编程 > 网络编程 > 文章  
原始套接字透析之实现sniffer
文章来源: 天极开发 文章作者: 宋宝华 发布时间: 2006-11-15   字体: [ ]
 

  大家知道,以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。通过查看包含在帧中的目标地址,确定是否进行接收或放弃。如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理。但是,如果让网卡置于混杂模式(Promiscuous mode),则网卡不会鉴别帧的MAC地址,而是一律接收。

The image “/upimg/allimg/20070220/1608270.gif” cannot be displayed, because it contains errors.

  上图给出了以太网的帧格式,网卡是通过图中的MAC地址进行ID标识的。传说中的网络嗅探(sniffer)就是指让网卡进入混杂模式从而接收正在局域网总线上发送的所有报文。为什么能够嗅探到局域网上的所有报文,是因为基于IEEE 802.3的以太网在MAC层采用广播方式发送帧。因此,从理论上来讲,我们可以编写黑客程序监听局域网上的所有信息。QQ、MSN监听软件就是基于这一机理的,它可以监听局域网上所有用户的QQ、MSN聊天记录。

  为了实现sniffer,我们应首先让网卡进入混杂模式并建立和设置原始套接字为亲自处理报头:

//初始化SOCKET
WSADATA wsaData;
iErrorCode = WSAStartup(MAKEWORD(2, 1), &wsaData);
CheckSockError(iErrorCode, "WSAStartup");
SockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
CheckSockError(SockRaw, "socket");
//获取本机IP地址
char name[MAX_HOSTNAME_LAN];
iErrorCode = gethostname(name, MAX_HOSTNAME_LAN);
CheckSockError(iErrorCode, "gethostname");
struct hostent *pHostent;
pHostent = (struct hostent*)malloc(sizeof(struct hostent));
pHostent = gethostbyname(name);
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(6000);
memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
iErrorCode = bind(SockRaw, (PSOCKADDR) &sa, sizeof(sa));
CheckSockError(iErrorCode, "bind");
//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
iErrorCode = WSAIoctl(SockRaw, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen)
, &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);
CheckSockError(iErrorCode, "Ioctl");

  下面就可以接收并处理IP报文:

//侦听IP报文
while (1)
{
 memset(RecvBuf, 0, sizeof(RecvBuf));
 iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0);
 CheckSockError(iErrorCode, "recv");
 iErrorCode = DecodeIpPack(RecvBuf, iErrorCode);
 CheckSockError(iErrorCode, "Decode");
}

  Sniffer程序接收到报文后,即可调用相应的程序来分析具体的报文。

  对于sniffer我们不得不说的是,仅仅将网卡置于混杂模式并不能保证我们能嗅探到交换式局域网上的所有帧,因为交换式局域网已经不再是广播式/总线传输了,为了能嗅探到交换式局域网上的帧,我们需要采用另一项技术ARP欺骗。

  (参考链接: http://dev.yesky.com/40/2669540.shtml)

 
推荐文章
·洪水攻击原理及代码实现全攻略(
·原始套接字透析之综合实例:网络
·原始套接字透析之实现IP地址欺骗
·原始套接字透析之ARP欺骗
·原始套接字透析之实现包分析
·原始套接字透析之实现路由欺骗
·原始套接字透析之ICMP拒绝服务攻
·原始套接字透析之实现Ping
·原始套接字透析之Raw Socket基础
·黑客之旅 -- 原始套接字透析之前
 
 
↑返回顶部   打印本页   关闭窗口↓  

Google
 
Web oldhand.org unixreference.net meshmea.org
热点文章
·原始套接字透析之Raw So
·原始套接字透析之ARP欺
·洪水攻击原理及代码实现
·原始套接字透析之综合实
·原始套接字透析之实现Pi
·黑客之旅 -- 原始套接字
·原始套接字透析之实现路
·原始套接字透析之实现包
相关分类
相关文章
·原始套接字透析之实现路
·原始套接字透析之实现包
·原始套接字透析之ICMP拒
·原始套接字透析之ARP欺
·原始套接字透析之实现Pi
·原始套接字透析之实现IP
·原始套接字透析之Raw So
·原始套接字透析之综合实
更多...
 
 

Copyright(c) 2001-2008 OLDHAND ORGANIZATION, All Rights reserved.
Power by DedeCms 织梦内容管理系统
$Id: article_article.html,v 1.3 2007/02/10 12:00:37 yjs Exp $