Windows下通过使用RAW原始套接字进行抓包

// 注意:原始套接字只在系统管理员权限下起作用,其它情况下socket创建失败,所以开发时首先以管理员权限启动VS

SOCKET nAnniSock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);  // 指定为原始套接字(IP层抓取)


// 设置IP_HDRINCL选项,以便自己构造(解析)IP头部

BOOL bRaw = TRUE;

setsockopt(nAnniSock, IPPROTO_IP, IP_HDRINCL, (const char*)&bRaw, sizeof(bRaw));


// socket本地信息

sockaddr_in stAnniSock;
stAnniSock.sin_family = AF_INET;
stAnniSock.sin_port = htons(0); // 设置为任意端口

// 不设置IP地址会导致后面bind失败,设置为INADDR_ANY的话后面的WSAIoctl会产生参数错误而失败
// 所以只能设置为指定网卡的IP地址(据说设置无线网卡的IP地址也会失败)

stAnniSock.sin_addr.S_un.S_addr = htonl(0xc0a8010a); //htonl(INADDR_ANY);


// 绑定套接字,如果不绑定则后面的recvfrom会立即返回空值
bind(nAnniSock, (sockaddr*)&stAnniSock, sizeof(stAnniSock));

// 设置套接字接收所有数据包(混杂模式)(必须在bind之后调用),#define SIO_RCVALL  (IOC_IN|IOC_VENDOR|1)
DWORD uiOptval = 1;
char charRecv[10];
DWORD dwBytesRet = 0;
WSAIoctl(nAnniSock, (IOC_IN | IOC_VENDOR | 1), &uiOptval, sizeof(uiOptval), charRecv, sizeof(charRecv), &dwBytesRet, NULL, NULL);


// socket发送源信息
sockaddr_in stSockCamera;

int nLen = sizeof(sockaddr_in);
// 超时设定
timeval timeoutonce;
timeoutonce.tv_sec = 1;

timeoutonce.tv_usec = 0;


// 循环接收

while(TRUE)

{

// 调用select前需要从新设置,否则可能只有第一次select到数据包后,以后select就不管用了
fd_set udpSetAnni;
FD_ZERO(&udpSetAnni);
FD_SET(nAnniSock, &udpSetAnni);

// 调用select函数检查是否有数据包到达,否则直接用recvfrom会导致阻塞

if (select(NULL, &udpSetAnni, NULL, NULL, &timeoutonce))

{

// 接收缓冲区
char buffer[298];
memset(buffer, NULL, sizeof(buffer));
// 接收UDP包
recvfrom(nAnniSock, buffer, sizeof(buffer), NULL, (sockaddr*)&stSockCamera, &nLen);

}

}

// 所以只能设置为指定网卡的IP地址(据说设置无线网卡的IP地址也会失败)
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Linux原始Raw Socket)是一种特殊的套类型,它允许应用程序直访问网络协议栈,以实现更底层的网络操作。setsockopt函数是用于设置套选项的函数之一,可以用于配置原始的一些参数。下面是使用setsockopt函数设置原始选项的一般步骤: 1. 创建原始: 首先,使用socket函数创建一个原始。例如,可以使用以下代码创建一个IPv4的原始: ``` int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); ``` 2. 设置套选项: 使用setsockopt函数设置套选项。该函数的原型如下: ``` int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); ``` - sockfd:原始的文件描述符。 - level:选项所属的协议层级,对于原始,通常为SOL_SOCKET。 - optname:选项名称,可以是以下之一: - SO_RCVBUF:设置收缓冲区大小。 - SO_SNDBUF:设置发送缓冲区大小。 - SO_RCVTIMEO:设置收超时时间。 - SO_SNDTIMEO:设置发送超时时间。 - 其他选项,请参考相关文档。 - optval:指向含选项值的缓冲区。 - optlen:选项值的长度。 例如,设置收缓冲区大小为4096节的代码如下: ``` int buffer_size = 4096; setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size)); ``` 3. 其他操作: 根据需要,可以进行其他操作,如绑定地址、发送和收数据等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值