1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
| namespace Socks5
{
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
internal class Socks5Class
{
private byte[] byte_0 = new byte[0x400];
private Socket InSocket;
private int int_0;
private Socket OutSocket;
public Socks5Class(Socket socket_2)
{
this.InSocket = socket_2;
}
private void AuthSocks5(byte[] AuthData, int AuthProgress)
{
IPAddress address;
ushort num3;
switch (this.int_0)
{
case 0:
{
byte num = AuthData[0];
byte num2 = AuthData[2];
if (num == 5)
{
if (num2 != 0)
{
num2 = 0xff;
}
this.InSocket.BeginSend(new byte[] { num, num2 }, 0, 2, SocketFlags.None, new AsyncCallback(this.RedictData4), this.InSocket);
this.int_0++;
return;
}
this.CloseSocks5();
return;
}
case 1:
{
address = null;
num3 = 0;
byte num5 = this.byte_0[1];
if (num5 == 1)
{
switch (this.byte_0[3])
{
case 1:
address = IPAddress.Parse(AuthData[4].ToString() + <PrivateImplementationDetails>{15439A59-21B6-4268-85FC-B75D4C80FFCA}.smethod_1() + AuthData[5].ToString() + <PrivateImplementationDetails>{15439A59-21B6-4268-85FC-B75D4C80FFCA}.smethod_1() + AuthData[6].ToString() + <PrivateImplementationDetails>{15439A59-21B6-4268-85FC-B75D4C80FFCA}.smethod_1() + AuthData[7].ToString());
num3 = (ushort) ((AuthData[8] * 0x100) + AuthData[9]);
break;
case 3:
address = Dns.GetHostAddresses(Encoding.Default.GetString(AuthData, 5, AuthData[4]))[0];
num3 = (ushort) (AuthData[4] + 5);
num3 = (ushort) ((AuthData[num3] * 0x100) + AuthData[num3 + 1]);
break;
}
}
break;
}
case 2:
this.OutSocket.BeginSend(AuthData, 0, AuthProgress, SocketFlags.None, new AsyncCallback(this.RedictData4), this.OutSocket);
return;
default:
return;
}
this.OutSocket = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
this.OutSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
this.OutSocket.BeginConnect(new IPEndPoint(address, num3), new AsyncCallback(this.RedictData3), this.OutSocket).AsyncWaitHandle.WaitOne();
if (this.OutSocket.Connected)
{
AuthData[1] = 0;
}
else
{
AuthData[1] = 4;
}
this.InSocket.BeginSend(AuthData, 0, AuthProgress, SocketFlags.None, new AsyncCallback(this.RedictData4), this.InSocket);
this.int_0++;
}
private void CloseSocks5()
{
try
{
this.OutSocket.Disconnect(false);
this.InSocket.Disconnect(false);
this.OutSocket.Close();
this.InSocket.Close();
}
catch
{
}
}
public void RecieveSocks5()
{
this.InSocket.BeginReceive(this.byte_0, 0, this.byte_0.Length, SocketFlags.None, new AsyncCallback(this.RedictData), this.InSocket);
}
private void RedictData(IAsyncResult iasyncResult_0)
{
try
{
int authProgress = ((Socket) iasyncResult_0.AsyncState).EndReceive(iasyncResult_0);
if (authProgress > 0)
{
this.AuthSocks5(this.byte_0, authProgress);
((Socket) iasyncResult_0.AsyncState).BeginReceive(this.byte_0, 0, this.byte_0.Length, SocketFlags.None, new AsyncCallback(this.RedictData), (Socket) iasyncResult_0.AsyncState);
}
else
{
this.CloseSocks5();
}
}
catch
{
}
}
private void RedictData2(IAsyncResult iasyncResult_0)
{
try
{
int size = ((Socket) iasyncResult_0.AsyncState).EndReceive(iasyncResult_0);
if (size > 0)
{
this.InSocket.BeginSend(this.byte_0, 0, size, SocketFlags.None, new AsyncCallback(this.RedictData4), this.InSocket);
((Socket) iasyncResult_0.AsyncState).BeginReceive(this.byte_0, 0, this.byte_0.Length, SocketFlags.None, new AsyncCallback(this.RedictData2), (Socket) iasyncResult_0.AsyncState);
}
else
{
this.CloseSocks5();
}
}
catch
{
}
}
private void RedictData3(IAsyncResult iasyncResult_0)
{
try
{
((Socket) iasyncResult_0.AsyncState).EndConnect(iasyncResult_0);
((Socket) iasyncResult_0.AsyncState).BeginReceive(this.byte_0, 0, this.byte_0.Length, SocketFlags.None, new AsyncCallback(this.RedictData2), (Socket) iasyncResult_0.AsyncState);
}
catch
{
}
}
private void RedictData4(IAsyncResult iasyncResult_0)
{
try
{
((Socket) iasyncResult_0.AsyncState).EndSend(iasyncResult_0);
}
catch
{
}
}
}
} |