shunf4 / proxychains-windows

Windows and Cygwin port of proxychains, based on MinHook and DLL Injection
GNU General Public License v2.0
967 stars 117 forks source link

客户端WSAAsyncSelect函数能否支撑? #22

Open zhaowq32 opened 3 years ago

zhaowq32 commented 3 years ago

客户端通过WSAAsyncSelect函数异步的监听socket的状态,当WSAGETSELECTEVENT为FD_CONNECT时,发送业务数据。此时proxychains应该连接socks5服务器完毕,但是没有连接真实服务器,此时发送数据应该会失败的吧?

shunf4 commented 3 years ago

在连接时使用的是哪个函数?

zhaowq32 commented 3 years ago

Wsaconnect

shunf4 commented 3 years ago

proxychains hook 了 WSAConnect 函数,并强制它同步地完成与 SOCKS5 服务器的连接与协商。因此当 WSAConnect 返回时,代理连接就已经建立。

zhaowq32 commented 3 years ago

WSAAsyncSelect函数不是根据WSAConnect的返回值来进行判断,而是根据Socket Handle状态。也就是说当Socket Handle连接到Socks5服务器的时候,就会触发FD_CONNECT事件,进行业务数据的发送,但此时socks5请求及鉴权尚未完成。

shunf4 commented 3 years ago

这是您使用时实际观察到的情况吗?

zhaowq32 commented 3 years ago

之前做类似项目遇到的问题

shunf4 commented 3 years ago

请您再仔细读一遍我之前说的:

proxychains hook 了 WSAConnect 函数,并强制它同步地完成与 SOCKS5 服务器的连接与协商。因此当 WSAConnect 返回时,代理连接就已经建立。

我没有其他要补充的。

zhaowq32 commented 3 years ago

嗯 好的 多谢了

zhaowq32 commented 2 years ago

restsharp库存在wsaconnect socks5交互过程未完成就发送业务数据的情况

shunf4 commented 2 years ago

请提供最小可复现示例(Minimal reproducible example)。

zhaowq32 commented 2 years ago
using System;
using System.Net;
using System.Runtime.InteropServices;
using RestSharp;

namespace ConsoleSharpApp
{
    class Program
    {
        public void DoRequest(Action<bool, string> action)
        {
            try
            {
                var request = new RestRequest(Method.GET);

                //calling server with restClient
                var restClient = new RestClient
                {
                    BaseUrl = new Uri("http://pv.sohu.com/cityjson")
                };
                restClient.ExecuteAsync(request, (response) =>
                {
                    Console.WriteLine(response.StatusCode);
                });
            }
            catch (Exception)
            {
                action(false, "fail");
            }
        }

        static void doAction(bool ret, string message)
        {
            if (ret)
            {
                Console.WriteLine("true,message:" + message);
            } else
            {
                Console.WriteLine("false,message:" + message);
            }
        }

        static void Main(string[] args)
        {
            Program program = new Program();
            Action<bool, string> action = new Action<bool, string>(doAction);
            program.DoRequest(action);
            Console.ReadLine();
        }
    }
}
zhaowq32 commented 2 years ago

我怀疑是处理事件的ui线程和发起socket请求的线程是不同的,wsaconnect只阻塞了发起socket请求的线程,而处理事件的ui线程在wsaconnect返回前就开始处理业务数据了。