通过原始套接字截取本地网卡的所有数据
2010-06-28 15:16
281 查看
#include "stdafx.h"
#include <iostream>
#include <string>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "Ws2_32")
using namespace std;
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
//TCP数据段头
#pragma pack(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;
/////////////////////////////////////////////#pragma pack
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;
//IP数据段头
#pragma pack(1)
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;
///////////////////////////////////////////////#pragma pack
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;
string GetProtocolType(int Protocol)
{
switch (Protocol)
{
case IPPROTO_ICMP : //1 /* control message protocol */
return "ICMP";
case IPPROTO_TCP : //6 /* tcp */
return "TCP";
case IPPROTO_UDP : //17 /* user datagram protocol */
return "UDP";
default:
return "UNKNOW_TYPE";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
unsigned int iValue = 1;
int iRet = WSAStartup(MAKEWORD(2,2), &wsaData);
SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
iRet = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*) &iValue, sizeof(iValue));
sockaddr_in addr;
memset((void*) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr("192.168.6.141");
addr.sin_port = htons(0);
iRet = bind(sock, (struct sockaddr*) &addr, sizeof(addr));
BOOL bSniff = TRUE;
unsigned long ulBytes;
iRet = WSAIoctl(sock,SIO_RCVALL,&bSniff, sizeof(bSniff), NULL, 0, &ulBytes, NULL, NULL);
char *buf = new char[65535];
while (true)
{
memset((void*) buf, 0, 65535);
sockaddr_in sockAddr;
memset((void*) &sockAddr, 0, sizeof(sockAddr));
int iLen = sizeof(sockAddr);
iRet = recvfrom(sock, buf, 65535, 0, (struct sockaddr*) &sockAddr, &iLen);
// 对数据包进行分析,并输出分析结果
IP ip = *(IP*)buf;
TCP tcp = *(TCP*)(buf + ip.HdrLen);
string strProtocol = GetProtocolType(ip.Protocol);
cout<<"protocol: "<<strProtocol<<endl;
cout<<"IP src address: "<<inet_ntoa(*(in_addr*)&ip.SrcAddr)<<endl;
cout<<"IP tag address: "<<inet_ntoa(*(in_addr*)&ip.DstAddr)<<endl;
cout<<"TCP src port: "<<tcp.SrcPort<<endl;
cout<<"TCP tag port: "<<tcp.DstPort<<endl;
cout<<"Buf Len: "<<ntohs(ip.TotalLen)<<endl;
cout<<"-------------------------------------------------------------"<<endl;
}
delete [] buf;
closesocket(sock);
WSACleanup();
return 0;
}
#include <iostream>
#include <string>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "Ws2_32")
using namespace std;
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
//TCP数据段头
#pragma pack(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;
/////////////////////////////////////////////#pragma pack
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;
//IP数据段头
#pragma pack(1)
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;
///////////////////////////////////////////////#pragma pack
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;
string GetProtocolType(int Protocol)
{
switch (Protocol)
{
case IPPROTO_ICMP : //1 /* control message protocol */
return "ICMP";
case IPPROTO_TCP : //6 /* tcp */
return "TCP";
case IPPROTO_UDP : //17 /* user datagram protocol */
return "UDP";
default:
return "UNKNOW_TYPE";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
unsigned int iValue = 1;
int iRet = WSAStartup(MAKEWORD(2,2), &wsaData);
SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
iRet = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*) &iValue, sizeof(iValue));
sockaddr_in addr;
memset((void*) &addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = inet_addr("192.168.6.141");
addr.sin_port = htons(0);
iRet = bind(sock, (struct sockaddr*) &addr, sizeof(addr));
BOOL bSniff = TRUE;
unsigned long ulBytes;
iRet = WSAIoctl(sock,SIO_RCVALL,&bSniff, sizeof(bSniff), NULL, 0, &ulBytes, NULL, NULL);
char *buf = new char[65535];
while (true)
{
memset((void*) buf, 0, 65535);
sockaddr_in sockAddr;
memset((void*) &sockAddr, 0, sizeof(sockAddr));
int iLen = sizeof(sockAddr);
iRet = recvfrom(sock, buf, 65535, 0, (struct sockaddr*) &sockAddr, &iLen);
// 对数据包进行分析,并输出分析结果
IP ip = *(IP*)buf;
TCP tcp = *(TCP*)(buf + ip.HdrLen);
string strProtocol = GetProtocolType(ip.Protocol);
cout<<"protocol: "<<strProtocol<<endl;
cout<<"IP src address: "<<inet_ntoa(*(in_addr*)&ip.SrcAddr)<<endl;
cout<<"IP tag address: "<<inet_ntoa(*(in_addr*)&ip.DstAddr)<<endl;
cout<<"TCP src port: "<<tcp.SrcPort<<endl;
cout<<"TCP tag port: "<<tcp.DstPort<<endl;
cout<<"Buf Len: "<<ntohs(ip.TotalLen)<<endl;
cout<<"-------------------------------------------------------------"<<endl;
}
delete [] buf;
closesocket(sock);
WSACleanup();
return 0;
}
相关文章推荐
- 通过原始套接字截取本地网卡的所有数据
- 通过原始套接字发送UDP数据(IKEEPER换机)
- 原始套接字,接收所有数据的设置方法,及代码。
- 以原始套接字的方式 截获流经本机网卡的IP数据包
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
- 小技巧:用CxImage将从摄像头获取的图像原始数据转成JPG,然后通过DDS发送出去
- 利用原始套接字实现一个简单的采集网络数据包
- MDSC很可能,我已经用尽了现有原始数据的所有潜能?
- 通过写代码和虚拟机命令截取网上数据
- 利用原始套接字(SOCK_RAW)对ip数据进行监听
- Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据
- 读取笔记本的摄像头的原始yuv数据,通过libav(ffmpeg编码)
- 原始ajax通过xmlHttpRequest对象的send()方法提交数据--Get方式和Post方式
- 通过vbs脚本备份数据-本地到异地
- iwpriv工具通过ioctl动态获取相应无线网卡驱动的private_args所有扩展参数
- Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据
- JAVA通过ODBC访问本地SAS数据
- Oracle如何通过Database Link复制远程数据库表的CLOB/BLOB字段数据到本地数据库?
- js 通过post方式打开页面 利用html5本地存储获取数据
- 以原始套接字的方式截获流经本机网卡的IP数据包