大家知道,以太網(wǎng)采用廣播機制,所有與網(wǎng)絡(luò)連接的工作站都可以看到網(wǎng)絡(luò)上傳遞的數(shù)據(jù),
原始套接字透析的構(gòu)建sniffer
。通過查看包含在幀中的目標(biāo)地址,確定是否進(jìn)行接收或放棄。如果證明 數(shù)據(jù)確實是發(fā)給自己的,工作站將會接收數(shù)據(jù)并傳遞給高層協(xié)議進(jìn)行處理。但是,如果讓網(wǎng)卡置于混雜模式(Promiscuous mode),則網(wǎng)卡不會鑒別幀的MAC地址,而是一律接收。上圖給出了以太網(wǎng)的幀格式,網(wǎng)卡是通過圖中的MAC地址進(jìn)行ID標(biāo)識的。傳說中的網(wǎng)絡(luò)嗅探(sniffer)就是指讓網(wǎng)卡進(jìn)入混雜模式從而接收正在局域 網(wǎng)總線上發(fā)送的所有報文。為什么能夠嗅探到局域網(wǎng)上的所有報文,是因為基于IEEE 802.3的以太網(wǎng)在MAC層采用廣播方式發(fā)送幀。因此,從理論上來講,我們可以編寫 程序監(jiān)聽局域網(wǎng)上的所有信息。QQ、MSN監(jiān)聽軟件就是基于這一 機理的,它可以監(jiān)聽局域網(wǎng)上所有用戶的QQ、MSN聊天記錄。
為了實現(xiàn)sniffer,我們應(yīng)首先讓網(wǎng)卡進(jìn)入混雜模式并建立和設(shè)置原始套接字為親自處理報頭:
//初始化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;
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, pHostent->h_length);
iErrorCode = bind(SockRaw, (PSOCKADDR) &sa, sizeof(sa));
CheckSockError(iErrorCode, "bind");
//設(shè)置SOCK_RAW為SIO_RCVALL,以便接收所有的IP包
DWORD dwBufferLen;
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程序接收到報文后,即可調(diào)用相應(yīng)的程序來分析具體的報文,
電腦資料
《原始套接字透析的構(gòu)建sniffer》(http://www.lotusphilosophies.com)。對于sniffer我們不得不說的是,僅僅將網(wǎng)卡置于混雜模式并不能保證我們能嗅探到交換式局域網(wǎng)上的所有幀,因為交換式局域網(wǎng)已經(jīng)不再是廣播式/總線傳輸了,為了能嗅探到交換式局域網(wǎng)上的幀,我們需要采用另一項技術(shù)ARP欺騙。