public static byte[] BuildSocks4Command(byte command, HostPortCollection dstHost) { dstHost.UseHost = false; // 4A Doesnt work byte[] destAddr = dstHost.UseAvaiableHost ? new byte[] { 0, 0, 0, 1 } : dstHost.Addr.GetAddressBytes(); byte[] destPort = new byte[] { Convert.ToByte(dstHost.Port / 256), Convert.ToByte(dstHost.Port % 256) }; byte[] userIdBytes = string.Empty.GetBytes(Encoding.ASCII); byte[] hostBytes = dstHost.UseAvaiableHost ? dstHost.Host.GetBytes(Encoding.ASCII) : null; var rqLen = dstHost.UseAvaiableHost && hostBytes != null ? 10 + userIdBytes.Length + hostBytes.Length : 9 + userIdBytes.Length; byte[] request = new byte[rqLen]; // set the bits on the request byte array request[0] = 0x04;//SOCKS4_VERSION_NUMBER request[1] = command; destPort.CopyTo(request, 2); destAddr.CopyTo(request, 4); userIdBytes.CopyTo(request, 8); // copy the userid to the request byte array request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId if (dstHost.UseAvaiableHost && hostBytes != null) { hostBytes.CopyTo(request, 9 + userIdBytes.Length); // copy the host name to the request byte array request[9 + userIdBytes.Length + hostBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId } return(request); }
public override async Task <Stream> OpenStreamAsync(HostPortCollection dstSrv) { var socket = new TcpClient(); if (await SwallowExceptionUtils.TryExec(() => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected) { var buf = new byte[2]; int bytesRead = 0; var nStream = socket.GetStream(); await nStream.WriteAsync(Socks5Payload, 0, Socks5Payload.Length); bytesRead = await nStream.ReadAsync(buf, 0, 2); if (bytesRead != 2) { Status = ProxyStatus.ProtocolError; socket.Close(); socket.Dispose(); } if (buf[0] == 0x05 && buf[1] == 0x00) { //Continue... var cmd = ProxyCommandBuildUtils.BuildSocks5Command(0x01, dstSrv); //0x01 = SOCKS5_CMD_CONNECT await nStream.WriteAsync(cmd, 0, cmd.Length); Array.Clear(cmd, 0, cmd.Length); bytesRead = await nStream.ReadAsync(cmd, 0, cmd.Length); if (bytesRead > 2 && cmd[1] == 0x00) { return(nStream); } else { Status = ProxyStatus.ProtocolError; Debugger.Break(); } } else { Status = buf[0] == 0x02 ? ProxyStatus.PasswordRequired : ProxyStatus.ProtocolError; } nStream?.Close(); nStream?.Dispose(); } else { Status = ProxyStatus.ConnectionFail; } return(null); }
public override async Task <Stream> OpenStreamAsync(HostPortCollection dstSrv) { var socket = new TcpClient(); if (await SwallowExceptionUtils.TryExec(() => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected) { var nStream = socket.GetStream(); var cmd = ProxyCommandBuildUtils.GenerateHttpConnectCommand(dstSrv.Host, dstSrv.Port); await nStream.WriteAsync(cmd, 0, cmd.Length); return(nStream); } return(null); }
public static byte[] BuildSocks5Command(byte command, HostPortCollection dstHost) { byte addressType = dstHost.UseAvaiableHost ? GetDstAddrType(dstHost.Host) : GetDstAddrType(dstHost.Addr); byte[] destAddr = dstHost.UseAvaiableHost ? GetHostBytes(dstHost.Host) : dstHost.Addr.GetAddressBytes(); byte[] destPort = new byte[] { Convert.ToByte(dstHost.Port / 256), Convert.ToByte(dstHost.Port % 256) }; byte[] request = new byte[4 + destAddr.Length + 2]; request[0] = 5; //SOCKS5_VERSION_NUMBER request[1] = command; request[2] = 0x00; //SOCKS5_RESERVED request[3] = addressType; destAddr.CopyTo(request, 4); destPort.CopyTo(request, 4 + destAddr.Length); return(request); }
public override async Task <Stream> OpenStreamAsync(HostPortCollection dstSrv) { var socket = new TcpClient(); if (await SwallowExceptionUtils.TryExec( () => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected) { var buf = new byte[8]; int bytesRead = 0; var nStream = socket.GetStream(); var cmd = ProxyCommandBuildUtils.BuildSocks4Command(0x01, dstSrv); //SOCKS4_CMD_CONNECT await nStream.WriteAsync(cmd, 0, cmd.Length); bytesRead = await nStream.ReadAsync(buf, 0, buf.Length); if (bytesRead > 1 && buf[1] == 0x5A) { return(nStream); } else { if (buf[1] == 0xFF) { //May be socks5? Debugger.Break(); } Status = ProxyStatus.ProtocolError; } } else { Status = ProxyStatus.ConnectionFail; } socket.Close(); socket.Dispose(); return(null); }
public HttpConnect(HostPortCollection proxyInformation) : base(proxyInformation) { }
public Socks4(HostPortCollection proxyInformation) : base(proxyInformation) { }