c - 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.
我很难弄清楚为什么会发生这种情况,并尝试了一些方法来解决它,但没有运气。任何帮助/回复将不胜感激!
谢谢。
解决方案
memcpy(request2 + 4, &host_len, 1);
最后一个参数“1”是缓冲区的长度。您不应将其作为常量传递,因为它取决于域名长度的缓冲区长度。
Tor 的 Socks5 代理关心域名长度,如果你发送 '1' 而不是 '13' 作为域名长度,即使你发送了整个域名,它也会读取 's' 而不是 'some-site.com' .
解决方案是:
memcpy(request2 + 4, &host_len, strlen(host_len));
推荐阅读
- android-studio - 使用 Trusted Web Activity 将多个网站与本机应用程序链接
- flutter - 显示小吃店颤振后导航器弹出
- php - 如何在页面上仅显示特定类别标签/名称并隐藏其他类别名称?
- r - 将元素的名称保存在列表 R 中
- spring-boot - 在 Kafka Streams 上运行的 Spring Boot 服务的 Liveness/Readiness 健康指标集
- javascript - Material-ui datepickers,如何禁用某些多个日期
- python - 如何将 zip 存档中的文件分类到 Python 中的列表中?
- javascript - 在导入的组件之间传递 React 状态
- azure-databricks - 使用服务主体从 DataBricks 连接到 Synapse
- react-native - 在本机反应中创建下拉列表