Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何通过钩住的套接字调用与HTTP/HTTPS代理服务器(如Fiddler)通信?_Sockets_Https_Proxy_Hook_Fiddler - Fatal编程技术网

Sockets 如何通过钩住的套接字调用与HTTP/HTTPS代理服务器(如Fiddler)通信?

Sockets 如何通过钩住的套接字调用与HTTP/HTTPS代理服务器(如Fiddler)通信?,sockets,https,proxy,hook,fiddler,Sockets,Https,Proxy,Hook,Fiddler,在Windows7上,我想强制一个定制的web浏览器应用程序与Fiddler代理进行对话(对于HTTP和HTTPS),这样我就可以使用Fiddler处理web流量 自定义浏览器应用程序本身没有代理设置,因此我设法编写了自己的应用程序来拦截ws2_32/wsock32套接字调用,即getaddrinfo()、connect()、send()和recv() 使用mhook库。现在,在截获的connect()调用中,如果我改为连接到fiddler的IP和端口,我可以将所有HTTP流量定向到fiddle

在Windows7上,我想强制一个定制的web浏览器应用程序与Fiddler代理进行对话(对于HTTP和HTTPS),这样我就可以使用Fiddler处理web流量

自定义浏览器应用程序本身没有代理设置,因此我设法编写了自己的应用程序来拦截ws2_32/wsock32套接字调用,即getaddrinfo()、connect()、send()和recv() 使用mhook库。现在,在截获的connect()调用中,如果我改为连接到fiddler的IP和端口,我可以将所有HTTP流量定向到fiddler,如下代码所示:

int WSAAPI Hookconnect(SOCKET s, const struct sockaddr *name, int namelen)
{
    int sock_type;
    socklen_t sock_type_length = sizeof(sock_type);
    getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)(&sock_type), &sock_type_length);

    if (sock_type == SOCK_STREAM) {
        WSAPROTOCOL_INFO proto_info;
        socklen_t proto_type_length = sizeof(proto_info);
        getsockopt(s, SOL_SOCKET, SO_PROTOCOL_INFO, (char*)&proto_info, &proto_type_length);

        if (proto_info.iProtocol == IPPROTO_TCP)
        {
            // get port number from 'sin_port' member of sockaddr, and 'ntohs' function, wrapped in my own 'getPortFromSockaddr' call
            u_short port = getPortFromSockaddr(name);
            bool isHttp = (port==80);
            bool isHttps = (port==443);

            // for TCP, we connect to Fiddler instead
            sockaddr_in clientService;
            clientService.sin_family = AF_INET;
            clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
            clientService.sin_port = htons(8888);

            // Trueconnect is the "true" socket connect API, if connecting to HTTP port
            if (isHttp)
                return Trueconnect(s, (SOCKADDR *) & clientService, sizeof(clientService));
            else if (isHttps)
            {
                int retVal =  Trueconnect(s, (SOCKADDR *) & clientService, sizeof(clientService));
                if (retVal == SOCKET_ERROR) {  // connection is not necessarily failing for nonblocking socket
                    if (WSAGetLastError() != WSAEWOULDBLOCK) {
                        return retVal;  // some sort of error
                    } else { // connection in progress for non-blocking socket
                        //check if socket is ready, with timeout = 15 seconds
                        int result = 0;
                        retVal = WaitForNonBlockingSocket(s, 15, result);
                        if (retVal == 0) {
                            // send CONNECT to proxy server for 'https tunneling', where 'getHostNameFromAddress()' retrieves the server name by calling 'getnameinfo()', and 'SendConnectToHost()' will construct the CONNECT command string and send it through socket 's'
                            int retBytes = SendConnectlToHost(s, getHostNameFromAddress(name, namelen));
                            return retVal;
                        }
                    }
                }
                // Returns the value for Trueconnect()
                return retVal;
            }
        }
    }
    return Trueconnect(s, name, namelen);
}
但是,此代码不能正确用于HTTPS。我不知道这里的校长缺了什么。。。请帮忙。非常感谢


编辑:请注意,客户端是Geckofx浏览器。它与firefox兼容,因此我可以让它信任Fiddler的拦截证书,方法是将其证书数据库文件与从firefox文件夹复制的文件重叠。我的firefox信任Fiddler的证书,因为我对它进行了配置。

我们可以进行一些黑客攻击来处理这样一个事实,即客户端不知道代理,并且无法发送
CONNECT
,但更大的问题是客户端不太可能信任Fiddler的拦截证书。客户是什么?很难找到使用HTTP/HTTPS但不支持代理的应用程序…@EricLaw Hi Eric,客户端是一个.NET和xulrunner应用程序,其中嵌入了Geckofx,因此我认为它在内部与firefox非常相似。它主要是一种聊天室类型的程序(非英语),带有嵌入式浏览器,不提供用于设置代理的UI组件。对于黑客手段,这是不是只有作为作者的Fiddler源代码才能实现?如果我将fiddler证书安装到Windows可信根证书中,那么更大的问题可以解决吗?你认为通过正确入侵套接字API可以发出正确的CONNECT命令吗?@EricLaw我编辑了这篇文章,添加了检测HTTPS与HTTP的代码,以便在HTTPS情况下插入CONNECT命令。我还解释了如何让firefox投诉客户端信任Fiddler的证书。还缺什么?在Fiddler中,我可以看到CONNECT已被识别,ssl握手似乎已启动,但我不知道之后哪里出了问题。这里的问题是,Fiddler将通过在HTTPS服务器Hello之前发回
HTTP/200 CONNECTED…
头块来响应
CONNECT
。客户端需要吃掉这些字节,连接才能成功。据我所知,有一些标志可以用来指示Gecko使用特定的代理: