首页 > 解决方案 > C TOR 套接字未发送请求

问题描述

我正在尝试制作一个 C 程序,该程序通过 TOR 代理服务器使用套接字向用户在运行程序时通过的站点发送 GET 请求。该程序编译完美,连接和通信正常,但服务器在尝试将请求发送到域时不断返回错误。

我已经尝试了几种修复它的方法,但到目前为止似乎都没有奏效。这是我的代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

int main(int argc, char **argv) {
    if(!argv[1]) {
            printf("Usage: %s [HOST]\n",argv[0]);
            exit(1);
    }

    char *host = argv[1];
    struct sockaddr_in server;
    int s = socket(AF_INET, SOCK_STREAM, 0);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("192.168.1.20"); //TOR server address
    server.sin_port = htons( 9050 );

    connect(s, (struct sockaddr*)&server, sizeof(server));

    char request1[3] = (char []) { 0x05, 0x01, 0x00 };
    send(s, request1, 3, 0);

    char response1[2];
    recv(s, response1, 2, 0);

    short port = htons(80);
    char host_len = (char)strlen(host);
    char* request2[4+1+host_len+2];
    char tempRequestHolder[4] = (char []) { 0x05, 0x01, 0x00, 0x03 };

    memcpy(request2, tempRequestHolder, 4);
    memcpy(request2 + 4, &host_len, 1);
    memcpy(request2 + 5, host, host_len);
    memcpy(request2 + 5 + host_len, &port, 2);

    send(s, (char *)request2, 4 + 1 + host_len + 2, 0);

    char response2[10];
    recv(s, response2, 10, 0);

    char * request = "GET / HTTP/1.0\r\n\r\n";
    char buf[2048];
    unsigned int rec = recv(s, buf, 2048, 0);

    printf("\n%s\n",buf);

    return 0;
}

当它运行时:

./tor-client some-site.com

TOR 服务器返回此错误:

[warn] Your application (using socks5 to port 0) gave Tor a malformed hostname: [scrubbed]. Rejecting the connection.

我很难弄清楚为什么会发生这种情况,并尝试了一些方法来解决它,但没有运气。任何帮助/回复将不胜感激!

谢谢。

标签: csocketsnetworkingproxytor

解决方案


memcpy(request2 + 4, &host_len, 1);最后一个参数“1”是缓冲区的长度。您不应将其作为常量传递,因为它取决于域名长度的缓冲区长度。

Tor 的 Socks5 代理关心域名长度,如果你发送 '1' 而不是 '13' 作为域名长度,即使你发送了整个域名,它也会读取 's' 而不是 'some-site.com' .

解决方案是: memcpy(request2 + 4, &host_len, strlen(host_len));


推荐阅读