我正在尝试编写一个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.comTOR服务器返回此错误:
[warn] Your application (using socks5 to port 0) gave Tor a malformed hostname: [scrubbed]. Rejecting the connection.我很难弄清楚为什么会发生这种情况,我已经尝试了几种方法来解决它,但没有成功。任何帮助/回复都将非常感谢!
谢谢。
发布于 2021-08-23 00:16:20
在memcpy(request2 + 4, &host_len, 1);中,最后一个参数'1‘是缓冲区的长度。您不应该将其作为常量传递,因为它取决于域名长度的缓冲区的长度。
Tor的Socks5代理关心域名长度,如果您发送'1‘而不是'13’作为域名长度,即使您发送了整个域名,它也会读取's‘而不是'some-site.com’。
解决方案是:memcpy(request2 + 4, &host_len, strlen(host_len));
https://stackoverflow.com/questions/53559627
复制相似问题