【问题标题】:Raw Socket send TCP SYN-FIN-.. in c++原始套接字在 C++ 中发送 TCP SYN-FIN-..
【发布时间】:2013-11-19 06:11:50
【问题描述】:

我的老师希望我们在 Windows 上用 c++ 做一个原始套接字的练习(用于学习 tcp 通信)。

我遇到了问题。看了很多文档,不知道怎么解决。

int raw()
{
    WSADATA WSAData;
    SOCKET sock;
    SOCKADDR_IN sin,din;
    WSAStartup(MAKEWORD(2, 2), &WSAData);

    char datagram[MAX_PACKET_SIZE];
    struct iphdr *iph = (struct iphdr *)datagram;
    struct tcphdr *tcph = (struct tcphdr *)((UCHAR *)iph +  sizeof(tcphdr));
    char new_ip[sizeof "255.255.255.255"];

    sock = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
    if (sock == INVALID_SOCKET)
        cout << "failled init socket" << endl ;
    else{
        memset(datagram, 0, MAX_PACKET_SIZE); // Clear the data
        setup_ip_header(iph);
        setup_tcp_header(tcph);

        sin.sin_family = AF_INET;
        sin.sin_port = htons(8888);
        sin.sin_addr.s_addr = inet_addr("192.168.1.10"); //source ip

        din.sin_family = AF_INET;
        din.sin_port = htons(DEST_PORT);
        din.sin_addr.s_addr = inet_addr(TARGET_SERV_IP); //ip serv to connect

        tcph->port_dest = htons(DEST_PORT);
        iph->ip_dest = din.sin_addr.s_addr;
        iph->ip_source = sin.sin_addr.s_addr;
        iph->ip_dest = inet_addr(TARGET_SERV_IP); //ip serv to connect
        iph->ip_source = inet_addr("192.168.1.10"); //source ip

        //iph->checksum = csum((unsigned short *)datagram, iph->tot_len >> 1);
        iph->checksum = csum((unsigned short *)datagram, sizeof(struct iphdr));

        int one = 1;
        const int *val = &one;

        if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)val, sizeof(one)) < 0)
            printf("failled set socket option IP_HDRINCL");
        else{
                if (sendto(sock,      /* our socket */
                    datagram,         /* the buffer containing headers and data */
                    ntohs( iph->tot_len),     /* total length of our datagram */
                    0,        /* routing flags, normally always 0 */
                    (struct sockaddr *) &sin,   /* socket addr, just like in */
                    sizeof(sin)) < 0)     /* a normal send() */
                        cout << stderr << "sendto() error!!!.\n " << WSAGetLastError() << endl;
                else
                    cout << "packet send\n"  << endl;
        }
    closesocket(sock);
    }
}

我的错误发生在 sendto() 中。它返回 10022 错误 = WSAEINVAL

我看到这可以是一个新的窗口保护?

您有什么想法可以解决我的问题或绕过保护(更深入,驱动程序等)

【问题讨论】:

  • 您的应用程序是否以管理员权限运行? RAW 套接字仅限管理员使用。
  • 我尝试通过右键单击和“以管理员身份运行”同样的效果。
  • 您是否已完全填充 tcph?设置了一些时髦的重复 iph 字段。

标签: c++ windows tcp raw-sockets


【解决方案1】:

您没有在代码中设置 iph->tot_len。

我对使用 c++ 的网络代码的建议是使用 std::string 或 std::vector:

std::vector<uint8_t> packet(MAX_PACKET_SIZE, 0);
...
packet.resize(real_size);

然后使用地址 (&packet[0]) 进行指针操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 2015-02-22
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    相关资源
    最近更新 更多