原始套接字透析之实现sniffer
2015-03-19 14:00
288 查看
大家知道,以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。通过查看包含在帧中的目标地址,确定是否进行接收或放弃。如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理。但是,如果让网卡置于混杂模式(Promiscuous
mode),则网卡不会鉴别帧的MAC地址,而是一律接收。
为了实现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),
<span style="white-space:pre"> </span>&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欺骗。
相关文章推荐
- 原始套接字透析之实现sniffer
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- 原始套接字透析之实现Ping
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- 原始套接字透析之实现Ping
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- 黑客之旅――原始套接字(Raw Socket)透析(3)--用Raw Socket实现Ping
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- 黑客之旅――原始套接字(Raw Socket)透析(3)--用Raw Socket实现Ping
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- 原始套接字透析之实现Ping(转)
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- Raw Socket(原始套接字)实现Sniffer(嗅探)
- ICMP,原始套接字,ping实现
- 基于C语言与原始套接字实现Ping程序
- Linux原始套接字实现分析
- 黑客之旅初始篇:原始套接字透析