鱼C论坛

 找回密码
 立即注册
查看: 56|回复: 2

[操作系统] Windows下如何设置全局Socks5代理加认证

[复制链接]
发表于 昨天 14:27 | 显示全部楼层 |阅读模式
60鱼币
如标题, 系统设置虽然可以设置全局socks代理 但是解决不了认证问题

在不借助其他软件的情况下,如何通过编程手段 实现 全局Socks5代理加认证

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 14:47 | 显示全部楼层
要在Windows下通过编程手段实现全局Socks5代理加认证,可按照以下思路和步骤进行:


    []
    一、技术原理与协议基础
    Socks5是一种代理协议,其认证机制可通过RFC 1929(用户名密码认证)实现。需编写程序完成以下流程:

      []协议握手:与客户端协商Socks5版本、认证方法(选择支持用户名密码的0x02方法)。
      []认证流程:验证客户端提交的用户名和密码。
      []连接转发:建立客户端与目标服务器的双向数据传输通道。


    []
    二、编程实现步骤(以C/C++ + WinSock为例)

      []
      1. 初始化WinSock环境
      1. #include <winsock2.h>
      2. #include <ws2tcpip.h>
      3. #pragma comment(lib, "ws2_32.lib")

      4. int main() {
      5. WSADATA wsaData;
      6. WSAStartup(MAKEWORD(2, 2), &wsaData);
      7. // 后续操作...
      8. }
      复制代码


      []
      2. 创建监听Socket,接收客户端连接
      1. SOCKET listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      2. sockaddr_in addr;
      3. addr.sin_family = AF_INET;
      4. addr.sin_addr.s_addr = INADDR_ANY;
      5. addr.sin_port = htons(1080); // 监听本地1080端口
      6. bind(listenSock, (sockaddr)&addr, sizeof(addr));
      7. listen(listenSock, 5);

      8. while (true) {
      9. SOCKET clientSock = accept(listenSock, NULL, NULL);
      10. // 为每个客户端创建线程处理请求
      11. CreateThread(NULL, 0, ClientHandler, (LPVOID)clientSock, 0, NULL);
      12. }
      复制代码


    • 3. 处理Socks5握手与认证
      1. DWORD WINAPI ClientHandler(LPVOID lpParam) {
      2. SOCKET clientSock = (SOCKET)lpParam;
      3. char buf[256];
      4. int len;

      5. // 步骤1:读取客户端的Socks5版本和认证方法列表
      6. len = recv(clientSock, buf, sizeof(buf), 0);
      7. if (buf[0] != 0x05) { /* 不是Socks5协议,关闭连接 / closesocket(clientSock); return 0; }
      8. int authMethodCount = buf[1];
      9. bool supportAuth = false;
      10. for (int i = 0; i < authMethodCount; i++) {
      11. if (buf[2 + i] == 0x02) { // 支持用户名密码认证
      12. supportAuth = true;
      13. break;
      14. }
      15. }
      16. if (!supportAuth) { / 不支持客户端的认证方法,关闭连接 */ closesocket(clientSock); return 0; }
      17. // 发送选择的认证方法
      18. send(clientSock, "\x05\x02", 2, 0);

      19. // 步骤2:处理用户名密码认证(RFC 1929)
      20. len = recv(clientSock, buf, sizeof(buf), 0);
      21. if (buf[0] != 0x01) { /* 认证方法不是用户名密码,异常 / closesocket(clientSock); return 0; }
      22. int usernameLen = buf[1];
      23. char username = buf + 2;
      24. int passwordLen = buf[2 + usernameLen];
      25. char* password = buf + 3 + usernameLen;
      26. // 这里替换为实际的用户名密码验证逻辑
      27. bool authSuccess = (strcmp(username, "your_username") == 0) && (strcmp(password, "your_password") == 0);
      28. send(clientSock, authSuccess ? "\x01\x00" : "\x01\x01", 2, 0);
      29. if (!authSuccess) { closesocket(clientSock); return 0; }

      30. // 步骤3:处理Socks5连接请求(省略目标地址解析、建立连接等逻辑,需参考RFC 1928实现)
      31. // ... 后续实现数据转发 ...
      32. }
      复制代码


    • 4. 数据转发(双向传输)
      需为每个客户端-目标服务器的连接创建两个数据传输通道,可通过多线程异步IO实现:
      1. // 示例:简单的数据转发函数(需完善错误处理)
      2. void ForwardData(SOCKET src, SOCKET dst) {
      3. char buf[4096];
      4. int len;
      5. while ((len = recv(src, buf, sizeof(buf), 0)) > 0) {
      6. send(dst, buf, len, 0);
      7. }
      8. closesocket(src);
      9. closesocket(dst);
      10. }
      复制代码



  • 三、系统全局代理设置
    将Windows的全局Socks代理指向你编写的代理程序的本地IP(如127.0.0.1)和监听端口(如1080),即可让系统流量通过该代理并完成认证。

    []
    四、注意事项

      []需处理各种异常场景(如连接失败、认证失败、数据传输中断等)。
      []若需支持高并发,可引入线程池或异步IO模型(如IOCP)优化性能。
      []编程时需严格遵循Socks5协议规范和认证规范。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 昨天 14:54 | 显示全部楼层
尉尉的可乐 发表于 2025-9-27 14:47
要在Windows下通过编程手段实现全局Socks5代理加认证,可按照以下思路和步骤进行:

.....不是说实现socks代理服务器
我的意思是:

假设代理服务器的服务端我已经写好了
我要实现客户端里的全局代理功能 能够进行认证
如何实现 (winodws的系统设置解决不了这个问题,而且不借助其他软件)

还有能别用AI回复吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-28 06:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表