You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows系统下如何创建可自由构造数据包的TCP/UDP原始套接字?

Windows下创建可自由构造数据包的Raw Socket方法

Windows系统出于防DDoS攻击的目的,对Raw Socket做了严格限制:

  • 无法通过IPPROTO_RAW直接发送自定义IP头的数据包,IP_HDRINCL选项仅允许修改部分IP字段,不能完全自定义整个IP头
  • 禁止伪造源IP地址,系统会自动校验并丢弃不符合规则的数据包
  • Raw Socket操作必须以管理员权限执行

要实现类似Linux下自由构造数据包的能力,推荐以下几种方案:

1. 使用WinPcap/Npcap库(首选)

WinPcap(或其维护版Npcap)是直接操作网络适配器的库,绕开Windows系统的Raw Socket限制,支持完全自定义链路层、网络层、传输层的数据包。

C++示例代码(基于Npcap)

#include <pcap.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 构造自定义IP+TCP数据包
void build_custom_packet(unsigned char* packet, int* packet_len) {
    // 以太网帧头(实际使用需替换为真实MAC地址)
    unsigned char eth_header[] = {0x00,0x11,0x22,0x33,0x44,0x55,  // 目标MAC
                                 0x00,0xaa,0xbb,0xcc,0xdd,0xee,  // 源MAC
                                 0x08,0x00};                     // 帧类型:IP
    // IP头
    unsigned char ip_header[] = {0x45,0x00,0x00,0x28,             // 版本、IHL、总长度
                                 0x12,0x34,0x00,0x00,             // 标识、分片信息
                                 0x40,0x06,0x00,0x00,             // TTL、协议(TCP)、校验和
                                 0xc0,0xa8,0x01,0x02,             // 源IP
                                 0xc0,0xa8,0x01,0x03};            // 目标IP
    // TCP头(SYN包)
    unsigned char tcp_header[] = {0x12,0x34,0x00,0x50,             // 源端口、目标端口(80)
                                  0x00,0x00,0x00,0x00,             // 序列号
                                  0x00,0x00,0x00,0x00,             // 确认号
                                  0x50,0x02,0x71,0x10,             // 数据偏移、SYN标志、窗口大小
                                  0x00,0x00,0x00,0x00};            // 校验和、紧急指针

    // 拼接完整数据包
    memcpy(packet, eth_header, sizeof(eth_header));
    memcpy(packet + sizeof(eth_header), ip_header, sizeof(ip_header));
    memcpy(packet + sizeof(eth_header) + sizeof(ip_header), tcp_header, sizeof(tcp_header));
    *packet_len = sizeof(eth_header) + sizeof(ip_header) + sizeof(tcp_header);
}

int main() {
    pcap_if_t* alldevs;
    pcap_if_t* dev;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t* handle;
    unsigned char packet[1024];
    int packet_len;

    // 获取本地网络适配器列表
    if (pcap_findalldevs(&alldevs, errbuf) == -1) {
        fprintf(stderr, "获取适配器失败:%s\n", errbuf);
        exit(1);
    }

    // 选择第一个可用适配器(实际使用需按需选择)
    dev = alldevs;
    if (dev == NULL) {
        fprintf(stderr, "未找到可用网络适配器\n");
        exit(1);
    }

    // 打开适配器,启用混杂模式
    handle = pcap_open_live(dev->name, 65536, 1, 1000, errbuf);
    if (handle == NULL) {
        fprintf(stderr, "打开适配器失败:%s\n", errbuf);
        pcap_freealldevs(alldevs);
        exit(1);
    }

    // 构造自定义数据包
    build_custom_packet(packet, &packet_len);

    // 发送数据包
    if (pcap_sendpacket(handle, packet, packet_len) != 0) {
        fprintf(stderr, "发送数据包失败:%s\n", pcap_geterr(handle));
    } else {
        printf("自定义数据包发送成功\n");
    }

    // 释放资源
    pcap_close(handle);
    pcap_freealldevs(alldevs);
    return 0;
}

2. 修改注册表(不推荐)

通过修改注册表可解除部分Raw Socket限制,但存在安全风险,且仅对旧版Windows(如XP/7)有效,新版Windows(10/11)限制更严格,可靠性极低:

  • 打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  • 添加DWORD值DisableRawSecurity,设置为1
  • 重启系统生效

3. 系统自带Raw Socket的受限使用

如果仅需修改部分IP字段而非完全自定义,可使用Windows原生Raw Socket,但需注意:

  • 必须以管理员权限运行程序
  • 不能伪造源IP,源IP必须是本机网卡绑定的IP
  • IP_HDRINCL选项仅允许修改TTL、服务类型等字段,IP版本、源/目标IP、总长度等会被系统强制覆盖

你的Python代码在Windows失效的原因

你提供的Linux下Python代码在Windows无法运行的核心原因:

  • Windows不支持IPPROTO_RAW用于发送自定义IP数据包,创建socket.SOCK_RAW, socket.IPPROTO_RAW会直接失败
  • IP_HDRINCL选项在Windows下无法完全自定义IP头,系统会强制校验并修改关键字段
  • 伪造的源IP会被Windows网络栈拦截丢弃

内容的提问来源于stack exchange,提问作者S-N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:52:05