拦截网络数据包(SOCK_RAW)

#include #include #include using namespace std; #pragma comment(lib, "ws2_32.lib") #define BUFFER_SIZE 1024 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) typedef struct _TCP //应用层,传输层层 { WORD SrcPort; // 源端口 WORD DstPort; // 目的端口 DWORD SeqNum; // 顺序号 DWORD AckNum; // 确认号 BYTE DataOff; // TCP头长 BYTE Flags; // 标志(URG、ACK等) WORD Window; // 窗口大小 WORD Chksum; // 校验和 WORD UrgPtr; // 紧急指针 } TCP; typedef TCP *LPTCP; typedef TCP UNALIGNED * ULPTCP; typedef struct _IP //传输层,网络层 { union { BYTE Version; // 版本 BYTE HdrLen; // IHL }; BYTE ServiceType; // 服务类型 WORD TotalLen; // 总长 WORD ID; // 标识 union { WORD Flags; // 标志 WORD FragOff; // 分段偏移 }; BYTE TimeToLive; // 生命期 BYTE Protocol; // 协议 WORD HdrChksum; // 头校验和 DWORD SrcAddr; // 源地址 DWORD DstAddr; // 目的地址 BYTE Options; // 选项 } IP; typedef IP * LPIP; typedef IP UNALIGNED * ULPIP; #define PROTOCOL_STRING_ICMP_TXT "ICMP" #define PROTOCOL_STRING_TCP_TXT "TCP" #define PROTOCOL_STRING_UDP_TXT "UDP" #define PROTOCOL_STRING_SPX_TXT "SPX" #define PROTOCOL_STRING_NCP_TXT "NCP" #define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW" char* GetProtocolTxt(int Protocol) { switch (Protocol) { case IPPROTO_ICMP : //1 return PROTOCOL_STRING_ICMP_TXT; case IPPROTO_TCP : //6 return PROTOCOL_STRING_TCP_TXT; case IPPROTO_UDP : //17 return PROTOCOL_STRING_UDP_TXT; default: return PROTOCOL_STRING_UNKNOW_TXT; } } //*.cpp void main() { WSADATA wsadata; // 检查 Winsock 版本号,WSAData为WSADATA结构对象 int erro=WSAStartup(MAKEWORD(1, 1), &wsadata); if(erro!=0) { cout<<"初始化失败"<h_addr;//h_addr_list[0]; //IP h_addr定义的宏 addr_in.sin_family = AF_INET; addr_in.sin_port = htons(1004); // 把原始套接字sock 绑定到本地网卡地址上 bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)); // dwValue为输入输出参数,为1时执行,0时取消 DWORD dwValue = 1; // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(sock, SIO_RCVALL, &dwValue); //将网卡设置为混合模式 char RecvBuf[BUFFER_SIZE]; IP ip; TCP tcp; while (true) { // 接收原始数据包信息 int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0); if (ret !=0) { // 对数据包进行分析,并输出分析结果 ip = *(IP*)RecvBuf; tcp = *(TCP*)(RecvBuf + ip.HdrLen); cout<<"协议"<

转自:http://hi.baidu.com/gm123092267/blog/item/93a4583a5de63af8b311c7ce.html

你可能感兴趣的:(拦截网络数据包(SOCK_RAW))