一段sniffer源码

王朝other·作者佚名  2006-03-28
窄屏简体版  字體: |||超大  

#include <winsock2.h>

#include <stdio.h>

//#include <MsTcpIp.h>

/* 加这一句才不会提示:SIO_RCVALL没有定义 */

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

#pragma comment(lib, "Ws2_32")

void DecodeIPPacket(char *pData);

typedef struct _TCPHeader

{

USHORT sourcePort;

USHORT destinationPort;

ULONG sequenceNumber;

ULONG acknowledgeNumber;

ULONG dataoffset;

UCHAR flags;

USHORT windows;

USHORT checksum;

USHORT urgentPointer;

}TCPHeader, *PTCPHeader;

void main()

{

/*

WSADATA wsaData;

if(WSAStartup(MAKEWORD(2,2), wsaData) != 0)

{

return;

}

*/

char buff[1024];

int nRet;

DWORD dwValue = 1;

SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);

char szHostName[56];

SOCKADDR_IN addr_in;

struct hostent *pHost;

gethostname(szHostName, 56);;

pHost = gethostbyname((char*)szHostName);

if(pHost == NULL)

return;

addr_in.sin_family = AF_INET;

addr_in.sin_port = htons(0);

memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length);

printf("binding to interface:%s\n", inet_ntoa(addr_in.sin_addr));

if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)

return;

if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)

return;

while(TRUE)

{

nRet = recv(sRaw, buff, 1024, 0);

if(nRet > 0)

{

DecodeIPPacket(buff);

}

}

}

void DecodeIPPacket(char *pData)

{

TCPHeader *pTCPHdr = (TCPHeader*)pData;

printf("port:%d -> %d\n", ntohs(pTCPHdr->sourcePort), ntohs(pTCPHdr->destinationPort));

}

不过怎么没有嗅到数据?奇怪。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航