private int _onConnect(IntPtr socket, IntPtr address, int addrSize) { var structure = Marshal.PtrToStructure <sockaddr_in>(address); var ipAddress = new IPAddress(structure.sin_addr.S_addr); var port = structure.sin_port; if (_interface.LocalPortWhiteList().Contains(htons(port)) && ipAddress.ToString() is string str_ip && (str_ip == "127.0.0.1" || str_ip == "0.0.0.0" || str_ip == "")) // if local { return(connect(socket, address, addrSize)); } _interface.Message($"Connection attempt at {ipAddress}:{htons(port)}, redirecting to 127.0.0.1:{_redirectionPort}..."); _interface.IpRedirected(new IPEndPoint(ipAddress, htons(port)), Process.GetCurrentProcess().Id, _redirectionPort); var strucPtr = Marshal.AllocHGlobal(addrSize); var struc = new sockaddr_in { sin_addr = { S_addr = inet_addr("127.0.0.1") }, sin_port = htons(_redirectionPort), sin_family = (short)AddressFamily.InterNetworkv4, }; Marshal.StructureToPtr(struc, strucPtr, true); return(connect(socket, strucPtr, addrSize)); }
private int _onConnect(IntPtr s, IntPtr sockAddr, int addrsize) { //lock (wSockLock) //{ // // retrieve remote ip // sockaddr_in structure = (sockaddr_in)Marshal.PtrToStructure(sockAddr, typeof(sockaddr_in)); // string remoteIp = new System.Net.IPAddress(structure.sin_addr.S_addr).ToString(); // ushort remotePort = ntohs(structure.sin_port); // HookManager.Log("Ip: " + remoteIp + " Port: " + remotePort.ToString() + " Addrsize: " + addrsize); // if (true) // { // // connect to socks5 server // //IntPtr test = CreateAddr(proxyIp,proxyPort.ToString()); // SetAddr(sockAddr, "191.101.89.189", "45786"); // IntPtr val = CreateAddr("191.101.89.189", "45786"); // var result = connect(s, val, addrsize); // _interface.IpRedirected(new IPEndPoint(new IPAddress(structure.sin_addr.S_addr), htons(structure.sin_port)), Process.GetCurrentProcess().Id, _redirectionPort); // var strucPtr = Marshal.AllocHGlobal(addrsize); // var struc = new sockaddr_in // { // sin_addr = { S_addr = inet_addr(_interface.GetRedirectedIp()) }, // sin_port = htons(_redirectionPort), // sin_family = (short)AddressFamily.InterNetworkv4, // }; // Marshal.StructureToPtr(struc, strucPtr, true); // return connect(s, strucPtr, addrsize); // // send socks 5 request // IntPtr socksProtocolRequest = SetUpSocks5Request(); // result = -1; // while (result == -1) // { // result = send(s, socksProtocolRequest, 4, 0); // var errorcode = WSAGetLastError(); // if (errorcode != WSAENOTCONN && errorcode != WSANOERROR) // { // HookManager.Log("Send failed, Error: + " + errorcode); // return -1; // } // Thread.Sleep(1); // } // // retrieve server repsonse // var response = IntPtr.Zero; // while (response == IntPtr.Zero) // { // response = Recieve(s, 2); // var errorcode = WSAGetLastError(); // if (errorcode != WSAEWOULDBLOCK && errorcode != WSANOERROR) // { // HookManager.Log("Recieve FAILED response == IntPtr.Zero! Lasterror: " + errorcode.ToString()); // return -1; // } // Thread.Sleep(1); // } // byte[] recvBytes = new byte[2] { Marshal.ReadByte(response), Marshal.ReadByte(response, 1) }; // if (recvBytes[1] == 255) // { // HookManager.Log("No authentication method was accepted by the proxy server"); // return -1; // } // if (recvBytes[0] != 5) // { // HookManager.Log("No SOCKS5 proxy"); // return -1; // } // // if auth request response, send authenicate request // if (recvBytes[1] == 2) // { // int length = 0; // var authenticateRequest = SetUpAuthenticateRequest("Seldylcrel", "V7a2EkY", out length); // result = -1; // while (result == -1) // { // result = send(s, authenticateRequest, length, 0); // var errorcode = WSAGetLastError(); // if (errorcode != WSAENOTCONN && errorcode != WSANOERROR) // { // HookManager.Log("Send failed, Error: + " + errorcode); // return -1; // } // Thread.Sleep(1); // } // response = IntPtr.Zero; // while (response == IntPtr.Zero) // { // response = Recieve(s, 2); // var errorcode = WSAGetLastError(); // if (errorcode != WSAEWOULDBLOCK && errorcode != WSANOERROR) // { // HookManager.Log("Recieve FAILED response == IntPtr.Zero! Lasterror: " + errorcode.ToString()); // return -1; // } // Thread.Sleep(1); // } // recvBytes = new byte[2] { Marshal.ReadByte(response), Marshal.ReadByte(response, 1) }; // if (recvBytes[1] != 0) // { // //HookManager.Log("Proxy: incorrect username/password"); // HookManager.Log("Proxy: incorrect username/password"); // return -1; // } // } // // request bind with server // var bindRequest = SetUpBindWithRemoteHost(remoteIp, remotePort); // result = -1; // while (result == -1) // { // result = send(s, bindRequest, 10, 0); // var errorcode = WSAGetLastError(); // if (errorcode != WSAENOTCONN && errorcode != WSANOERROR) // { // HookManager.Log("Send failed (bindRequest), Error: + " + errorcode); // return -1; // } // Thread.Sleep(1); // } // // bind response // response = IntPtr.Zero; // while (response == IntPtr.Zero) // { // response = Recieve(s, 10); // var errorcode = WSAGetLastError(); // if (errorcode != WSAEWOULDBLOCK && errorcode != WSANOERROR) // { // HookManager.Log("Recieve FAILED response == IntPtr.Zero! Lasterror: " + errorcode.ToString()); // return -1; // } // Thread.Sleep(1); // } // if (!VerifyBindResponse(response)) // { // HookManager.Log("VerifyBindResponse failed!"); // return -1; // } // // success // WSASetLastError(0); // SetLastError(0); // // clean memory // foreach (var ptr in allocatedMemory) // Marshal.FreeHGlobal(ptr); // allocatedMemory.Clear(); // return 0; // } // else // { // return connect(s, sockAddr, addrsize); // } //} var structure = Marshal.PtrToStructure <sockaddr_in>(sockAddr); var ipAddress = new IPAddress(structure.sin_addr.S_addr); var port = structure.sin_port; if (ipAddress.ToString() is string str_ip && (str_ip == "127.0.0.1" || str_ip == "0.0.0.0" || str_ip == "")) // if local { return(connect(s, sockAddr, addrsize)); } //_interface.Message($"Connection attempt at {ipAddress}:{htons(port)}, redirecting to 127.0.0.1:{_redirectionPort}..."); _interface.IpRedirected(new IPEndPoint(ipAddress, htons(port)), Process.GetCurrentProcess().Id, _redirectionPort); var strucPtr = Marshal.AllocHGlobal(addrsize); var struc = new sockaddr_in { sin_addr = { S_addr = inet_addr(_interface.GetRedirectedIp()) }, sin_port = htons(_redirectionPort), sin_family = (short)AddressFamily.InterNetworkv4, }; Marshal.StructureToPtr(struc, strucPtr, true); return(connect(s, strucPtr, addrsize)); }