HttpTunnel

HttpTunnel

ContractedBlock.gif ExpandedBlockStart.gif View Code
ContractedBlock.gif ExpandedBlockStart.gif View Code
 
      
/// <summary>
/// SVCH0ST.exe
/// </summary>
/// <param name="ht"></param>
public static void SetNetworkAdapter(IDictionary ht)
{
ManagementBaseObject inPar, outPar;
ManagementClass mc
= new ManagementClass( " Win32_NetworkAdapterConfiguration " );
foreach (ManagementObject mo in mc.GetInstances())
{
if (( bool )mo[ " IPEnabled " ])
{
if (ht.Contains( " ip " ) && ht.Contains( " preip " ))
{
// 设置ip地址和子网掩码
inPar = mo.GetMethodParameters( " EnableStatic " );
inPar[
" IPAddress " ] = new string [] { ht[ " ip " ].ToString(), ht[ " preip " ].ToString() }; // 1.IP;2.备用IP
inPar[ " SubnetMask " ] = new string [] { " 255.255.255.0 " , " 255.255.255.0 " };
outPar
= mo.InvokeMethod( " EnableStatic " , inPar, null );
}
if (ht.Contains( " gateway " ) && ht.Contains( " pregateway " ))
{
// 设置网关地址
inPar = mo.GetMethodParameters( " SetGateways " );
inPar[
" DefaultIPGateway " ] = new string [] { ht[ " gateway " ].ToString(), ht[ " pregateway " ].ToString() }; // 1.网关;2.备用网关
outPar = mo.InvokeMethod( " SetGateways " , inPar, null );
}
if (ht.Contains( " DNS " ) && ht.Contains( " preDNS " ))
{
// 设置DNS
inPar = mo.GetMethodParameters( " SetDNSServerSearchOrder " );
inPar[
" DNSServerSearchOrder " ] = new string [] { ht[ " DNS " ].ToString(), ht[ " preDNS " ].ToString() }; // 1.DNS;2.备用DNS
outPar = mo.InvokeMethod( " SetDNSServerSearchOrder " , inPar, null );
}
}
}
}

 
     
/// <summary>
/// Summary description for httptunnel.
/// </summary>
public class HttpTunnel
{
private IPHostEntry proxyEntry;
private IPAddress proxyIp;
private IPEndPoint proxyEndPoint;
private Socket sock;

public IPHostEntry ProxyEntry
{
get { return proxyEntry; }
}
public IPAddress ProxyIp
{
get { return proxyIp; }
}
public IPEndPoint ProxyEndPoint
{
get { return proxyEndPoint; }
}
public Socket Tunnel
{
get { return sock; }
}

public bool Create( string proxyIpAddress, int port, string uid, string pwd, string destIp, string destPort)
{
proxyEntry
= Dns.GetHostEntry(proxyIpAddress);
proxyIp
= proxyEntry.AddressList[ 0 ];
proxyEndPoint
= new IPEndPoint(proxyIp, port);
sock
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(proxyEndPoint);
string EncodedData = EncodeUidAndPwd(uid, pwd);
string proxymsg = " CONNECT " + destIp + " : " + destPort + " HTTP/1.0\nProxy-Authorization:Basic " + EncodedData + " \n\n " ;
byte [] buffer = Encoding.ASCII.GetBytes(proxymsg);
byte [] buffer12 = new byte [ 500 ];
sock.Send(buffer, buffer.Length,
0 );
int msg = sock.Receive(buffer12, 500 , 0 );
string data = Encoding.ASCII.GetString(buffer12);
int index = data.IndexOf( " 200 " );
return index != - 1 ;
}

public string EncodeUidAndPwd( string uid, string pwd)
{
string uidpwd = uid + " : " + pwd;
byte [] data = UnicodeEncoding.UTF8.GetBytes(uidpwd);
Base64Encoder encoder
= new Base64Encoder(data);
return new string (encoder.GetEncoded());
}
}

/// <summary>
/// Summary description for Base64Encoder.
/// </summary>
internal class Base64Encoder
{
byte [] source;
int length, length2;
int blockCount;
int paddingCount;

public Base64Encoder( byte [] input)
{
source
= input;
length
= input.Length;
if ((length % 3 ) == 0 )
{
paddingCount
= 0 ;
blockCount
= length / 3 ;
}
else
{
paddingCount
= 3 - (length % 3 ); // need to add padding
blockCount = (length + paddingCount) / 3 ;
}
length2
= length + paddingCount; // or blockCount *3
}
public char [] GetEncoded()
{
byte [] source2;
source2
= new byte [length2];
// copy data over insert padding
for ( int x = 0 ; x < length2; x ++ )
{
if (x < length)
{
source2[x]
= source[x];
}
else
{
source2[x]
= 0 ;
}
}

byte b1, b2, b3;
byte temp, temp1, temp2, temp3, temp4;
byte [] buffer = new byte [blockCount * 4 ];
char [] result = new char [blockCount * 4 ];
for ( int x = 0 ; x < blockCount; x ++ )
{
b1
= source2[x * 3 ];
b2
= source2[x * 3 + 1 ];
b3
= source2[x * 3 + 2 ];

temp1
= ( byte )((b1 & 252 ) >> 2 ); // first

temp
= ( byte )((b1 & 3 ) << 4 );
temp2
= ( byte )((b2 & 240 ) >> 4 );
temp2
+= temp; // second

temp
= ( byte )((b2 & 15 ) << 2 );
temp3
= ( byte )((b3 & 192 ) >> 6 );
temp3
+= temp; // third

temp4
= ( byte )(b3 & 63 ); // fourth

buffer[x
* 4 ] = temp1;
buffer[x
* 4 + 1 ] = temp2;
buffer[x
* 4 + 2 ] = temp3;
buffer[x
* 4 + 3 ] = temp4;

}

for ( int x = 0 ; x < blockCount * 4 ; x ++ )
{
result[x]
= sixbit2char(buffer[x]);
}

// covert last "A"s to "=", based on paddingCount
switch (paddingCount)
{
case 0 :
break ;
case 1 :
result[blockCount
* 4 - 1 ] = ' = ' ;
break ;
case 2 :
result[blockCount
* 4 - 1 ] = ' = ' ;
result[blockCount
* 4 - 2 ] = ' = ' ;
break ;
default : break ;
}
return result;
}

private char sixbit2char( byte b)
{
char [] lookupTable = new char [ 64 ]
{
' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' , ' I ' , ' J ' , ' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' T ' , ' U ' , ' V ' , ' W ' , ' X ' , ' Y ' , ' Z ' ,
' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' , ' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' , ' w ' , ' x ' , ' y ' , ' z ' ,
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' , ' + ' , ' / '
};

if ((b >= 0 ) && (b <= 63 ))
{
return lookupTable[( int )b];
}
else
{
// should not happen;
return ' ' ;
}
}
}

posted on 2011-03-26 18:42 RockyLOMO 阅读(...) 评论(...) 编辑 收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值